逻辑复制槽故障转移(Failover Slot)

最近更新时间:2025-08-13 11:26:51

我的收藏

功能背景

当前,PostgreSQL 用户在使用逻辑复制的时候会创建 logical replication slot,该信息没有记录在 catalog 中,因此不会将其信息从主库同步到备库。如果发生 HA 切换,逻辑复制的 Slot 会丢失,导致逻辑复制断开,给使用带来不便。因此我们需要将逻辑复制槽进行故障转移。

功能介绍

Failover Slot 功能可以将 Slot 信息从主库同步到备库,如此可以在 HA 切换之后避免逻辑订阅断开,用户可以无感知地继续使用逻辑订阅。我们提供了一个插件 tencent_failover_slot,用户使用该插件可以完成 Failover Slot 的创建、转换为普通 Slot、查看 Failover Slot 信息、删除 Failover Slot 等操作。同时,我们新增了 GUC 参数方便客户针对异常的情况的设置。下面详细介绍。

创建 Failover Slot

为便于操作,在用户创建 slot 时,系统将默认创建 failover slot 。您可登录数据库,直接执行以下命令创建 failover slot。
-- 创建插件
create extension tencentdb_failover_slot;
-- 创建 failover slot
SELECT pg_create_logical_replication_slot('slotname', 'pluginname');
若您希望默认创建普通 slot ,请进入 控制台,单击实例 ID 后,进入参数设置页面,通过搜索框找到 tencentdb_force_enable_slot 参数,修改其值为 off,保存修改。

参数值修改为 off 后,需要依次执行以下命令创建 failover slot。若您此时使用创建 slot 语句,则会创建普通 slot。
-- 创建插件
create extension tencentdb_failover_slot;
-- 创建 failover slot
select pg_create_logical_failover_slot('slotname','pluginname');
注意:
Slot 是实例级别的,而插件是 database 级别的,如果切换了 database 需要调用插件里的函数,需要重新创建 tencentdb_failover_slot 插件。
pg_create_logical_failover_slot 函数包含两个参数:
slotname:Failover Slot 的名称。
pluginname:表示该逻辑复制槽所使用的逻辑解码插件的名称。推荐使用 pgoutput。

将 Failover Slot 转换为普通 Slot

select transform_slot_to_nonfailover('slotname');
说明:
slotname:slot 名字。
需要保证该 slot 当前是 inactive 的,即没有发布订阅正在使用该 slot。

查看 Failover Slot 信息

postgres=# select * from pg_failover_slots;
slot_name
-----------------
fs
fsg
(2 rows)
说明:
pg_failover_slots 视图包含一列,展示了当前所有的 Failover Slot 的名字,更多 Failover Slot 信息请查看 pg_replication_slots 视图。

删除 Failover Slot

select * from pg_drop_replication_slot('slotname');
说明:
slotname:slot 名称。

参数设置

新增参数 failover_slot_timeline_diverged_option,类型为 enum,方便用户针对异常情况的处理设置,设置路径为 云数据库 PostgreSQL 控制台 > 实例详情 > 参数设置。该参数默认值为 error,可选值 error、rewind。当极端情况下会发生备机日志接收速度比逻辑复制慢并发生 HA 的情况,此时如果设置 error,代表逻辑复制将暂停,发布端和订阅端都能收到报错,等待用户来处理。如果设置的为 rewind,那么逻辑复制将从切换时间点开始。

注意事项

当前只支持逻辑复制槽(logical replication slot)故障转移,不支持物理复制槽(physical slot)故障转移。