PostgreSQL从库收到提升信号时的WAL回放与提升时机问题
PostgreSQL 11.4 流复制备库提升时机说明
核心结论
针对你描述的测试场景(多份待回放WAL已落盘备库、通过创建pg_failover_trigger文件触发提升),备库的提升逻辑属于你列的第一种情况:
先回放完成触发信号时点所有已存在于本地的待回放WAL文件后再执行提升,不会收到信号立刻中断回放造成已落盘WAL的数据丢失。
具体执行逻辑
- 备库负责WAL回放的startup进程检测到提升触发信号后,不会立刻退出恢复模式,会先进入恢复收尾阶段:
- 若当前处于
pg_wal_replay_pause()触发的回放暂停状态,会自动退出暂停状态 - 逐段重放本地
pg_wal目录下所有连续、可读的待回放WAL记录,直到本地没有可连续解析回放的WAL为止 - 完成上述回放后,才会执行后续提升动作:更新控制文件生成新的时间线、切换数据库为可读写模式、开放用户连接
- 若当前处于
- 触发提升时如果主库仍在持续写入并发送WAL:
- 备库负责从主库拉取WAL的walreceiver进程会在提升流程启动后立刻终止
- 后续主库推送过来的WAL流会被直接拒绝接收,不会等待这部分未传输完成的WAL落盘回放,直接在本地已有WAL回放完成后结束提升流程
注意事项
该逻辑下不会丢失的事务范围,仅限触发提升信号的时点,已经完整写入备库本地pg_wal目录的连续WAL对应的已提交事务;触发信号时点还在网络传输中、未完整落盘备库的WAL对应的事务,不会被回放,属于流复制切换的正常数据差异,不属于异常丢失。
内容的提问来源于stack exchange,提问作者krithikaGopalakrishnan
相关产品推荐
相关产品推荐

