一、功能简介
该功能适用于 CDC、数据同步、数据订阅、异构数据分发等场景。
数据链路如下:
主实例写入数据 -> 只读实例通过物理复制回放 WAL -> 下游订阅任务连接只读实例 -> 下游通过只读实例本地逻辑复制槽消费变更
二、适用场景
·降低主实例负载:下游订阅任务连接只读实例,减少主实例逻辑解码和网络发送压力。
·读写链路隔离:业务写入流量保留在主实例,数据订阅流量下沉到只读实例。
·多下游订阅:多个下游消费端可按需连接不同只读实例,降低单实例压力。
·CDC 数据分发:通过逻辑复制协议向下游系统分发变更数据。
三、前提条件
使用该功能前,请确认实例满足以下条件:
·PostgreSQL 大版本为16或以上。
·主实例已开启逻辑复制能力:
wal_level = logicalmax_replication_slots > 0max_wal_senders > 0
·已创建只读实例,且只读实例与主实例复制状态正常。
·下游订阅端可以访问只读实例连接地址。
·使用自定义逻辑解码插件时,实例需支持对应插件。
四、使用限制
·只读实例上创建的逻辑复制槽为本地复制槽。
·本地逻辑复制槽不参与主备切换。
·只读实例重建、释放或异常恢复后,本地逻辑复制槽可能丢失,需要重新创建。
·下游消费延迟过大时,可能导致只读实例保留较多 WAL,请关注复制槽位点和磁盘空间。
·只读实例复制延迟会影响下游订阅延迟。
五、使用方式一:手动创建本地逻辑复制槽
该方式适用于自定义逻辑解码或手动消费变更的场景。
六、连接只读实例
使用具备逻辑复制权限的账号连接只读实例。
七、创建本地逻辑复制槽
SET tencentdb_force_enable_failover_slot = off;SELECT pg_create_logical_replication_slot('my_slot', 'test_decoding');
其中:
·my_slot:逻辑复制槽名称,可按需替换。
·test_decoding:逻辑解码插件名称,可替换为业务使用的解码插件。
八、消费变更数据
SELECT *FROM pg_logical_slot_get_changes('my_slot', NULL, NULL);
九、删除不再使用的复制槽
SELECT pg_drop_replication_slot('my_slot');
十、使用方式二:下游订阅只读实例
该方式适用于标准 PostgreSQL 逻辑订阅场景。下游实例通过 CREATE SUBSCRIPTION 连接只读实例,并在只读实例上创建逻辑复制槽。
十一、在主实例创建发布
CREATE PUBLICATION my_pub FOR TABLE public.tab_rep;
其中:
·my_pub:发布名称,可按需替换。
·public.tab_rep:需要订阅的表,请替换为实际业务表。
十二、在下游实例创建同构表
下游实例需提前创建与发布表结构一致的目标表。
CREATE TABLE public.tab_rep ( id int PRIMARY KEY, data text);
十三、在下游实例创建订阅
连接串中的 host、port、user、password、dbname 请替换为只读实例的实际连接信息。
CREATE SUBSCRIPTION my_subCONNECTION 'host=<只读实例地址> port=<只读实例端口> user=<用户名> password=<密码> dbname=<数据库名> options=-c\\ tencentdb_force_enable_failover_slot=off'PUBLICATION my_pubWITH (copy_data = off);
其中:
·my_sub:订阅名称,可按需替换。
·my_pub:主实例上的发布名称。
·copy_data = off:创建订阅时不复制表中已有数据。如需初始化同步已有数据,可根据业务需要调整。
十四、查看只读实例复制槽
SELECT slot_name, plugin, slot_type, active, restart_lsn, confirmed_flush_lsnFROM pg_replication_slots;
十六、tencentdb_force_enable_failover_slot
tencentdb_force_enable_failover_slot 用于控制是否强制创建 failover slot。
在只读实例创建本地逻辑复制槽时,需要在当前会话中关闭该参数:
SET tencentdb_force_enable_failover_slot = off;
使用 CREATE SUBSCRIPTION 连接只读实例时,可在连接串中通过 options 参数设置:
options=-c\\ tencentdb_force_enable_failover_slot=off
十七、监控建议
建议关注以下指标:
·只读实例复制延迟:复制延迟越大,下游订阅延迟越大。
·复制槽确认位点:关注 confirmed_flush_lsn 是否持续推进。
·WAL 保留量:下游消费异常时,复制槽可能导致 WAL 堆积。
·磁盘空间使用率:WAL 堆积可能导致磁盘空间快速增长。
·订阅状态:定期检查下游订阅是否正常运行。
可通过以下 SQL 查看复制槽状态:
SELECT slot_name, plugin, slot_type, active, restart_lsn, confirmed_flush_lsn, wal_statusFROM pg_replication_slots;
十九、只读实例本地逻辑复制槽是否会随主备切换保留?
不会。只读实例本地逻辑复制槽只保存在当前只读实例上,不参与主备切换。只读实例重建或释放后,需要重新创建复制槽。
20、下游订阅连接的是主实例还是只读实例?
连接只读实例。订阅连接串中的 host 和 port 应填写只读实例连接地址和端口。
21、主实例是否仍需要开启 wal_level=logical?
需要。逻辑解码依赖主实例产生包含逻辑复制信息的 WAL,因此主实例必须开启 wal_level=logical。
22、只读实例复制延迟是否会影响下游?
会。下游只能消费已经在只读实例回放完成的 WAL,因此只读实例复制延迟会直接影响下游订阅延迟。
23、是否支持 CREATE SUBSCRIPTION 自动建槽?
支持。下游订阅连接只读实例时,可以在只读实例上创建 pgoutput 逻辑复制槽。连接串需包含:
options=-c\\ tencentdb_force_enable_failover_slot=off