22.4 部分同步模型

一句话

部分同步 = “系统终将进入一个消息延迟有界的时期(GST)”,算法只要 “在 GST 之后能推进” 就算可用;这正是 Paxos/Raft 能落地的理论前提——它们不承诺 “永远快”,只承诺 “网络好转后一定收敛”。

三种时序模型

模型 延迟 能否用超时判定 代表算法
同步 有已知上界 能,且安全 传统 2PC、同步复制
异步 无上界 不能(FLP) 无实用共识
部分同步 GST 之后有界 GST 后能安全判定 Paxos、Raft、ZAB

部分同步的关键是 “最终” 二字:GST 之前可以任意乱(丢包、延迟、分区),算法可能一直不决定;GST 之后超时才有意义,选举/提交才能推进。

实测:决定时刻完全取决于 GST

模拟一个 “只有同步期才能推进” 的共识过程(异步阶段消息可任意延迟):

GST(进入同步的步数) 达成决定的步数
0(一开始就同步) 0
50 50
150 150
250(超出观察窗口) 永不决定

这解释了现实中的现象:网络抖动期间选主反复失败、恢复后突然 “自己好了”——不是算法有 bug,而是 GST 之前它本来就不能决定。

可用性 ≈ P(GST 在可接受时间内到来) × 算法在 GST 后的收敛速度

代码:Raft 风格的超时随机化

// 选举超时随机化:避免多节点同时超时、选票分裂
timeout := base + rand.Int63n(jitter)   // 如 150ms + rand(150ms)
timer.Reset(timeout)

// 收到心跳则重置;超时则发起选举(任期 +1)
if timer.Fired() {
    state = Candidate
    term++
    votes := requestVotes(term)          // 需要多数派
    if votes >= quorum { state = Leader }
}

随机化的作用:把 “同时超时” 的概率降到可接受,让系统在 GST 之后更快产生唯一候选者。这也是 “部分同步 + 随机化” 的工程组合。

反模式

反模式 后果
假设 “网络永远同步” 抖动时误判、切主、脑裂
超时写死且不随机化 多节点同时选举,选票分裂,反复超时
把 “GST 之前的不可用” 当 bug 修 越修越复杂,本质是模型假设问题
不监控 “选举频率” GST 迟迟不来时,系统在 “假活” 状态
用 “增加超时” 解决所有抖动 故障发现变慢,RTO 上升
忽略 “GST 之后仍不收敛” 的 bug 真正的算法缺陷被网络问题掩盖

三条铁律

🔑 部分同步只承诺 “最终”;GST 之前不可用是正常现象。

🔑 超时 + 随机化 是把 “异步” 拉回 “可判定” 的工程手段。

🔑 监控 GST 是否到来:选举频率、提交延迟、消息积压。

自检

Q1 为什么 “部分同步” 比 “同步” 更现实?

▸ 答案:因为真实网络不可能永远有界:拥塞、GC 停顿、路由收敛、跨机房抖动都会让延迟暂时无界。同步模型只适合 “受控环境”(同机房、专线);互联网/跨区必须用部分同步,接受 “暂时不可用,最终恢复”。

Q2 GST 之前系统完全不能工作吗?

▸ 答案:不一定。只读、已提交数据的读取通常仍可用(不依赖新的共识决定);受影响的是 “需要新决定” 的操作(选主、写入提交、成员变更)。所以设计上要把 “读路径” 与 “决定路径” 分开。

Q3 随机化退避为什么能提高 “GST 后的收敛速度”?

▸ 答案:因为多个候选者同时超时会平分选票,谁也不够多数,只能再等一轮。随机化让超时错开,先醒来的候选者更容易一次拿到多数,减少 “空转轮次”。这也是 Raft 要求 “选举超时随机区间” 的原因。

Q4 实测中 GST=250 就 “永不决定”,现实中对应什么?

▸ 答案:对应 “网络在观察窗口内一直没有恢复”:分区持续存在、或抖动持续超过业务容忍时间。此时不是算法问题,而是 “需要人工介入/降级” 的信号;系统应当报警 “GST 未到来”,而不是继续空转。

Q5 部分同步模型下,“活性” 的准确表述是什么?

▸ 答案:“在 GST 之后,若多数派存活且消息最终送达,则算法在有限步内决定”。注意两个前提:多数派存活(否则无法达成共识)、消息最终送达(否则永远等不到)。缺一个,活性就不成立。

Q6 为什么 “调大超时” 不是万能的?

▸ 答案:因为它在提高 “容忍抖动” 的同时拉长了故障发现时间:节点真死了,也要等更久才切主,RTO 变长。正确做法是 “分层超时”(快速怀疑、慢速确认)与 “自适应超时”(按滑动窗口的延迟分布调整)。

Q7 部分同步与 “最终一致” 是同一回事吗?

▸ 答案:不是。部分同步是时序假设(延迟最终有界),用来让共识算法终止;最终一致是一致性模型(副本最终收敛)。前者是 “能不能决定”,后者是 “决定后多久一致”。两者可以组合:部分同步下用共识实现强一致,或用异步复制实现最终一致。

关联