RTO 利弊权衡

针对 RTO (Recovery Time Objective)进行利弊权衡,在故障恢复速度与误切风险之间找到最佳平衡点。

RTO(Recovery Time Objective,恢复时间目标)定义了在主库发生故障时,系统恢复写入能力所需的最长时间

对于核心交易系统这类可用性至关重要的场景,通常要求 RTO 尽可能短,例如一分钟内。

然而更短的 RTO 指标是有代价的,它会增加误切风险:网络抖动可能被误判为故障,导致不必要的故障切换。 因此对于跨机房/跨地域部署的场景,通常需要放宽 RTO 要求(例如 1-2 分钟),以降低误切风险。


利弊权衡

故障切换时的不可用时长上限由 pg_rto 参数控制。Pigsty 提供了四种预设的 RTO 模式: fastnormsafewide,分别针对不同的网络条件与部署场景进行了优化,默认使用 norm 模式(约 30 秒)。 您也可以使用秒数直接指定 RTO 上限,系统会自动映射到最接近的模式。

当主库发生故障时,整个恢复流程涉及多个阶段:Patroni 检测故障、DCS 锁过期、新主选举、执行 promote、HAProxy 感知新主。 减小 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

四种模式

Pigsty 提供四种 RTO 模式,以帮助用户在不同的网络条件下进行利弊权衡。

名称fastnormsafewide
适用场景同机柜同机房内(默认)同省跨机房跨地域/跨洲
网络条件< 1ms,极稳定1-5ms,正常10-50ms,跨机房100-200ms,公网
平均 RTO14s21s43s92s
最坏 RTO29s43s91s207s
误切风险较高中等较低极低
配置方法pg_rto: fastpg_rto: norm(默认)pg_rto: safepg_rto: wide
  • 主动检测:Patroni 存活,但是 PostgreSQL 崩溃
  • 被动检测
  • 手动触发

RTO 由多个阶段组成,不同故障场景的恢复时间计算方式不同。以下是三种典型故障场景的 RTO 计算结果:

场景FastNormSafeWide
最好 / 平均 / 最坏最好 / 平均 / 最坏最好 / 平均 / 最坏最好 / 平均 / 最坏
A. PG 崩溃4s / 8s / 19s6s / 15s / 33s8s / 42s / 91s17s / 90s / 207s
B. 节点宕机11s / 17s / 29s16s / 25s / 43s28s / 45s / 81s57s / 97s / 177s
C. 网络分区9s / 16s / 29s16s / 23s / 43s28s / 42s / 81s47s / 90s / 177s
综合4s / 14s / 29s6s / 21s / 43s8s / 43s / 91s17s / 92s / 207s

场景说明

  • A. PG 崩溃:Patroni 存活但 PostgreSQL 进程崩溃,Patroni 主动检测并尝试本地重启,失败后触发切换。
  • B. 节点宕机:整个节点或 Patroni 进程宕机,依赖 TTL 过期被动检测,是最常见的故障场景。
  • C. 网络分区:主库与 DCS 隔离,主库侧主动降级,集群侧等待 TTL 过期后选举新主。

快速估算公式

# 典型 RTO 估算(节点宕机场景)
RTO_typical ≈ ttl × 0.7 + inter × fall

# 最坏 RTO 上界
RTO_max ≈ ttl + loop_wait + inter × fall + 5s

实现原理

四种 RTO 模式的区别在于 PatroniHAProxy 的相关参数如何配置。

Patroni 参数

参数fastnormsafewide说明
ttl203060120Leader 锁生存时间(秒)
loop_wait551030HA 循环检查间隔(秒)
retry_timeout5102030DCS 操作重试超时(秒)
primary_start_timeout51560120主库重启等待时间(秒)
safety_margin551015Watchdog 安全边际(秒)
  • ttl:Leader 锁的生存时间。主库必须在此时间内续租,否则锁过期,触发新选举。此值直接影响故障检测速度。
  • loop_wait:Patroni 主循环间隔。每个循环执行一次健康检查与状态同步,影响故障发现的及时性。
  • retry_timeout:DCS(Etcd)操作的重试超时。网络短暂中断不超过此时间,主库不会主动降级。
  • primary_start_timeout:主库进程崩溃后,Patroni 尝试本地重启的等待时间。超时后才会触发故障切换。

HAProxy 参数

参数fastnormsafewide说明
inter1s2s3s5s正常状态检查间隔
fastinter500ms1s1s2s状态变化期检查间隔
downinter1s2s2s5sDOWN 状态检查间隔
rise2223标记 UP 所需连续成功次数
fall2335标记 DOWN 所需连续失败次数
  • inter × fall = HAProxy 感知故障的延迟(T_haproxy_down)
  • inter × rise = HAProxy 感知恢复的延迟(T_haproxy_up)

通常情况下,您只需要将 pg_rto 参数设置为模式名称即可,Pigsty 会自动配置相应的 Patroni 与 HAProxy 参数。 当然,您也可以直接按需 配置 这些参数。


配置建议

fast 模式 适用于对 RTO 要求极高的场景,但需要确保网络质量足够好(延迟 < 1ms,极低丢包率)。 建议仅在同机柜或同交换机部署时使用,并在生产环境充分测试后再启用。

norm 模式默认)是 Pigsty 默认使用的配置,对于绝大多数同机房部署的业务来说已经足够使用。 平均 21 秒的恢复时间在可接受范围内,同时提供了合理的容错窗口,避免网络抖动导致的误切。

safe 模式 适用于同城跨机房部署,网络延迟较高或存在偶发抖动的场景。 更长的容错窗口可以有效避免网络抖动导致的误切,是跨机房容灾的推荐配置。

wide 模式 适用于跨地域甚至跨大洲部署,网络延迟高且可能存在公网级别的丢包率。 这种场景下,稳定性比恢复速度更重要,因此使用极宽的容错窗口来确保极低的误切率。

场景推荐模式理由
开发/测试环境fast快速反馈,误切影响小
同机房生产环境norm默认选择,平衡性好
同城双活/跨机房容灾safe容忍网络抖动,降低误切
异地容灾/跨国部署wide适应高延迟公网,极低误切率
网络质量不确定safe保守选择,避免误切

兼容性

为了向后兼容,pg_rto 参数也支持直接指定秒数,系统会自动映射到最接近的模式:

pg_rto 值映射模式
< 30fast
30-44norm
45-89safe
≥ 90wide
# 以下两种写法等效
pg_rto: norm
pg_rto: 30

建议使用模式名称而非秒数,更清晰地表达配置意图。