2、Raft协议核心思想:Leader选举、日志复制、安全性、Raft vs Paxos对比

Raft 是一种用于管理复制日志的共识算法,其设计目标是在易于理解的同时,提供与 Paxos 同等的容错能力。在 etcd 中,Raft 是保证分布式一致性日志存储模型正确运行的核心引擎。本章深入剖析 Raft 的三大核心机制:Leader 选举、日志复制、安全性,并与 Paxos 进行对比分析。

2.1 Leader 选举:谁来做主?

Raft 将时间划分为任意长度的任期(Term),每个任期最多只有一个 Leader。节点在三种角色间转换:Leader(领导者)、Follower(跟随者)、Candidate(候选者)。选举过程由心跳超时机制触发。

核心流程: Follower 在选举超时内未收到 Leader 心跳 → 转换为 Candidate → 自增任期号 → 投票给自己并请求其他节点投票 → 获得多数票(N/2+1) → 成为新 Leader。
关键参数: etcd 默认选举超时在 100ms~500ms 之间随机化,避免多个节点同时发起选举导致选票分裂。

选举过程状态机

Raft 角色转换与 Leader 选举流程 Follower 等待心跳 Candidate 发起投票 Leader 管理日志 选举超时 获得多数票 发现更高任期 / 网络分区恢复 选举超时 / 收到更高任期心跳 每个任期最多一个 Leader;任期号单调递增,用于防止脑裂

2.2 日志复制:如何保证一致?

一旦 Leader 被选举出来,它就开始处理客户端请求。所有写请求必须经过 Leader,Leader 将请求封装为日志条目(Log Entry),并复制到所有 Follower 节点。日志复制是 Raft 实现状态机复制(State Machine Replication)的核心手段。

日志复制步骤

  1. Append: Leader 收到客户端请求,将操作追加到本地日志。
  2. 并行发送: Leader 向所有 Follower 发送 AppendEntries RPC,包含日志条目及前一条日志的索引和任期。
  3. 一致性检查: Follower 检查前一条日志是否匹配;不匹配则拒绝,Leader 回退重试。
  4. 提交(Commit): 当 Leader 收到多数 Follower 的成功响应后,将日志标记为已提交,并应用到状态机。
  5. 通知: Leader 在后续心跳中通知 Follower 提交位置,Follower 依次提交。
一致性检查关键: Raft 保证已提交的日志条目在所有节点上具有相同的索引和任期,且一旦提交,永远不会被覆盖。

日志复制结构示意

Raft 日志复制:Leader → Follower Leader 日志 term 1 term 1 term 2 term 2 ← 已提交 AppendEntries RPC Follower 1 term 1 term 1 term 2 term 2 ← 未提交 Follower 2 term 1 term 1 term 2 ← 未提交

2.3 安全性:Raft 的五大保证

Raft 通过一系列安全性约束,确保在任意网络分区、节点故障场景下,系统不会产生不一致的状态。这些约束共同构成了 Raft 的正确性证明基础。

安全性属性 描述 实现机制
Election Safety 每个任期最多只有一个 Leader 任期号单调递增;节点在一个任期内最多投一票
Leader Append-Only Leader 从不覆盖或删除自己的日志条目 Leader 只追加新条目,不修改已存在的日志
Log Matching 如果两个节点日志中相同索引的条目任期相同,则之前所有条目一致 AppendEntries 一致性检查:前一条日志的索引和任期必须匹配
Leader Completeness 已提交的日志条目在后续所有 Leader 中一定存在 Candidate 必须拥有比当前最新已提交日志更新的日志才能当选
State Machine Safety 所有节点以相同顺序应用相同日志条目 只有已提交的日志才能被应用到状态机;提交顺序全局一致
Leader Completeness 的投票限制: Candidate 在请求投票时携带自己最后一条日志的 (term, index)。Follower 只投票给日志比自身更新的 Candidate(先比较 term,term 相同再比较 index)。这保证了新 Leader 一定拥有所有已提交的日志。

2.4 Raft vs Paxos:设计哲学与工程权衡

Paxos 是共识算法的理论基石,但工程实现复杂。Raft 通过分解问题和强约束角色,大幅降低了理解门槛和实现难度。以下是两者的核心对比:

对比维度 Raft Paxos(经典 Multi-Paxos)
设计目标 可理解性优先 数学优雅性优先
角色划分 Leader / Follower / Candidate 三种明确角色 Proposer / Acceptor / Learner,角色可重叠
Leader 选举 内置随机超时选举机制,强 Leader 模式 需要外部选主或使用 Multi-Paxos 的 Distinguished Proposer
日志复制 Leader 全权负责,顺序追加,一致性检查严格 两阶段提交(Prepare/Accept),可乱序提交
安全性证明 通过有限状态机 + 约束条件直观证明 基于形式化逻辑,证明复杂
工程实现 etcd、Consul、TiKV 等广泛采用,实现清晰 Google Chubby、ZooKeeper(ZAB 类似 Paxos),实现晦涩
性能优化 批量、流水线、并行复制;Leader 负责制减少消息数 可优化空间大但实现复杂,容易出错
工程选择建议: 对于新系统开发,优先选择 Raft。Raft 的强 Leader 模型天然适合 etcd 这种需要线性一致读写的场景。Paxos 更适合需要极致灵活性的底层基础设施。

Raft 与 Paxos 消息复杂度对比

Raft vs Paxos:一次日志复制所需消息数 Raft(强 Leader) 1 次 AppendEntries 请求 + N-1 次 AppendEntries 响应 总消息数 ≈ N Multi-Paxos(无稳定 Leader) 1 轮 Prepare + 1 轮 Accept 每轮 N 个节点交互 总消息数 ≈ 2N N 为集群节点数;Raft 在稳定 Leader 下消息数仅为 Paxos 的一半
注意: 上述对比假设 Paxos 没有稳定的 Distinguished Proposer。如果 Paxos 也选出了稳定 Leader,则消息复杂度与 Raft 相同,但 Leader 选举和故障恢复的复杂度仍高于 Raft。

2.5 本章小结

  • Leader 选举 通过随机超时和任期机制,保证快速、安全的选主。
  • 日志复制 通过 AppendEntries RPC 和严格的一致性检查,确保日志在所有节点上顺序一致。
  • 安全性 通过五大约束(Election Safety、Leader Append-Only、Log Matching、Leader Completeness、State Machine Safety)提供数学级别的正确性保证。
  • Raft vs Paxos:Raft 以可理解性为设计核心,牺牲了部分理论灵活性,换来了工程实现的清晰和稳定,是 etcd 等现代分布式存储系统的首选共识引擎。