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

最近更新时间:2024-05-10 09:50:52

我的收藏

功能背景

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

功能介绍

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

创建 Failover Slot

create extension tencentdb_failover_slot;--首先创建插件
select pg_create_logical_failover_slot('slotname','pluginname');--创建 Failover Slot
注意:
Slot 是实例级别的,而插件是 database 级别的,如果切换了 database 需要调用插件里的函数,需要重新创建 tencentdb_failover_slot 插件。
pg_create_logical_failover_slot 函数包含两个参数:
slotname:Failover Slot 的名称。
pluginname:表示 plugin 的名称。

将 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)故障转移。