pg_failover_slots

在Failover过程中保留复制槽

概览

扩展包名版本分类许可证语言
pg_failover_slots1.2.0ETLPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
9530pg_failover_slots-
相关扩展pglogical pglogical_origin pglogical_ticker pgactive repmgr bgw_replstatus pgl_ddl_deploy decoderbufs

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.2.01817161514pg_failover_slots-
RPMPIGSTY1.2.01817161514pg_failover_slots_$v-
DEBPIGSTY1.2.01817161514postgresql-$v-pg-failover-slots-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.2.0
d12.aarch64
PGDG 1.2.0
d13.x86_64
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
d13.aarch64
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
PGDG 1.2.0
u22.x86_64
PGDG 1.2.0
u22.aarch64
PGDG 1.2.0
u24.x86_64
PGDG 1.2.0
u24.aarch64
PGDG 1.2.0

构建

您可以使用 pig build 命令构建 pg_failover_slots 扩展的 RPM / DEB 包:

pig build pkg pg_failover_slots         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_failover_slots 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_failover_slots;          # 当前活跃 PG 版本安装
pig ext install -y pg_failover_slots -v 18  # PG 18
pig ext install -y pg_failover_slots -v 17  # PG 17
pig ext install -y pg_failover_slots -v 16  # PG 16
pig ext install -y pg_failover_slots -v 15  # PG 15
pig ext install -y pg_failover_slots -v 14  # PG 14
dnf install -y pg_failover_slots_18       # PG 18
dnf install -y pg_failover_slots_17       # PG 17
dnf install -y pg_failover_slots_16       # PG 16
dnf install -y pg_failover_slots_15       # PG 15
dnf install -y pg_failover_slots_14       # PG 14
apt install -y postgresql-18-pg-failover-slots   # PG 18
apt install -y postgresql-17-pg-failover-slots   # PG 17
apt install -y postgresql-16-pg-failover-slots   # PG 16
apt install -y postgresql-15-pg-failover-slots   # PG 15
apt install -y postgresql-14-pg-failover-slots   # PG 14

预加载配置

shared_preload_libraries = 'pg_failover_slots';

用法

pg_failover_slots: PG 故障转移槽扩展

通过将槽状态从主库同步到备库,使逻辑复制槽在物理故障转移后可用。

启用

在主库和备库的 postgresql.conf 中添加:

shared_preload_libraries = 'pg_failover_slots'

备库所需设置:

hot_standby_feedback = on
primary_slot_name = 'my_physical_slot'  -- 必须非空

配置选项

# 要同步的槽(默认:所有逻辑槽)
pg_failover_slots.synchronize_slot_names = 'name_like:%'

# 同步特定槽
pg_failover_slots.synchronize_slot_names = 'my_slot,plugin:test_decoding'

# 删除备库上主库中不存在的多余槽(默认:true)
pg_failover_slots.drop_extra_slots = true

# 连接到主库的连接字符串(默认:使用 primary_conninfo)
pg_failover_slots.primary_dsn = 'host=primary dbname=mydb'

# 确保物理备库在逻辑消费者之前接收数据
pg_failover_slots.standby_slot_names = 'standby_physical_slot'

# 需要确认的备库槽数(默认:-1 = 全部)
pg_failover_slots.standby_slots_min_confirmed = -1

# 同步间隔(毫秒,默认:60000)
pg_failover_slots.worker_nap_time = 60000

检查备库就绪状态

在故障转移前验证所有逻辑槽已同步:

-- 在备库上:所有槽应显示 active = false
SELECT slot_name, active FROM pg_replication_slots WHERE slot_type = 'logical';

--  slot_name        | active
-- ------------------+--------
--  regression_slot1 | f        -- 已同步,就绪
--  regression_slot2 | f        -- 已同步,就绪
--  regression_slot3 | t        -- 仍在同步,未就绪

当所有槽显示 active = false 时,备库可以安全进行故障转移。

关键行为

  • 从主库复制缺失的复制槽到备库
  • 移除备库上主库中不存在的多余槽
  • 定期同步槽位置
  • standby_slot_names 提供同步复制屏障以防止故障转移时数据丢失
  • 需要 PostgreSQL 11 或更高版本

最后修改 2026-03-14: update extension metadata (953cbd0)