功能简介
只读实例本地逻辑复制槽支持在 PostgreSQL 只读实例上创建逻辑复制槽。下游数据订阅任务可以连接只读实例消费主实例产生的变更数据,从而将逻辑复制消费压力从主实例转移到只读实例,降低主实例负载。
该功能适用于 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;
常见问题
只读实例本地逻辑复制槽是否会随主备切换保留?
不会。只读实例本地逻辑复制槽只保存在当前只读实例上,不参与主备切换。只读实例重建或释放后,需要重新创建复制槽。
下游订阅连接的是主实例还是只读实例?
连接只读实例。订阅连接串中的 host 和 port 应填写只读实例连接地址和端口。
主实例是否仍需要开启 wal_level=logical?
需要。逻辑解码依赖主实例产生包含逻辑复制信息的 WAL,因此主实例必须开启 wal_level=logical。
只读实例复制延迟是否会影响下游?
会。下游只能消费已经在只读实例回放完成的 WAL,因此只读实例复制延迟会直接影响下游订阅延迟。
是否支持 CREATE SUBSCRIPTION 自动建槽?
支持。下游订阅连接只读实例时,可以在只读实例上创建 pgoutput 逻辑复制槽。连接串需包含:
options=-c\\ tencentdb_force_enable_failover_slot=off