Debezium 导致 Postgres 在 RDS 上 运行 磁盘 space 不足

Debezium causes Postgres to run out of disk space on RDS

我在 Amazon RDS 上有一个小型 Postgres 开发数据库 运行,我是 运行 K8s。据我所知,几乎没有任何交通。 我想启用更改捕获,我启用了 rds.logical_replication,启动了一个 Debezium 实例,主题出现在 Kafka 中,一切似乎都很好。

几个小时后,空闲磁盘 space 开始崩溃:

它开始以恒定速率消耗磁盘,并在 24 小时内耗尽所有可用的 20Gb。停止 Debezium 没有任何作用。我取回磁盘 space 的方法是:

select pg_drop_replication_slot('services_debezium')

和:

vacuum full

然后,几分钟后,如图所示,磁盘 space 被回收。

有什么建议吗?我很想看看实际上填满 space 的是什么,但我认为我做不到。 Debezium 方面似乎没有发生任何事情(没有不祥的日志),并且 Postgres 日志也没有显示任何特殊内容。或者是否有一些外部事件触发了这个开始?

问题出在复制槽上。它在 WAL 中标记一个位置,PostgreSQL 不会删除任何比该位置更新的 WAL 段。这些文件位于数据目录的 pg_wal 子目录中。

删除复制槽和 运行 CHECKPOINT 将删除文件并释放 space。

问题的原因一定是 Debrezium 配置错误:它不消耗更改并将复制槽向前移动。解决这个问题,你就好了。

好的,我想我明白了。 Amazon RDS 上还有另一个 'hidden' 数据库,它有变化,但变化不是我做的而且我看得见,所以 Debezium 也无法获取它们。如果更改我监控的数据库,它会显示该更改并在此过程中刷新缓冲区并回收 space。因此,缺乏变化是它填满的原因。不知道是否有一个很好的解决方案,但至少我可以使用它。

您需要定期在数据库中生成一些移动(例如对任何记录执行更新)。

Debezium 提供了一种称为心跳的功能来执行此类操作。

心跳可以在连接器中配置如下:

"heartbeat.interval.ms" : "300000", "heartbeat.action.query": "更新my_table SET date_column = now();"

您可以在官方文档中找到更多信息:

https://debezium.io/documentation/reference/connectors/postgresql.html#postgresql-wal-disk-space