一篇真正能让同事秒懂 Raft 的漫画长文
从“脑裂”到“选主”,从“日志黑洞”到“过半提交”,全程零公式、零废话。
0️⃣ 开场白:为什么 90% 的工程师看不懂 Paxos?
“Paxos 像量子力学——你知道它是对的,但你永远讲不清。”
两位斯坦福教授(Raft 作者)也学不会 Paxos,干脆重新发明了一个工程友好的算法——Raft。
今天,我们就用 1 张图 + 3 段话 + 8 个面试问答,带你彻底吃透它。
1️⃣ 一张图记住 Raft 的三板斧
子问题 | 一句话解释 | 生活化比喻 |
---|---|---|
Leader Election | 选班长 | 谁先举手谁当班长,任期制 |
Log Replication | 班长抄作业给同学 | 过半同学收到才算交齐 |
Safety | 班长不能篡改已交作业 | 旧作业永远不被覆盖 |
把下面这张图保存到手机,面试前 30 秒翻一次。
2️⃣ 状态机:3 种角色、2 个超时
🎭 3 种角色
- Follower 群众:只接收班长指令
- Candidate 候选人:举手竞选
- Leader 班长:唯一可对外服务
⏰ 2 个超时
超时类型 | 触发动作 | 默认值 |
---|---|---|
Election Timeout | Follower → Candidate | 150~300ms(随机) |
Heartbeat Timeout | Leader 必须续命 | 50ms |
随机化是解决“选票瓜分”的灵丹妙药。
3️⃣ 选主流程:4 步曲
- Follower 心跳超时 → 变成 Candidate
- 自增 Term,投自己一票
- 并发 RequestVote 给所有节点
- 收到过半选票 → 变成 Leader
任何时刻 最多只有一个 Leader(Election Safety),杜绝“脑裂”。
4️⃣ 日志复制:客户端写请求的一生
🚶♂️ Step by Step
Client → Leader → Log → AppendEntries RPC → Followers
↓
majority ACK → Commit → Apply → 返回 Client
- Commit = 日志被复制到 过半节点,不可回滚
- Apply = 真正写进状态机(KV 存储)
只有 当前 Term 的日志 才能被“计数”提交,历史日志顺带提交。
Raft 永远不会直接 commit 前任班长的日志。
5️⃣ 异常场景大赏
场景 | 是否安全 | 解释 |
---|---|---|
Leader 宕机 | ✅ | 剩余节点重新选举 |
Follower 宕机 | ✅ | Leader 无限重试,直到恢复 |
网络分区(奇数节点) | ✅ | 少数派自动变为只读 |
网络分区(偶数节点) | ⚠️ | 可能平票,需人工调整奇数节点 |
奇数个节点是部署铁律:3、5、7 …
6️⃣ 面试 8 问 8 答(背下来)
问题 | 一句话答案 |
---|---|
Raft 与 Paxos 最大区别? | Raft 把问题拆成 3 个独立子问题。 |
节点状态? | Follower / Candidate / Leader,任期递增。 |
何时触发选举? | Follower 心跳超时。 |
如何避免选票瓜分? | 随机超时 + 先来先投 + 奇数节点。 |
什么叫 committed? | 日志被复制到过半节点。 |
Leader 宕机怎么办? | 剩余节点重新选举,新 Leader 一定包含最新已提交日志。 |
会出现双 Leader 吗? | 会,但旧 Leader 无法复制到过半节点,实际不可写。 |
如何防止“幽灵日志”? | 只提交当前 Term 的日志,顺带提交旧日志。 |
7️⃣ 10 行伪代码,手撕日志复制
// Leader 侧
for cmd from client:
log.append(cmd) // 本地追加
parallel_send AppendEntries // 并发给所有 Follower
wait majority ack // 阻塞在 Fiber 里
commit_index = len(log) // 更新提交点
apply_to_state_machine() // 写 KV
reply_client("OK")
Follower 侧更简单:按顺序 apply 即可。
8️⃣ 3 分钟动画 + 源码
- 🎬 动画演示(官方):thesecretlivesofdata.com/raft
- 🔍 Go 实现:etcd/raft
- 🔍 C++ 实现:RaftLib/raft
9️⃣ 一图总结(长按保存)
🔚 写在最后
Raft 用一句话总结:“先选班长,再抄作业,过半算交齐。”
把它转发到技术群,下次面试官问“Raft 怎么选主?”你甩这张图就够了。
👍 点个赞 + 在看,下期带你读更多源码!