首页 › programming › 多数派即真理:Raft如何终结分布式脑裂

多数派即真理:Raft 如何终结分布式脑裂

导语

如果你写过任何有点规模的后端服务,迟早会撞上一道墙:当数据分散在多台机器上,你怎么保证它们口径一致? 更要命的是,机器会宕机、网线会断、交换机会抖——在网络分区发生的那一刻,你的集群可能瞬间分裂成两个互不相认的小团体,各自独立地写各自的数据。等网络恢复,两份冲突的"真相"摆在面前,谁说了算?这就是分布式系统里臭名昭著的脑裂(split-brain)。

这本页面要拆解的视频是 Arpit Vaish(@YodhaMonk)的《RAFT Algorithm Explained | Distributed Consensus Made Simple》。它的价值在于:它把一个原本要啃论文、啃源码才能搞懂的共识协议,压缩成了一次"看图就懂"的讲解。而 Raft 本身之所以值得每个后端工程师认真学一遍,是因为它回答了一个看似无解的问题——在不完美的网络上、在随时会挂掉的节点之间,我们能不能造出一台"永远不会分裂"的逻辑计算机? 答案是:能,代价是接受一个朴素的真理——半数以上同意,才算数。

视频背景卡片

项目 内容
视频标题 RAFT Algorithm Explained | Distributed Consensus Made Simple
频道 Arpit Vaish(@YodhaMonk),系统设计硬核讲解频道
核心主题 Raft 共识协议:领导选举 + 日志复制 + 安全性保证
对标概念 Paxos、ZAB(ZooKeeper Atomic Broadcast)
典型时长 约 20–30 分钟(Raft 完整讲解区间)
实际应用 etcd、Consul、TiKV、CockroachDB、Kubernetes 配置存储

说明:YouTube 对本环境的精确播放量与发片时间因 IP 访问限制未能核验,以上信息以频道定位与 Raft 公开技术资料为准。

核心内容拆解

一、诅咒的根源:为什么集群一定会"分裂"

要理解 Raft 的精妙,先得理解它要消灭的敌人。分布式系统有三个永恒的敌人,它们共同构成了所谓的FLP 不可能性(Fischer、Lynch、Paterson 三人 1985 年证明):在一个异步网络里,只要存在哪怕一个节点可能宕机,就不存在一个确定性算法能保证共识同时满足终止性和安全性。

听起来很绝望?别急。工程上的解法是放宽假设——假设网络在"大多数时候"是可靠的,节点有大致同步的时钟,于是我们就能用概率和超时把那个理论上的死结解开。Raft 选择了最务实的路线:不追求"任意时刻绝对一致",而追求"只要多数派活着,最终一定一致"。这背后是 CAP 定理的取舍——Raft 选的是 CP(一致性 + 分区容忍),牺牲的是分区期间的可用性(少数派那部分节点暂时无法服务)。

视频在这里其实埋了一个关键认知:脑裂不是 bug,它是物理定律。 你不能消灭它,只能设计一种规则,让脑裂发生时,只有"多数派"那一侧能继续写数据,少数派那侧自动闭嘴。Raft 的整套机制,本质就是在执行这条规则。

二、设计哲学:为了"可理解性"而生的协议

Raft 的诞生有一个几乎浪漫的动机。2014 年,Diego Ongaro 和 John Ousterhout(对,就是那位写 Tcl/Tk、教分布式系统的传奇教授)发表了论文《In Search of an Understandable Consensus Algorithm》。他们的潜台词很直接:Paxos 已经统治了学术界三十年,但业界几乎没人真正能把它实现对。

Paxos 的问题不在于它"错",而在于它抽象层次太多——Basic Paxos、Multi-Paxos、Fast Paxos,论文把很多工程细节留作"读者练习"。结果是每个实现 Paxos 的团队(Chubby、Spanner……)都在造自己不兼容的方言。Ongaro 的洞察是:一个无法被工程师正确实现的协议,等于不存在。

于是 Raft 把共识问题暴力拆解成三个相对独立的子问题:领导选举(Leader Election)、日志复制(Log Replication)、安全性(Safety)。每个子问题都给了明确的规则和状态转换。视频反复强调的"Simple",指的就是这种分解后的可读性——你不需要在脑子里同时维护十几个不变式,顺着三个模块走就能推理出系统行为。这是 Raft 对业界最大的贡献:它把分布式共识从"玄学"变成了"工程"。

三、状态机复制:一切一致性的根基

Raft 服务的不是某条数据,而是一个抽象叫复制状态机(Replicated State Machine, RSM)。这个模型极其优雅,值得单独说清:假设你有一台确定性的状态机(同样的输入永远产生同样的输出和同样的下一状态),那么只要让所有节点以完全相同的顺序喂入相同的命令序列,它们的最终状态就一定完全相同。

这就是"日志"为什么如此核心的原因。Raft 维护的是一条有序的、复制的命令日志——日志的第 i 条命令是什么,决定了状态机在第 i 步做什么。所谓"一致性",说到底就是:在所有节点上,日志的第 i 条 entry 是同一条命令,并且已被提交(committed)的日志永远不会被推翻。

注意"确定性"这个词。这是状态机模型的隐藏前提:你的业务逻辑里不能藏随机数、不能依赖本地时间、不能读未同步的外部状态。一旦状态机有非确定性,复制就会发散——这也是为什么基于 Raft 的系统(比如 etcd)对使用方有诸多"确定性"约束。视频没有展开这一点,但它是从"看懂 Raft"到"用好 Raft"的关键一跃。

四、领导选举:任期(term)是宇宙的时钟

Raft 最聪明的设计,是引入了任期(term)这个单调递增的逻辑时钟。每个 term 编号下,集群最多选出一个 leader。term 的作用相当于"朝代更迭"——一个 leader 只有在自己的 term 内合法,一旦有更新的 term 出现,旧 leader 立刻失去权威。这一招,直接锁死了"两个 leader 并存"的可能。

节点有三种角色:Follower(跟随者)、Candidate(候选人)、Leader(领导者)。流程是这样:集群启动时大家都是 Follower;如果一个 Follower 在一段选举超时(election timeout)内没收到 leader 的心跳,它就升级为 Candidate,把自己的 term 加一,先投自己一票,然后向其他节点发起 RequestVote RPC。谁先拿到多数派(majority)的票,谁就成为新 leader,开始向所有人发心跳维持统治。

这里有一个反直觉但精妙的设计:选举超时是一个随机值。视频把它讲得很清楚——如果所有节点同时超时,会同时发起选举,结果谁也拿不到多数票,陷入"活锁"。Raft 用随机化的超时间隔(比如 150–300ms)让冲突概率大幅下降。这是一处典型的"用随机性解决确定性死锁"的工程智慧,和以太网的 CSMA/CD、MapReduce 的 backup tasks 一脉相承。

五、日志复制:多数派提交的艺术

当选出 leader 后,真正的活儿开始了。客户端的所有写请求,只能发给 leader(发到 follower 会被重定向)。Leader 把命令追加到自己的日志,然后并行通过 AppendEntries RPC 发给所有 follower。当 Leader 确认多数派节点已经复制了这条日志,它就把它标记为 committed,应用到自己的状态机,把结果返回给客户端。

这是"半数即真理"最直接的体现:一条命令一旦被多数派记录,就被视为已生效,哪怕 leader 随即宕机,新选出的 leader 也一定(下面会解释"为什么一定")持有这条已提交的日志。从这里能推出 Raft 的容错公式——一个 N 节点的集群,能容忍最多 ⌊(N−1)/2⌋ 个节点故障:3 节点容忍 1 个,5 节点容忍 2 个,7 节点容忍 3 个。这也是为什么生产环境几乎都用奇数节点——偶数节点(比如 4 个)的容错能力和少一个的奇数(3 个)一样,却多花一台机器的钱。

注意一个性能细节:Leader 发送 AppendEntries 是流水线(pipelined)的,不必等上一条确认才发下一条,所以吞吐可以很高;而读请求在线性一致(linearizable)模式下,leader 需要先确认自己仍是当前 term 的 leader(通过一次心跳往返),这会带来额外延迟——这是很多基于 Raft 的系统提供"宽松读(stale read)"选项的原因。

六、安全性规则:为什么新 leader 一定不缺日志

到这里你可能有个疑问:既然只看多数派,那万一选出一个"日志落后"的 leader 怎么办?它会不会把已提交的命令搞丢?Raft 用几条安全性不变式封死了这个漏洞,这是它区别于"朴素多数派"的核心:

  1. 选举约束(Election Restriction):RequestVote 时,Candidate 的日志必须至少和多数派一样新(up-to-date)。判断"谁更新"的规则是:先比最后一条日志的 term,term 大的更新;term 相同再比 index(长度),长的更新。因为已提交的命令一定在多数派节点上,而多数派之间必有交集,所以任何能拿到多数票的 Candidate,其日志必然包含所有已提交的命令。
  2. Leader Completeness:结合上面这条,加上"已提交 = 已在多数派",可以推出——已提交的日志条目,在所有未来的 term 里都一定会出现在每个 leader 的日志中。这条是整个 Raft 安全性证明的"压舱石"。

这两条规则加在一起,保证了那个让人安心的承诺:只要一条命令被提交了,它就永远在,永远不会被推翻或丢失。 Paxos 的 Multi-Paxos 把这些约束留给实现者去补,Raft 则白纸黑字写死——这就是"可理解性"带来的工程红利。

七、工程化扩展:快照与成员变更

理论归理论,真要在生产里跑 Raft,还有两个绕不开的工程问题,视频后半段也涉及了。

第一个是日志膨胀。 如果日志只增不减,运行几个月后磁盘和重启恢复时间都会爆炸。解法是快照(snapshot):定期把状态机的当前状态完整序列化,然后丢弃这之前所有的日志条目。每个节点独立做快照,leader 通过 InstallSnapshot RPC 把自己的快照同步给落后的 follower。这里有个微妙之处:快照的 commit index 必须是"已应用到状态机"的点,否则会破坏状态机语义。

第二个是成员变更(reconfiguration)。 你想给集群加一台机器或换掉坏机器,但直接改配置会触发脑裂——新旧配置可能各自形成多数派。Raft 论文给了联合共识(joint consensus)的方案:先切到一个"过渡配置"(需要新旧两个多数派都同意),再切到目标配置。后来业界更常用 Diego Ongaro 在博士论文里提出的单成员变更(single-server membership change)——每次只增减一个节点,数学上保证任意时刻不可能存在两个不相交的多数派,实现起来简单得多。etcd 等系统用的就是后者。

八、Raft vs Paxos vs ZAB:共识协议的三国

最后拉一个视角。Paxos 是学术上的"正确答案",抽象、通用、但实现门槛极高;ZAB(ZooKeeper 用的协议)和 Raft 高度神似,也是"主从 + 多数派 + term-like 的纪元(zxid)",但它先于 Raft 出现,更多是工程演进而非教学设计;Raft 则是后来居上的"教学+工程双优生",靠着可读性和清晰的规范,迅速占领了新一代分布式存储的共识层。

工程界的用脚投票很说明问题:Kubernetes 的配置存在 etcd(Raft)、HashiCorp 的服务发现用 Consul(Raft)、PingCAP 的 TiDB 存储引擎 TiKV(Raft,而且 Multi-Raft——每段数据范围一个独立的 Raft 组,撑起了水平扩展)、CockroachDB(Raft)。可以说,Raft 是当代分布式基础设施的承重墙。理解了它,你就理解了这一代云原生系统的命脉。

知识结构图

flowchart TD
    Client([客户端写请求]) --> Leader

    subgraph Raft核心["Raft 共识内核"]
        direction TB

        subgraph 选举["① 领导选举 (Leader Election)"]
            F[Follower 跟随者] -->|选举超时 random| C[Candidate 候选人]
            C -->|多数派投票| L[Leader 领导者]
            L -->|心跳维持| F
        end

        subgraph 复制["② 日志复制 (Log Replication)"]
            L --> L1[本地追加日志]
            L1 --> APP["AppendEntries 并行下发"]
            APP --> F
            F --> MAJ{多数派确认?}
            MAJ -->|是| COM[commit 提交]
            COM --> SM[应用到状态机]
            SM --> Resp[响应客户端]
        end

        subgraph 安全["③ 安全性 (Safety)"]
            TERM["任期 term 单调递增<br/>锁死双 leader"]
            ER["选举约束: Candidate 日志<br/>须至少与多数派一样新"]
            LC["Leader Completeness:<br/>已提交日志永不丢"]
        end
    end

    安全 -.约束.-> 选举
    安全 -.约束.-> 复制

    style L fill:#cfe8ff,stroke:#1976d2,stroke-width:2px
    style COM fill:#d7f5dd,stroke:#2e7d32,stroke-width:2px
    style MAJ fill:#fff3cd,stroke:#f57c00

实战启示

对一线工程师来说,Raft 不只是面试题,它直接决定了你怎么选型和怎么避坑。

第一,知道何时该用强一致存储。 你的系统如果有"配置""元数据""领导者选举""分布式锁"这类需求——别自己造轮子,直接上 etcd 或 Consul。它们底层就是 Raft,已经把脑裂、选举、快照都处理好了。把精力留给业务,而不是重新发明共识轮子。

第二,知道何时不该用。 如果你做的是高吞吐的数据管道(比如每天 TB 级的日志流),Raft 的"每条都过多数派"会成为吞吐天花板——那是 Kafka 及其 ISR(In-Sync Replicas)变体的主场,它们用更宽松的一致性换吞吐。强一致和高吞吐在分布式里是鱼和熊掌,Raft 站在前者。理解这条边界,能避免架构选型的致命错误。

第三,生产部署的硬规则。 永远用奇数节点(3 或 5 或 7),因为偶数节点的容错能力被白白浪费;3 节点能容忍 1 故障、5 节点容忍 2——预算允许就上 5 节点,因为"容忍 2 个同时挂"在云环境(整个可用区宕机)里几乎是刚需。还要注意跨可用区部署时延迟会拖慢选举和提交——Raft 的写延迟 ≈ 一个 majority 往返,跨城 30ms 往返意味着每次写至少 30ms,这会直接影响你能否用它做高频写入。

第四,监控这三个指标就能抓住 90% 的 Raft 故障: leader 切换次数(频繁切换说明网络或磁盘有问题)、commit 延迟(反映复制健康度)、follower 落后日志条数(落后过多可能要触发快照同步,拖垮 leader)。任何基于 Raft 的成熟系统(etcd、TiKV)都暴露了这些指标,接到告警里,能在脑裂真正酿成数据问题前就发现端倪。

延伸学习路径

  1. 原论文(必读):《In Search of an Understandable Consensus Algorithm》(Ongaro & Ousterhout, USENIX ATC 2014)——分布式领域最易读的经典论文之一,比看任何二手讲解都透彻。
  2. 交互式可视化:raft.github.io ——Ongaro 本人参与的可视化,你能亲手触发节点宕机、网络分区,看 term 和日志如何演化,是建立直觉的最佳工具。
  3. MIT 6.824 分布式系统课程:Lab 2 就是让你从零实现一个 Raft(Go 语言),涵盖选举、日志、快照、持久化。做完这一套,你对 Raft 的理解会从"看过"变成"写过"。
  4. 源码级学习:etcd 的 raft 库(go.etcd.io/raft)是业界最干净的 Raft 实现,它把"共识算法核心"和"网络/存储/应用"解耦成一个纯状态机库,非常值得读。
  5. 进阶对照:Diego Ongaro 的博士论文《Consensus: Bridging Theory and Practice》——补全了单成员变更、批量日志、客户端线性一致性读等论文未尽的工程细节,是"从懂 Raft 到会实现 Raft"的桥梁。

一句话总结

Raft 用"任期递增 + 领导者单点写入 + 多数派提交"三件套,把分布式脑裂这个理论死结,解成了一个任何工程师都能读懂、能正确实现的工程协议——从此多台机器也能像一台机器那样"说一不二"。

参考来源

  1. RAFT Algorithm Explained | Distributed Consensus Made Simple — Arpit Vaish (@YodhaMonk) — 本文分析的核心视频
  2. In Search of an Understandable Consensus Algorithm (Ongaro & Ousterhout, 2014) — Raft 原始论文
  3. The Raft Consensus Algorithm — 官方可视化与资源站 — 交互式动画演示
  4. Comparing Paxos and Raft — SysTutorials — Paxos 与 Raft 设计对比
  5. Raft: A More Understandable Consensus Algorithm — Reddit r/compsci 讨论 — 社区补充视角与实现经验
  6. Paxos vs Raft Algorithm — GeeksforGeeks — 系统设计面试角度的二者对照

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。


完成摘要

本轮完成: 第 2 轮深度解读(分类:programming / 编程与开发)

下一步计划

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入