20 狡兔三窟:高可用拓扑与容灾目标
三台 PostgreSQL 都在运行,不等于“高可用”;一次 patronictl list
显示一个 Leader,也不等于“不会脑裂”;计划切换没有丢行,更不等于
“自动故障转移零 RPO”。
本章把高可用收敛为一个可以审计的命题:
在明确的失败模型、提交语义与权限边界内,系统能否维持一条被授权的 可写历史,并在规定时间内把客户端带回可判断的服务状态?
我们先从 failure model、RPO/RTO 和 degradation target 出发,再进入 PostgreSQL 的 WAL、LSN、timeline、复制槽与同步提交;随后解释 Patroni、 DCS、租约与 fencing 如何组合;最后在第 19 章保留的 Pigsty v4.5.0 四机沙箱上完成一次有客户端证据的计划切换。
本章的正式结论很克制:
本章目标
读完并完成实验后,你应当能够:
- 先列故障域和共同依赖,再谈节点数与“几副本”;
- 正确区分 RPO、RTO、降级目标、维护切换时间与客户端恢复时间;
- 从
pg_stat_replication、pg_stat_wal_receiver、LSN 与复制槽解释 物理流复制; - 区分 system identifier、timeline、checkpoint timeline 与当前 WAL timeline;
- 解释异步、
remote_write、on、remote_apply以及FIRST/ANY同步集合的保证和代价; - 说明 Patroni leader lock、DCS、TTL、loop、candidate eligibility、 watchdog 与 fencing 分别解决什么问题;
- 区分 planned switchover、automatic/manual failover、rewind 与 rebuild;
- 把服务端点、会话断开、结果未知与幂等 token 放在同一个客户端合同中;
- 用 Pigsty 交付的角色、服务与原生 PostgreSQL 证据交叉验证;
- 设计一场有 preflight、mutation guard、证据、反例和复位的 HA 演练;
- 知道一次成功实验不能推出哪些生产结论。
前置与后续
前置:
- 第 18 章 PostgreSQL 数据平台与替代边界 定义 service objective 与 capability placement;
- 第 19 章 部署基线 保留四台独立 VM、两个 PostgreSQL service unit 以及 secret-safe inventory;
- 读者已掌握 Linux、SQL、事务与基本网络知识;
- 不要求预先掌握 Patroni、etcd 或 Pigsty HA internals。
后续:
- 第 21 章 备份体系与恢复演练 处理 base backup、WAL archive、 PITR 与 restore proof;
- 第 22 章 服务接入、连接池与路由 深入 routing、 pooling、session 与 client retry contract;
- 第 23 章处理 transport、identity 与 secret;
- 第 33 章才安排另行授权的 unplanned failure/incident exercise。
学习路径
这条路径故意不从“如何敲 failover 命令”开始。命令只是状态迁移的一个 触发器;如果故障、authority、数据风险与客户端完成条件没有先定义,操作 越快,越可能把错误历史更快地交给用户。
正式实验拓扑
角色迁移:
实验通过 Pigsty primary service 写入唯一 token,而不是直接连接“我们以为 是主库”的节点。正式观测:
6.007 s 是一次健康计划切换下的采样写入间隙。它包含约 0.2 秒的
probe resolution,不包含故障检测,不是生产 RTO 分布,也不是 SLO。
十项例外
沿用第 19 章六项:
本章新增四项:
例外不是“以后再看”的备注,而是直接阻止某类推论的逻辑条件。
本章目录
20.1 从失败模型设计高可用
20.2 物理流复制
20.3 同步策略与提交语义
20.4 选主、DCS 与防脑裂
20.5 切换、故障转移与重加入
20.6 交付并观察 HA 集群
20.7 实战:一次有证据的计划切换
实验入口
lab-contract.md:动作、风险和解释边界;requirements.json:可执行验收合同;failure-model.json:九类场景;ha-adr.md:为什么只接受 planned switchover;task.sh:安全动作入口;ha-facts.sql:PostgreSQL 原生证据;drill-run.json:无 secret 的正式结果;negative-cases.json:十个必须拒绝的反例;topology.mmd:实验数据与控制路径。
安全语义:
普通 all 只验证已有证据。它不会为了“方便”重跑切换。
本章最重要的判断
如果只记住一句话:
高可用的目标不是“尽快出现一个新主库”,而是在故障与不确定性中,只让 一条可解释、可追溯、被授权的历史继续接受写入。
权威参考
- PostgreSQL 18:Log-Shipping Standby Servers
- PostgreSQL 18:Replication Settings
- PostgreSQL 18:
pg_rewind - Patroni:Replication modes
- Patroni:Watchdog support
- Patroni:DCS failsafe mode
- Pigsty:High Availability
- Pigsty:Service/Access
上一章:开天辟地:环境规划与部署基线 · 返回下卷导读 · 下一章:未雨绸缪:备份体系与恢复演练 · 查看全书目录 · 查看索引中心