真实面经题目 · 原创解析
Raft 算法的原理是什么?
这题考 Raft 如何用更易理解的方式实现共识,回答要覆盖 leader 选举、日志复制和安全提交。
真实面经题目 · 原创解析
这题考 Raft 如何用更易理解的方式实现共识,回答要覆盖 leader 选举、日志复制和安全提交。
Raft 把共识拆成 leader 选举、日志复制和安全性约束。节点有 follower、candidate、leader 三种角色,并用 term 区分任期;follower 超时未收到心跳会变成 candidate 发起投票,获得多数票后成为 leader。客户端写入先到 leader,leader 追加日志并复制给 follower,达到多数派后提交,再应用到状态机。Raft 通过多数派交集、日志匹配、投票时比较日志新旧等规则,避免已提交日志被新 leader 覆盖。
Raft 节点在 follower、candidate、leader 之间切换。term 是逻辑时钟,用来识别消息新旧;节点看到更高 term 会退回 follower,避免旧 leader 继续提交。
follower 在随机选举超时内没有收到 leader 心跳,就自增 term、投票给自己并请求其他节点投票。获得多数票的 candidate 成为 leader,随机超时降低平票概率。
leader 接收写请求,生成日志项并通过 AppendEntries 复制给 follower。follower 会检查前一条日志的 index 和 term 是否匹配,匹配才追加,从而保证日志前缀一致。
日志复制到多数派后,leader 才能推进 commitIndex 并应用到状态机,再通知 follower 提交。多数派交集让已提交日志在后续选举中不会消失。
投票时会比较候选者日志是否足够新,日志落后的节点拿不到多数票。新 leader 会修正 follower 的冲突日志,补齐缺失日志,保证所有状态机按同一顺序执行命令。
term 用来区分任期和消息新旧,旧 term 的 leader 或请求会被拒绝,避免多个 leader 同时有效。
只有拥有多数派的一侧能选出 leader 并提交日志,少数派即使有旧 leader 也无法获得多数确认。
leader 通过 prevLogIndex 和 prevLogTerm 找到共同前缀,follower 删除冲突后缀并接受 leader 的日志。
通常可以在 leader 将日志提交并应用或确认可应用后响应,关键是不能在仅 leader 本地写入时承诺成功。