Ajin Cherian:PostgreSQL中的故障转移槽同步

Ajin Cherian:PostgreSQL中的故障转移槽同步

💡 原文英文,约2200词,阅读约需8分钟。
📝

内容提要

PostgreSQL 17引入故障转移槽同步功能,使逻辑复制槽在备用服务器上保持就绪,减少故障切换后的数据重同步。PostgreSQL 19增强手动同步函数,内置重试和错误分类逻辑,并新增统计列跟踪跳过同步情况。这些改进由富士通团队贡献,简化了高可用逻辑复制环境的管理。

🔎

延伸解读

故障转移槽同步的适用场景

该功能主要面向使用逻辑复制的高可用环境,尤其是计划内切换或故障转移场景。在PostgreSQL 17之前,切换后订阅端需要重新创建订阅并可能全量拷贝数据,造成长时间停机。启用故障转移槽同步后,备用服务器持续同步主库的逻辑复制槽,切换后订阅端可直接连接新主库,无需重新同步。但需注意,该功能要求备用服务器配置primary_slot_name和hot_standby_feedback,且主库需设置synchronized_standby_slots以确保备用节点不落后于订阅端。

手动同步的改进与注意事项

PostgreSQL 19增强了pg_sync_replication_slots()函数,使其内置重试和错误分类逻辑,调用者无需自行实现轮询。但需注意,如果主库上的槽位长期不推进,该函数可能无限循环并持续记录等待日志,此时可通过Ctrl+C取消。此外,手动同步与自动同步进程不能同时运行,且同步过程中若备用服务器所需WAL已被回收,槽位将保持临时状态并重试,直到主库槽位推进到足够位置。

监控同步状态的新指标

PostgreSQL 19新增了pg_stat_replication_slots视图的slotsync_skip_count和slotsync_last_skip列,以及pg_replication_slots视图的slotsync_skip_reason列,用于跟踪槽位同步被跳过的情况。这些指标帮助管理员直接从SQL查询中了解同步是否正常,以及跳过原因(如槽位无效或WAL不可用),无需查看日志。但需注意,这些列仅在同步失败或跳过时非空,成功同步后为NULL。

Q&A

PostgreSQL 17中的故障转移槽同步功能是什么?

PostgreSQL 17引入了故障转移槽同步功能,允许逻辑复制槽在备用服务器上保持就绪,从而在故障切换后减少数据重同步的需要。该功能包括槽的failover选项、备用服务器的配置要求、手动和自动两种同步方法,以及pg_replication_slots视图中的新列。

如何在PostgreSQL中创建带有failover选项的逻辑复制槽?

可以通过两种方式设置:在创建订阅时使用WITH (failover = true)选项,例如CREATE SUBSCRIPTION sub1 CONNECTION '...' PUBLICATION pub1 WITH (failover = true);或者使用低层SQL API,例如SELECT pg_create_logical_replication_slot(slot_name => 'my_slot', plugin => 'test_decoding', failover => true)。

PostgreSQL 17中启用自动槽同步需要哪些配置?

需要在备用服务器的postgresql.conf中设置primary_conninfo、primary_slot_name、hot_standby_feedback = on,并设置sync_replication_slots = on。

PostgreSQL 19中pg_sync_replication_slots()函数有哪些改进?

PostgreSQL 19增强了pg_sync_replication_slots()函数,内置了重试和错误分类逻辑。它能够区分暂时无法同步的槽(由于缺少WAL)和需要更新的槽,并持续重试直到所有槽同步或确定为不可解决。调用者不再需要外部重试循环。

PostgreSQL 19中如何查看槽同步被跳过的统计信息?

PostgreSQL 19在pg_stat_replication_slots视图中新增了slotsync_skip_count和slotsync_last_skip列,用于记录跳过次数和最后跳过时间;pg_replication_slots视图新增了slotsync_skip_reason列,记录跳过原因。可以通过查询这些视图来监控。

在PostgreSQL 17之前,故障切换后逻辑复制槽会怎样?

在PostgreSQL 17之前,逻辑复制槽只存在于主服务器上。故障切换后,新主服务器没有订阅者的进度记录,导致订阅者需要重新创建订阅,通常触发全量数据复制,造成长时间停机。

故障转移槽同步中,synchronized_standby_slots参数的作用是什么?

synchronized_standby_slots参数在主服务器上配置,用于指定物理备用槽的名称。设置后,主服务器的walsender会确保所有列出的备用节点在发送给订阅者之前已接收并刷新更改,从而保证提升后的备用服务器不会落后于任何订阅者。

🏷️

标签

➡️

继续阅读