Raft共识算法详解

0 阅读2分钟

🚀 Raft 共识算法

导语: Raft 是后端面试的高频考点,工业界大名鼎鼎的 etcd、Consul、TiKV 都基于它实现。Raft 把复杂的共识问题巧妙拆成了三大模块:Leader 选举、日志复制、安全性。今天带你快速搞定它!


❓ 什么是 Raft

Raft 的诞生是为了解决 Paxos 难以理解、难于工程实现的问题。它以“可理解性”为核心目标,将共识拆分为三个独立的子问题:🔹 Leader 选举🔹 日志复制🔹 安全性约束

🎭 三种节点角色

  • 👑 Leader:处理客户端写请求,持续发送心跳。

  • 🙋‍♂️ Follower:被动响应,不主动发起请求。

  • 🗳️ Candidate:选举时的临时角色,用于竞选 Leader。

⏳ 核心概念:Term(任期)

单调递增的数字,每发起一次选举 Term +1,用来识别过期 Leader。


⚙️ 核心机制一:Leader 选举

  1. 超时触发

     Follower 长时间收不到 Leader 心跳 → 转为 Candidate,Term +1,给自己投一票。

  2. 拉票请求

    **

    Candidate 向其他节点发起投票请求。

    **

  3. 胜出条件

    **

    拿到多数派选票,成功成为 Leader。

    **

💡 核心设计:随机超时偶数节点容易平票;Raft 依靠随机选举超时 (150ms‑300ms),错开竞选时间,重新选举,避免集体同时竞选。


📝 核心机制二:日志复制

客户端写完整流程:

  1.  Leader 将日志追加到本地。

  2.  通过 AppendEntries RPC,并行推送给所有 Follower。

  3. 多数派复制成功,Leader 执行 commit,返回客户端写成功。

  4. 后续心跳通知 Follower 提交日志。

🔗 日志匹配特性

  • 如果两个日志在相同 index、相同 term 的记录一致,则这条记录之前的全部日志都完全一致。

  • 日志冲突时,Leader 强制 Follower 同步覆盖自己的日志。


🛡️ 3. 安全性约束

安全性约束是保证 Raft 集群状态机正确的前提:

| 约束 | 说明 | | --- | --- | | 选举限制 | Candidate 日志必须比集群大多数节点“更新”,否则不能当选 Leader | | 提交规则 | Leader 只能提交当前 term 的日志,不能直接提交旧任期日志 | | 日志匹配 | Leader 强制 Follower 对齐日志,保证集群日志一致 |


⚔️ Raft vs Multi‑Paxos(面试常考对比)

| 对比项 | Raft | Multi‑Paxos | | --- | --- | --- | | 理解难度 | 低,易上手 | 逻辑复杂,难实现 | | Leader 选举 | 独立显式流程 | 选举逻辑隐式内嵌协议 | | 日志流向 | Leader 单向推送给 Follower | 支持双向交互 | | 成员变更 | 联合共识,简单 | 实现复杂 | | 落地实现 | etcd/Consul/TiKV,开源多 | 大多厂商自研 |


💡 一句话总结

Raft 是强一致性 CP 协议,通过选主 + 日志复制保证集群数据一致;依靠随机超时解决选举冲突;Leader 只能提交当前任期日志是 Raft 非常关键的安全点;相比 Paxos,牺牲一部分理论极致,换取好理解、好实现。