故障切换模型

详细分析三种经典故障检测/恢复路径下,最差,最优,平均 RTO 的计算逻辑与结果

Patroni 故障按故障对象分类可以分为以下 10 类,按照检测路径不同,可以进一步归纳为五类,在本节内详细展开。

#故障场景描述最终走哪条路径
1PG 进程崩溃crash、OOM killed主动检测
2PG 拒绝连接max_connections主动检测
3PG 假活进程在但无响应主动检测 (检测超时)
4Patroni 进程崩溃kill -9、OOM被动检测
5Patroni 假活进程在但卡住Watchdog
6节点宕机断电、硬件故障被动检测
7节点假活IO hang、CPU 饥饿Watchdog
8主库 ↔ DCS 网络中断防火墙、交换机故障网络分区
9存储故障磁盘坏、磁盘满、挂载失败主动检测Watchdog
10手动切换Switchover/Failover手动触发

但是在 RTO 计算上,最终所有故障都会收敛到两条路径上,本节深入探讨了这两种情况下的 RTO 上下限与均值。

flowchart LR
    A([主库故障]) --> B{Patroni<br/>检测到?}

    B -->|PG崩溃| C[尝试本地重启]
    B -->|节点宕机| D[等待 TTL 过期]

    C -->|成功| E([本地恢复])
    C -->|失败/超时| F[释放 Leader 锁]

    D --> F
    F --> G[从库竞选]
    G --> H[执行 Promote]
    H --> I[HAProxy 感知]
    I --> J([服务恢复])

    style A fill:#dc3545,stroke:#b02a37,color:#fff
    style E fill:#198754,stroke:#146c43,color:#fff
    style J fill:#198754,stroke:#146c43,color:#fff

被动故障切换

节点宕机,导致领导者租约过期触发集群领导竞选的故障路径

主动故障检测

PostgreSQL 主库进程崩溃,Patroni 存活并尝试重启,超时后触发故障切换的路径


最后修改 2026-01-14: add concept docs (40790e6)