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 部分同步与 “最终一致” 是同一回事吗?
▸ 答案:不是。部分同步是时序假设(延迟最终有界),用来让共识算法终止;最终一致是一致性模型(副本最终收敛)。前者是 “能不能决定”,后者是 “决定后多久一致”。两者可以组合:部分同步下用共识实现强一致,或用异步复制实现最终一致。
关联
- 前置:22.2 FLP 不可能性、22.3 故障检测器与 φ 值
- 并列:22.1 故障类型 (崩溃 / 遗漏 / 时序 / 拜占庭)
- 下游:22.5 理论边界对工程的含义、21.6 Raft:日志复制