目录标题
Raft 共识算法在 AppendEntries
RPC 过程中只要求“多数派”节点返回 Ack(确认)而不是全部节点的设计,是出于对 可用性、一致性与容错能力之间权衡的考虑。这是 Raft 实现强一致性和高可用性的核心机制之一。
🌟 总结回答:
Raft 使用“多数派确认”机制,是为了在不依赖所有节点都存活的前提下,实现线性一致性(Linearizability)。只要有超过一半的节点对日志条目达成一致,就认为该日志是安全的并可提交,从而确保在任意网络分区和节点故障下仍保持正确性和进展性。
📌 原因详解
1. ✅ 一致性保障:多数派原则确保唯一合法提交
-
Raft 要求任何一次提交,必须得到多数节点的确认(N 个节点中至少 ⌊N/2⌋ + 1 个)。
-
因为任意两个多数派集合至少有一个交集节点,这个交集节点可以作为“共同记忆”,避免出现脑裂。
例:在 5 个节点中(A、B、C、D、E),任意三个节点构成多数派。A、B、C 和 C、D、E 的多数派交集是 C,能同步日志信息,维持一致性。
2. 💡 容错性设计:不依赖所有节点都存活
-
如果要求“所有节点 Ack”,只要有 1 个节点掉线,系统就无法提交日志,变成了“等待所有人同意” → 不可用。
-
使用多数派,只要不过半节点宕机,系统仍能选主、继续写入。
这符合分布式系统的“CAP 理论”,Raft 选择了 C(一致性)和 A(可用性),牺牲了 P(分区容忍性)的一小部分精度换取更强的一致性。
3. 🚫 等待所有节点会导致不必要的阻塞
- 真实环境中,网络延迟或慢节点经常出现,某些 follower 会比别人慢很多(称为“慢节点”)。
- 如果必须等待所有节点,慢节点也必须等完 → 系统吞吐大幅下降。
多数派允许这些“慢节点”落后,只要多数 follower 同步即可。
✅ Raft 中日志提交的条件
Leader 提交日志的必要条件是:
- 日志条目已复制到多数派节点;
- 该日志条目属于当前任期(
currentTerm
); - Leader 才可将日志标记为已提交,并通知 follower 应用该条目。
这称为 Raft 的日志提交规则(参考论文第5.4节 “Safety”)。
📖 参考依据与权威资料
📘 1. 《In Search of an Understandable Consensus Algorithm (Raft)》原论文
-
第 5.4 节原文摘录:
“Raft never commits log entries from previous terms by counting replicas. Only log entries from the leader’s current term are committed in this way. This rule maintains the invariant that a leader never overwrites or deletes entries in its log once they are committed.”
📗 2. Raft 官方文档:
📘 3. 《分布式系统:原理与范型(Tanenbaum)》
- 在一致性算法一章中,明确说明了“多数派”的作用就是为了避免全体等待并保证系统继续运行。
✅ 总结回顾
点位 | 原因 |
---|---|
📌 多数派具备交集性,防止脑裂 | 任意两个多数派有交集,确保一致性 |
⚙️ 提高可用性 | 少数 follower 故障不影响提交 |
⏱️ 减少等待延迟 | 不阻塞于网络慢节点 |
🧠 符合 CAP 理论 | 保证 C(强一致)与 A(高可用) |
如需进一步理解,可以结合动画演示(如 thesecretlivesofdata.com/raft)或阅读 Raft 的 Go 实现(如 etcd 的 rafthttp
模块)。
如果你希望进一步探究“follower 崩溃后重新加入如何 catch up”、或“split-brain 怎么防止”,我也可以详细展开。