60 秒回答模板

Raft 把共识拆成 leader 选举、日志复制和安全性约束。节点有 follower、candidate、leader 三种角色,并用 term 区分任期;follower 超时未收到心跳会变成 candidate 发起投票,获得多数票后成为 leader。客户端写入先到 leader,leader 追加日志并复制给 follower,达到多数派后提交,再应用到状态机。Raft 通过多数派交集、日志匹配、投票时比较日志新旧等规则,避免已提交日志被新 leader 覆盖。

考点 核心机制与工程取舍
难度 中高频面试题
回答目标 按定义、机制、场景讲清楚

深入解析

01

角色与任期

Raft 节点在 follower、candidate、leader 之间切换。term 是逻辑时钟,用来识别消息新旧;节点看到更高 term 会退回 follower,避免旧 leader 继续提交。

02

选举流程

follower 在随机选举超时内没有收到 leader 心跳,就自增 term、投票给自己并请求其他节点投票。获得多数票的 candidate 成为 leader,随机超时降低平票概率。

03

日志复制

leader 接收写请求,生成日志项并通过 AppendEntries 复制给 follower。follower 会检查前一条日志的 index 和 term 是否匹配,匹配才追加,从而保证日志前缀一致。

04

提交规则

日志复制到多数派后,leader 才能推进 commitIndex 并应用到状态机,再通知 follower 提交。多数派交集让已提交日志在后续选举中不会消失。

05

安全性约束

投票时会比较候选者日志是否足够新,日志落后的节点拿不到多数票。新 leader 会修正 follower 的冲突日志,补齐缺失日志,保证所有状态机按同一顺序执行命令。

易错点

  • 只讲 leader 选举,不讲日志复制和提交安全性。
  • 认为 leader 本地写入就算提交成功。
  • 忽略候选者日志新旧比较,导致落后节点也能当 leader 的错误理解。
  • 把 Raft 简化成主从复制,漏掉多数派交集和 term 机制。

面试官追问

为什么需要 term?

term 用来区分任期和消息新旧,旧 term 的 leader 或请求会被拒绝,避免多个 leader 同时有效。

网络分区时 Raft 怎么处理?

只有拥有多数派的一侧能选出 leader 并提交日志,少数派即使有旧 leader 也无法获得多数确认。

Raft 如何处理日志冲突?

leader 通过 prevLogIndex 和 prevLogTerm 找到共同前缀,follower 删除冲突后缀并接受 leader 的日志。

提交到多数派就可以响应客户端吗?

通常可以在 leader 将日志提交并应用或确认可应用后响应,关键是不能在仅 leader 本地写入时承诺成功。