Skip to content

复制与高可用

PostgreSQL 内核提供 WAL 复制、恢复、提升和逻辑复制能力,但不会独立完成全部高可用编排。故障检测、领导者选举、防止双主、连接入口切换以及旧主隔离,通常由外部组件和运维流程承担。


物理复制

物理复制传输 WAL,并在 Standby 上按块级变化重放。主备需要保持系统版本和底层物理格式兼容,备库是整个 database cluster 的副本,不能原生只复制其中几张表。

方式特点边界
WAL 文件归档按完成的 WAL 段传输延迟受 WAL 段切换影响
Streaming ReplicationWAL 生成后持续流式传输默认异步,网络中断时需要保留足够 WAL
Hot Standby恢复期间允许只读查询查询可能与 WAL 重放冲突,读延迟不固定
Cascading ReplicationStandby 向下游发送 WAL降低主库连接压力,但增加链路与延迟层次

Replication Slot 能防止主库过早删除备库仍需要的 WAL。备库永久离线或 Slot 消费停滞时,WAL 会持续占用主库磁盘,因此必须监控 Slot 的消费位置和保留量。


同步级别与事务确认

流复制默认异步。同步复制可以要求事务提交等待指定 Standby 达到某个阶段,降低主库故障时的数据丢失,但把网络与备库状态带入主事务延迟。

等待层次含义主要权衡
本地 WAL 持久化主库确认本地 WAL主库永久损坏时可能丢失尚未复制事务
Remote Write备库操作系统已接收并写入不一定已经持久化或重放
Remote Flush备库已持久化 WAL数据保护较强,提交受网络和备库磁盘影响
Remote Apply备库已重放,查询可见一致读取更直接,提交延迟最高

RPO 不能仅凭“同步复制”判断,还取决于同步 Standby 的数量、确认级别、故障时是否允许降级,以及切换节点是否拥有最新时间线。


逻辑复制

逻辑复制对 WAL 进行逻辑解码,以 Publication 和 Subscription 复制选定表的变化。它适合选择性复制、跨大版本迁移和数据分发,但不是物理备库的直接替代。

维度物理复制逻辑复制
粒度整个 database cluster表级发布
数据形态块级 WAL 重放逻辑行变化
版本约束物理格式需兼容更适合跨版本迁移,仍需验证兼容性
DDL物理变化随 WAL 重放通常需要单独同步 Schema 变更
冲突Standby 不接受普通写入Subscriber 的额外写入可能产生冲突
用途高可用、容灾、只读副本数据分发、升级迁移、局部复制

逻辑复制依赖 Replica Identity 定位 UPDATE 和 DELETE 的目标行。序列、Large Object、DDL 和未发布对象等内容需要按实际版本与方案单独处理。


故障切换闭环

  1. 判断 Primary 是否真的不可服务,避免网络分区误判。
  2. 选择 WAL 最完整、满足一致性要求的 Standby。
  3. 隔离旧 Primary,防止两个节点同时接受写入。
  4. Promote 新 Primary,并切换连接入口。
  5. 验证 Timeline、复制槽、应用写入和数据一致性。
  6. pg_rewind 或重新做 Base Backup 将旧主恢复为 Standby。

PostgreSQL 自身不提供完整的故障检测和通知系统。仅搭建 Streaming Replication 不等于已经具备自动高可用;管理器、代理、共识存储和 Fencing 需要形成经过演练的整体。

参考资料