当我运行 AWS DMS CDC 任务时,为何源 PostgreSQL 数据库的存储消耗很高?

上次更新日期:2022 年 7 月 25 日

我正在运行 AWS Database Migration Service(AWS DMS)变更数据捕获(CDC)任务,并使用 PostgreSQL 数据库作为源。为何我在运行 AWS DMS CDC 任务时看到源数据库的存储消耗很高?

简短描述

当您使用 PostgreSQL 作为 CDC 任务的源时,AWS DMS 会使用逻辑复制槽(一项 PostgreSQL 功能)从源数据库获取更改。这些插槽代表一个操作流,这些操作的重放顺序与在 PostgreSQL 源数据库中执行的顺序相同。

根据设计,逻辑复制槽会重新训练 AWS DMS 所需的转换日志(WAL),即使它们未连接到 PostgreSQL 源。因此,只有在 AWS DMS 确认已从复制槽中获取所需的更改后,WAL 才会从 PostgreSQL 中删除。AWS DMS 通过推进复制槽的 restart_lsn 来确认其已进行了必要的更改。

PostgreSQL 源上高存储消耗的原因

由于 PostgreSQL 如何实现逻辑复制槽功能,在某些情况下,源数据库上可能会出现存储卷问题。

  • AWS DMS CDC 任务已长时间停止 – 这意味着 AWS DMS 未连接到源数据库,并且不会消耗源上复制槽的更改。这意味着 PostgreSQL 会持续保留 WAL,而不会删除 AWS DMS 尚未读取的旧 WAL。因此,源数据库上的存储最终会被填满。
  • 繁重的工作负载 – 在使用逻辑复制槽时,会导致过多生成 WAL 的繁重工作负载,也会导致 PostgreSQL 数据库上的存储空间已满。发生这种情况的原因是,如果复制槽需要日志序列号(LSN),则 PostgreSQL 仍会保留 WAL。
  • 空闲复制槽 – 即使 AWS DMS 从中复制更改的表、架构或数据库处于非活动状态,复制槽保留的 WAL 仍包含有关该表、架构或数据库的信息。这会导致源上的存储空间被填满,即使表上没有发生任何事务。

解决方法

检查复制槽是否导致 PostgreSQL 源上的高磁盘空间使用率

要检查复制槽是否是导致 PostgreSQL 数据库中磁盘空间使用率过高的原因,请运行为何我在 Amazon RDS for PostgreSQL 上收到“No space left on device”(设备上没有剩余空间),或“DiskFull”错误提示

注意:其中许多查询都可以在自我管理的 PostgreSQL 安装中使用。

开启 WAL 心跳功能

启用 AWS DMS WAL 心跳功能,可帮助您避免消耗 PostgreSQL 源数据库上的存储空间。此功能模仿虚拟事务,因此空闲的逻辑复制槽不会保留旧的 WAL 日志。此心跳可保持 restart_lsn 移动,并防止 PostgreSQL 源上的存储空间被填满。

要启用 WAL 心跳功能,请将此额外连接属性(ECA)添加到 PostgreSQL 源端点:

heartbeatEnable=Y;

(可选)指定以下额外的 ECA:

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

heartbeatFrequency 确定心跳事务在 PostgreSQL 源上运行的频率(以分钟为单位)。例如,如果您将 heartbeatFrequency 的值设置为 15,则 AWS DMS 每隔 15 分钟在源上运行一次心跳事务。

heartbeatSchema 指定 AWS DMS 在哪个数据库架构中创建数据库对象以生成心跳事务。

注意:仅当 AWS DMS 任务正在运行时,检测信号事务才会在源上运行。如果您的 AWS DMS 任务已停止,则 WAL 心跳功能将不起作用。

限制 PostgreSQL 中插槽的大小

您可以在 Postgre SQL 13 及更高版本的源数据库上应用 max_slot_wal_keep_size。这将设置复制槽可以保留的 WAL 的最大数量。

注意:max_slot_wal_keep_size 设置可以帮助您避免 PostgreSQL 源上的存储空间已满问题。但是,它也可能导致 WAL 在 AWS DMS CDC 任务可以从复制槽读取其更改之前从源中清除。因此,任务失败了。