Debezium 导致 Postgres 耗尽 RDS 上的磁盘空间

Posted

技术标签:

【中文标题】Debezium 导致 Postgres 耗尽 RDS 上的磁盘空间【英文标题】:Debezium causes Postgres to run out of disk space on RDS 【发布时间】:2021-04-01 04:35:00 【问题描述】:

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

几个小时后,可用磁盘空间开始减少:

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

select pg_drop_replication_slot('services_debezium')

和:

vacuum full

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

有什么建议吗?我很想看看到底是什么东西填满了这个空间,但我认为我做不到。 Debezium 方面似乎没有发生任何事情(没有不祥的日志),而且 Postgres 日志也没有显示任何特别之处。还是有一些外部事件触发了这个事件的开始?

【问题讨论】:

您终于找到原因/解决方法了吗? 据我了解,实例上有一个“不可见”的 AWS 数据库,它共享 WAL 并有相当多的活动。因此,如果更改捕获没有进行,无论是因为您的数据库上没有活动还是其他原因,它都会很快占用磁盘空间。当您的数据库活动很少时,设置心跳“heartbeat.interval.ms”会有所帮助。 【参考方案1】:

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

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

心跳可以在connector中配置如下:

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

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

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

【讨论】:

【参考方案2】:

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

删除复制槽并运行CHECKPOINT 将删除文件和可用空间。

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

【讨论】:

是的,但不是。奇怪的是,Debezium 运行良好:更改被消耗,延迟低,两边都没有错误。我很想看看文件系统上实际有什么,但是,AFAICT,亚马逊不允许这样做。而且这条线的笔直似乎表明它似乎与交通无关。我在日志中看到的唯一“可疑”内容是:“参数 max_wal_senders 设置为与复制不兼容的值。它已从 10 调整为 15。” 你不必相信我 :^)【参考方案3】:

好吧,我想我明白了。 Amazon RDS 上还有另一个“隐藏”数据库,它有变化,但是我没有做的变化我可以看到,所以 Debezium 也无法获取它们。如果更改我监控的数据库,它将显示该更改并在此过程中刷新缓冲区并回收该空间。所以非常缺乏变化是它填满的原因。不知道是否有一个很好的解决方案,但至少我可以使用它。

【讨论】:

以上是关于Debezium 导致 Postgres 耗尽 RDS 上的磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 使用 debezium 创建复制槽失败

debezium 是不是支持捕获 postgres 模式更改事件?

debezium postgres 找不到`io/debezium/util/IoUtil`

Kafka Connect Debezium postgres

Kafka Connect:使用 debezium 从 Postgres 流式传输更改到主题

需要 Debezium 连接器中用于 postgres 插入事件的主键信息