使用Replication Slot创建数据订阅
功能介绍
PostgreSQL原生支持使用复制槽(Replication Slot)开启数据订阅(Change Data Capture,简称CDC)。Replication Slot是用于逻辑复制的核心机制,主要作用如下:
- 确保主库的WAL日志(预写日志)不会被过早清理,直到从库或订阅者消费完日志。
- 记录订阅者的消费位置(LSN),避免数据丢失或重复消费。
- 支持通过逻辑解码插件(例如test_decoding和wal2json)将WAL日志解析为可读的变更数据(例如INSERT、UPDATE、DELETE操作),实现数据订阅。
本文介绍在RDS for PostgreSQL实例上开启数据订阅的配置方法。
前提条件
- 参考自定义购买ECS,已购买ECS。ECS选择与RDS for PostgreSQL实例相同的区域、VPC和安全组,便于RDS for PostgreSQL和ECS网络互通。
- 参考购买并通过PostgreSQL客户端连接RDS for PostgreSQL实例,已购买RDS for PostgreSQL实例并安装PostgreSQL客户端。
- 参考通过内网连接RDS for PostgreSQL实例(Linux方式),已通过ECS连接到RDS for PostgreSQL实例。
注意事项
- 仅支持在主实例上开启数据订阅并消费,不支持只读实例。
- RDS for PostgreSQL支持Logical Replication Slot Failover,主备切换操作不会影响数据订阅。更多介绍,请参见逻辑订阅故障转移(Failover Slot)。
- 开启数据订阅前需要修改RDS for PostgreSQL实例参数,并重启RDS for PostgreSQL实例。请在业务低峰期进行修改,避免对业务造成影响。
开启数据订阅
关闭数据订阅
开启了数据订阅的RDS for PostgreSQL实例,需要使用更多的WAL日志存储空间,当不再需要数据订阅时,需通过以下步骤彻底关闭,避免复制槽持续占用WAL日志空间:
- 使用root账号连接RDS for PostgreSQL实例。
psql -h <实例连接地址> -p 5432 -U root -d testdb
- (可选)确认复制槽存在。
SELECT slot_name FROM pg_replication_slots WHERE slot_name = 'cdc_replication_slot';
- 删除复制槽。该操作不可逆,请谨慎操作。
SELECT pg_drop_replication_slot('cdc_replication_slot');
- 验证数据订阅已关闭。
SELECT slot_name FROM pg_replication_slots;
如果查询结果中没有cdc_replication_slot,表示已关闭。