PostgreSQL 19 preview - 物理standby逻辑复制槽状态同步异常监控
本期播客
PostgreSQL 19 preview - 物理standby逻辑复制槽状态同步异常监控
PostgreSQL 19 新增物理 standby 上 pg_replication_slots 视图关于逻辑复制槽完备性的状态监控字段: slotsync_skip_reason , 用于记录上一次槽同步(slot synchronization)被跳过的原因。
请注意这个视图只适合物理standby, 在 primary 上无意义.
如果物理 standby 要提升为主, 逻辑复制槽是否安全, 在提升为主之后可被下游继续订阅?
https://github.com/postgres/postgres/commit/e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7
Add slotsync_skip_reason column to pg_replication_slots view.
Introduce a new column, slotsync_skip_reason, in the pg_replication_slots
view. This column records the reason why the last slot synchronization was
skipped. It is primarily relevant for logical replication slots on standby
servers where the 'synced' field is true. The value is NULL when
synchronization succeeds.
Author: Shlok Kyal <[email protected]>
Reviewed-by: shveta malik <[email protected]>
Reviewed-by: Hayato Kuroda <[email protected]>
Reviewed-by: Ashutosh Sharma <[email protected]>
Reviewed-by: Hou Zhijie <[email protected]>
Reviewed-by: Amit Kapila <[email protected]>
Discussion: https://postgr.es/m/CAE9k0PkhfKrTEAsGz4DjOhEj1nQ+hbQVfvWUxNacD38ibW3a1g@mail.gmail.com
详细解读
这个补丁(commit e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7)的主要目的是:
在 pg_replication_slots 视图中添加 slotsync_skip_reason 列。
以下是该补丁的详细解读:
1. 提交信息概览
提交标题 (Commit Message): Add slotsync_skip_reason column to pg_replication_slots view. (在 pg_replication_slots视图中添加slotsync_skip_reason列。)主要目的: 引入一个新列 slotsync_skip_reason到pg_replication_slots视图中。这个列用于记录上一次槽同步(slot synchronization)被跳过的原因。相关场景: 该列主要与备用服务器(standby servers)上的逻辑复制槽(logical replication slots) 相关,特别是那些 synced字段为true的槽。返回值: 如果槽同步成功,该列的值为 NULL。
2. 关键代码变动
该补丁涉及了系统视图定义、复制槽结构体以及相关函数的修改,以支持新的字段:
src/backend/replication/slot.h:在 ReplicationSlot结构体中添加了SlotSyncSkipReason slotsync_skip_reason;字段,用于存储跳过同步的原因(非持久化)。src/backend/replication/slot.c:在创建新的复制槽时,初始化 slotsync_skip_reason为SS_SKIP_NONE。src/backend/replication/logical/slotsync.c:新增了 update_slotsync_skip_stats静态函数,用于更新复制槽的跳过同步统计信息(包括新的跳过原因)。在进行槽同步检查时,如果确定跳过同步,则会调用新函数来记录具体原因。 src/backend/replication/slotfuncs.c:定义了 SlotSyncSkipReason枚举值到人类可读名称的映射,例如:"wal_not_flushed"、"wal_or_rows_removed"、"no_consistent_snapshot"、"slot_invalidated"。修改了 pg_get_replication_slots函数的列数宏 (PG_GET_REPLICATION_SLOTS_COLS),并更新了返回的列集,加入了slotsync_skip_reason。src/backend/catalog/system_views.sql:修改了 pg_replication_slots视图的定义,加入了L.slotsync_skip_reason列。
3. 文档变动 (doc/src/sgml/system-views.sgml)
文档更新详细描述了 pg_replication_slots 视图中新列的含义和可能的返回值:
列名: slotsync_skip_reason数据类型: text描述: 记录上一次槽同步跳过的原因。它主要与备用服务器上 synced字段为true的逻辑槽相关。如果同步成功,该值为NULL。可能的跳过原因 (Possible values):
wal_or_rows_removed:所需的 WAL 或目录行已被删除,或有被删除的风险。wal_not_flushed:所需的 WAL 尚未被刷新(flushed)。no_consistent_snapshot:无法获取一致的快照。slot_invalidated:复制槽已被置为无效。
总之,这个补丁增强了 PostgreSQL 的复制监控能力,使得管理员可以更容易地诊断和理解备用服务器上逻辑复制槽同步被跳过的具体原因。
槽同步是 PostgreSQL 逻辑复制的一个机制,主要发生在备用服务器(Standby Server) 上。
槽同步(Slot Synchronization)是什么情况下发生的?
槽同步是一种将逻辑复制槽的状态从备用服务器同步到其上游主服务器的机制。
发生条件和背景:
复制槽类型: 必须是逻辑复制槽 (Logical Replication Slot) 。物理复制槽没有这个同步需求。 服务器角色: 必须发生在备用服务器(Standby) 上。
逻辑复制槽通常是在主服务器上创建的。当主服务器将其状态写入 WAL 并流式传输给备用服务器时,备用服务器会读取这个信息,并在本地也维护一个该复制槽的影子或占位符。 槽同步的必要性: 如果备用服务器提升为新的主服务器,它需要拥有所有逻辑复制槽的最新且正确的信息(特别是其 restart_lsn),以确保提升后逻辑复制可以立即正确地工作,并且不会丢失数据。这个过程就是槽同步。
创建或激活时: 备用服务器在接收到关于新槽的信息后,可能会尝试同步。 周期性检查: 在备用服务器运行恢复进程时,会周期性地检查是否需要同步逻辑槽的状态。
什么样的状态才是正常的?
正常的槽同步主要体现在结果上,以及新引入的 slotsync_skip_reason 列的状态上。
① 正常(成功)的状态:
在 pg_replication_slots 视图中,一个健康的逻辑复制槽应该满足以下条件:
synced字段为true:这是最重要的标志。它表示备用服务器已经成功地将这个逻辑槽的状态(主要是它需要保护的 WAL 位置) 同步到了磁盘 上,确保了其持久性。 一旦槽被标记为 synced=true,即使备用服务器崩溃并重启,槽的状态也会被正确恢复。slotsync_skip_reason字段为NULL:根据您解读的补丁,成功的同步或正常的未跳过状态,这个新列的值应该是 NULL。
② 正常的(可接受的)跳过:
在某些情况下,槽同步可能会被跳过,但这不一定意味着错误,只是说明当前条件不满足同步,或者不需要同步。
如果 slotsync_skip_reason出现一个值(例如wal_not_flushed),这表示同步被跳过了。如果这个状态是暂时的(例如等待 WAL 刷新),在下一个周期可能会恢复正常。
如果 slotsync_skip_reason 持续出现非 NULL 的值,尤其像 wal_or_rows_removed 或 slot_invalidated 这样的原因,则表明存在问题,需要管理员介入检查。
简而言之:槽同步是为了备用服务器能“随时promote”而做的准备工作。一个正常的同步结果,就是您在
pg_replication_slots视图中看到synced为true,且slotsync_skip_reason为NULL。