这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 高可用不只是“有一个备库”,还包括故障检测、切换决策、数据一致性、连接路由、演练和回切。
23.1 常见拓扑
一主一备:
App -> LB / HA entry
|
Primary
|
Standby
一主两备:
Primary -> Sync Standby
-> Async Standby
同城双中心:
DC A: Primary + Witness
DC B: Sync/Async Standby
异地灾备:
同城主集群 -> 异地异步备库
23.2 RPO 与 RTO
| 指标 | 含义 |
|---|---|
| RPO | 最多可丢多少数据 |
| RTO | 最多可接受多久不可用 |
同步复制降低 RPO,但增加延迟;异步复制性能更好,但故障可能丢最近 WAL。
23.3 故障检测
应检测:
- 进程存活;
- 端口健康;
- 只读或读写状态;
- 复制延迟;
- WAL 保留;
- 磁盘空间;
- 事务成功率。
不要只 ping 端口。备库端口可用不代表可提升。
23.4 切换决策
切换前确认:
1. 主库是否真故障
2. 是否发生脑裂
3. 备库 LSN 是否追平
4. 复制模式是什么
5. 应用是否已停止写旧主
6. 新主是否可读写
防脑裂方式包括仲裁节点、STONITH、网络隔离策略和分布式锁,具体取决于 HA 方案。
23.5 连接路由
应用应通过稳定入口访问:
| 方式 | 特点 |
|---|---|
| VIP | 网络层切换,配置简单 |
| 负载均衡 | 探活和读写分离 |
| DNS | 传播延迟 |
| 代理 | 灵活,但新增组件 |
读写分离时,写请求必须到主库;强一致读也应到主库或等待回放。
23.6 HA 工具
常见方案:
| 工具 | 特点 |
|---|---|
| Patroni + etcd | 常用分布式 HA |
| repmgr | 复制管理和切换 |
| pg_auto_failover | 自动故障转移 |
| 云托管服务 | 平台托管 HA |
选择标准:
- 故障检测策略;
- 一致性保证;
- 恢复流程;
- 运维复杂度;
- 与监控集成;
- 团队掌握程度。
23.7 备库冲突
查询可能取消回放:
ERROR: canceling statement due to conflict with recovery
相关参数:
SHOW hot_standby_feedback;
SHOW max_standby_streaming_delay;
hot_standby_feedback 可减少取消,但会让主库保留旧版本,增加膨胀风险。
23.8 演练
定期演练:
- kill 主库进程;
- 网络分区;
- 同步备库宕机;
- 复制断开;
- WAL 归档失败;
- 应用连接切换;
- 旧主重建;
- 回切。
本章小结
高可用架构要明确 RPO/RTO、复制模式、仲裁机制、路由策略和故障恢复。自动切换必须防脑裂,且所有方案都要经过真实演练。
思考题
- 同步复制如何影响写入延迟?
- RPO=0 是否等价于不会宕机?
- 如何防止脑裂?
- 备库查询冲突如何处理?
- HA 演练应覆盖哪些场景?