云数据库 PostgreSQL 只读实例使用逻辑复制槽

只读实例本地逻辑复制槽支持在 PostgreSQL 只读实例上创建逻辑复制槽。下游数据订阅任务可以连接只读实例消费主实例产生的变更数据,从而将逻辑复制消费压力从主实例转移到只读实例,降低主实例负载。

相关产品
云数据库 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;

十九、只读实例本地逻辑复制槽是否会随主备切换保留?

不会。只读实例本地逻辑复制槽只保存在当前只读实例上,不参与主备切换。只读实例重建或释放后,需要重新创建复制槽。

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

赞 (0)
上一篇 4天前
下一篇 4天前