面试官:讲讲 Raft?我笑了。一次彻底搞懂 Raft 核心机制
Hello,大家好!
我们今天直入主题,聊一个在后端高级岗和架构师面试中,几乎无法回避的话题——Raft 算法。

为什么它这么重要?因为我们熟知的 K8s、etcd、RocketMQ、Kafka、RabbitMQ这些顶级的分布式系统,它们的稳定和可靠,都离不开 Raft 这个核心基石。
所以,无论你是想在面试中脱颖而出,还是想在工作中真正驾驭复杂的分布式系统,透彻理解 Raft 都是你的必修课。
这次我们就用最直观的方式,帮你一次性搞定它。
点赞、收藏,我们开始!
“在深入细节之前,我们先花 30 秒,快速建立一个宏观认知:Raft 到底是什么?

- 它是什么? Raft 是一个分布式一致性算法,它的最大特点就是为了‘易于理解’而设计,功能上和非常难懂的 Paxos 算法是等价的。
- 解决什么问题? 它的核心任务,就是保证在一个由多台机器组成的集群里,数据是强一致的。即使有机器宕机、网络出问题,系统也能对外提供正确无误的服务。
- 应用在哪? 就像我们开头提到的,它被广泛应用在各种需要‘高可靠协调’的场景。
所以大家要记住,在面试中,能把 Raft 讲清楚,绝对是你技术深度和广度的加分项,是区别普通工程师和高级专家的一个关键点。”
“一个可靠的分布式系统,首先要解决的就是‘群龙无首’的问题。Raft 的世界里,所有的数据写入都必须经过一个总指挥,这个总指挥就是 Leader。其他节点都是听从指挥的 Follower。
那么,这个 Leader 是怎么来的呢?这就是 Raft 的第一个核心机制:Leader 选举。

大家看这张图。假设我们有 S1, S2, S3, S4 四个节点。一开始 S2 是 Leader,它会不断地给其他 Follower 发送心跳,就像在说:‘我还活着,大家听我指挥’。
突然,S4 这个节点,在一段时间内(这个时间叫 election timeout)没收到 Leader 的心跳。它就觉得:‘大哥是不是挂了?’
于是,它决定起义!
- 第一步,成为候选人 (Candidate):S4 会增加自己的‘任期号’(Term),这个 Term 就像古代的年号,代表一个新的朝代开始了。然后,它会先给自己投一票。
- 第二步,发起投票:S4 会向集群里所有其他节点发送投票请求,说:‘兄弟们,我准备当新大哥,Term 号也更新了,大家投我一票吧!’
- 第三步,少数服从多数:其他节点收到请求后,如果发现自己的 Term 号确实落后了,并且自己还没给别人投过票,就会同意这个请求。当 S4 收到包括自己在内的、超过半数的选票后,它就成功晋升为新 Leader!
- 第四步,宣告统治:S4 成为新 Leader 后,会立刻开始向全员发送心跳,宣告自己的统治,其他节点收到后,就都成为了它的 Follower。
[小结] 这就是 Leader 选举,通过‘心跳超时’触发、‘先到先得’的投票、以及‘少数服从多数’的原则,保证了集群在 Leader 宕机后,能迅速选出新的主心骨。”
“好,现在集群有 Leader 了,系统就可以对外提供服务了。但怎么保证所有节点的数据都完全一样呢?这就来到了 Raft 最核心、也是最精妙的部分:日志同步 (Log Replication)。

请大家把注意力高度集中在这张图上,这可能是全网把 Raft 日志同步和状态机区分得最清楚的图之一了。
看,无论是 Leader 还是 Follower,它的内部都分成了两个关键部分:上面是‘日志 (Log)’,下面是‘状态机 (State Machine)’。
你一定要记住这个核心思想:日志是达成共识的过程记录,状态机是共识最终应用的结果。
我们来一步步拆解这个流程:
- (指向 ①) 客户端给 Leader 发来一个写请求:SET x=8。
- (指向 ② 和 Leader 的日志区) Leader 收到后,并不会马上修改 x 的值。它会先把这个命令作为一个新的日志条目,追加到自己日志的末尾。大家看,这条新日志是橙色的,表示它还处于一个未提交 (uncommitted) 的状态,只是个‘提议’。
- (指向 ③) 接着,Leader 会通过 AppendEntries 消息,把这条新日志并行地复制给所有的 Follower。
- (指向 ④) Follower 收到后,也会把日志写入自己的本地日志(同样是橙色的未提交状态),然后给 Leader 回一个‘ACK’,表示‘我收到了’。
- (指向 ⑤,这是最关键的一步) 当 Leader 收到超过半数节点的成功回复后,它就知道:‘OK,这条日志已经被大多数人认可了,它现在是安全的了’。这时,Leader 就会把这条日志的状态更新为‘已提交’ (committed)。看,日志颜色从橙色变成了绿色! 然后,Leader 才会真正执行这条日志里的命令,把自己状态机里的 x 从 3 更新为 8。
- (指向 ⑥) 状态机更新成功后,Leader 就可以放心地回复客户端:‘操作成功!’。同时,在后续的心跳中,Leader 会顺便通知所有 Follower:‘嘿,索引为 4 的那条日志我已经提交了,你们也赶紧提交并执行吧!’ 这样,所有节点的 x 最终都会变成 8,整个集群达到了数据的一致。
[小结] 这个过程总结起来就是:Leader 先写日志 -> 并行复制给 Follower -> 等待多数派确认 -> Leader 提交并应用到状态机 -> 回复客户端 -> 最后通知 Follower 应用。 这个严谨的两阶段提交流程,是 Raft 数据安全性的基石。”
“我们知道了选举和同步。但分布式系统最怕的就是网络出问题。比如机房光缆被挖断,集群被分割成两半,各自都以为对方挂了,从而选出两个 Leader,这就是恐怖的‘脑裂’ (Split-Brain)。
Raft 是如何利用它的机制,优雅地解决这个问题的呢?

看这个场景,一个 5 节点的集群被网络分割成了两部分。
- 左边,是原来的老 Leader S1 和一个 Follower S2。它们是一个少数派 (2/5)。
- 右边,是三个 Follower S3, S4, S5。它们是多数派 (3/5)。
现在,右边的多数派发现联系不上老 Leader S1 了,它们会怎么办?没错,发起新一轮选举!它们会增加 Term 号,然后从它们三个中选出一个新 Leader,比如 S3。因为它们是多数派,所以它们可以成功完成选举,并且可以正常处理客户端的写请求,因为它们可以获得多数派的日志确认。
关键来了,再看左边的老 Leader S1。它现在只是个‘光杆司令’。当它收到写请求时,它尝试复制日志,但它永远也收不到超过半数(3票)的确认,因为它只能联系到 S2。所以,在少数派分区里的 Leader,是无法提交任何新日志的! 这就保证了数据不会被错误地提交。
当网络恢复后,老 Leader S1 尝试发心跳,但它会收到来自新 Leader S3 的回复,发现对方的 Term 号比自己高。这时,S1 就知道自己已经‘过时’了,它会立刻放弃王位,自动降级为 Follower,并同步 S3 的最新日志。
[小结] 所以,Raft 防止脑裂的核心就是两大武器:
- 多数派原则:任何选举和日志提交,都必须得到超过半数的节点同意。
- Term 号机制:一个更高 Term 号的出现,就意味着旧时代的终结,所有低 Term 的节点都必须无条件服从。
这两点保证了在任何时刻,整个系统最多只有一个有效的 Leader,数据的一致性得到了绝对的保障。”
“OK,我们现在来对Raft算法做一下核心总结:
Raft做的两个重要的事情,就是Leader选举和日志同步。而Raft的实现关键就是通过Term任期号以及多数派投票的核心机制。尽管Raft协议在落地实现时还是有很多的变种,例如Nacos实现了JRaft,Kafka实现了KRaft,但基本都是万变不离其宗的。
而Raft之所以这么火,就在于他对于前任Paxos算法的优化和改进。这里简单列一个表格进行比较。如果你希望再深入了解下Paxos或者Zookeeper的ZAB等其他分布式一致性协议,请在评论区留下你的意见。我会再出一期从源码和实战的角度再深入分析这些其他的分布式一致性协议。

有了前面这些核心机制做铺垫,我们再来看这些常见的面试题,就会发现回答起来简直是水到渠成。我们来快速解答前两个。
第一个问题:Raft 如何保证新 Leader 一定包含所有已提交的日志?
一句话回答:靠投票规则限制。
一个节点只会给‘日志不比自己旧’的候选人投票。一条日志能被提交,说明它至少存在于多数派节点上。因此,一个候选人如果想赢得选举,它就必须获得多数派的支持,而为了获得这些支持,它的日志就必须足够新,新到至少包含了所有已提交的日志。
简单说:一个日志落后的‘差生’,根本拿不到足够的选票当选 Leader。
第二个问题:Raft 的快照机制是如何工作的?
同样一句话:给状态机拍‘照片’,替代冗长的日志。
当日志变得太长时,Leader 会把当前系统的所有数据(也就是状态机)完整地保存成一个快照文件。然后,就可以把产生这个快照之前的所有日志都删掉了。
这样做的好处有两个:一是节省磁盘空间;二是极大提高恢复速度,新节点或落后很久的节点可以直接加载快照,而不用同步海量的历史日志。这就好比直接给你一份最新的项目文档,而不是让你去读三年的会议纪要。”
“好了,到这里,关于 Raft 算法的 Leader 选举、日志同步和安全机制这三个核心,我们就全部讲完了。相信你现在对 Raft 已经有了一个非常清晰和深入的理解。
最后,我想用演示里的这句话作为结尾:

‘职业生涯就像一个分布式系统,重要的不是永不犯错,而是拥有从冲突中恢复并达成共识的能力。’
希望这个视频对你有切实的帮助。如果你觉得有收获,请不要吝啬你的‘一键三连’,这是对我最大的支持。我们下期再见!”