第三章 分布式一致性协议(Paxos/Raft)高频问题
本章聚焦面试中最常考察的分布式共识算法对比与应用细节。面试官通常通过Paxos/Raft的对比快速判断候选人的理论深度与工程落地能力。掌握回答框架、选主流程、日志复制与安全性证明,是冲击大厂分布式存储岗位的关键。
面试问答卡片
卡片一:Paxos与Raft的核心区别是什么?
面试问题:请对比Paxos和Raft,说明为什么Raft更受欢迎?
考察点:对两种算法的理解深度、工程化思维、能否说出本质差异而非背诵概念。
回答框架:
- 一句话概括:Paxos通过多轮提案达成共识,Raft通过强Leader简化流程。
- 三点核心差异:①选主方式(无主 vs 强Leader);②日志复制顺序(乱序 vs 有序);③安全性证明复杂度。
- 结论:Raft更易实现与调试,大厂实际项目多采用Raft或混合方案。
示例回答:Paxos强调拜占庭容错但实现复杂,Raft将共识拆分为选主、日志复制、安全性三部分,通过强Leader和任期机制大幅降低理解与实现难度。Raft的语义清晰,适合工程大规模落地,因此更受欢迎。
可能追问:Multi-Paxos如何改进?Raft在选主时如何处理网络分区?
卡片二:Raft选主流程与日志复制细节
面试问题:详细描述Raft的选举过程,以及新Leader如何保证日志一致性?
考察点:对Raft选主时机、投票规则、日志匹配机制的掌握,是否理解“先到先得”与“日志完整性比较”。
回答框架:
- 阶段一:Follower超时触发选举,递增任期,发起RequestVote RPC。
- 阶段二:投票条件——候选人的日志至少与投票者一样新(比较最后任期和索引)。
- 阶段三:日志复制——Leader通过AppendEntries发送新日志,Follower检查prevLogIndex/prevLogTerm,不一致则拒绝并返回冲突信息。
- 阶段四:Leader通过nextIndex递减重试,最终达成一致。
示例回答:选举时Follower任期加1并自荐,投票者只支持任期不低于自己且日志至少同新的候选人。当选后Leader通过AppendEntries复制日志,若Follower的prevLog不匹配则返回拒绝,Leader递减nextIndex直到匹配,再批量复制后续日志。
可能追问:如果Leader宕机后恢复,如何加入集群?Raft如何处理未提交的日志?
卡片三:安全性证明(Leader Completeness)
面试问题:如何证明Raft的领导者完整性(Leader Completeness)?
考察点:是否理解Raft安全性的核心逻辑,能否用数学归纳或反证法阐述。
回答框架:
- 定义:已提交的日志一定出现在未来所有Leader的日志中。
- 反证法:假设Leader A提交了term T的某条日志,且后续Leader B缺失该日志。
- 推导:B当选需要获得多数投票,这些节点中至少有一个同时参与了A的提交(多数相交),该节点投票给B意味着B的日志至少与它一样新,则B必然包含A提交的日志,矛盾。
- 结论:保证已提交日志永不会丢失。
示例回答:采用反证法:假设Leader A提交了某日志L,后续Leader B不包含L。选举时B需获得多数投票,其中至少有一个节点S同时拥有L(因L已提交)。S投票给B说明B的日志不旧于S,则B必须包含S的日志或更大term的日志,而L的term不大于S的term,故B必含L,矛盾。因此Leader Completeness成立。
可能追问:Paxos如何保证安全性?Raft的强约束是否影响性能?
知识结构表格:Paxos vs Raft 关键对比
| 维度 | Paxos | Raft |
|---|---|---|
| Leader角色 | 无固定Leader,Proposer竞争 | 强Leader,负责日志复制 |
| 选主机制 | 通过Prepare阶段选主,可能冲突 | 任期+随机超时,快速选主 |
| 日志复制 | Accept阶段乱序提交 | 顺序追加,通过prevLog匹配 |
| 安全性证明 | 依赖多数轮次,证明复杂 | Leader完整性+多数交集 |
| 工程应用 | etcd(v2)等早期产品 | TiKV、CockroachDB、Consul |
项目案例理解参考(非本章专属,但可作为迁移素材)
虽然第三章不强制输出项目案例,但以下模板可供面试中迁移回答:
业务背景:解决云原生环境下日志复制延迟导致写性能瓶颈。
规模指标:3节点集群,QPS 5k,P99延迟100ms。
技术栈:Go + etcd Raft + gRPC。
核心难点:批处理与流控优化,防止Leader过载。
面试高频追问:如何处理日志回滚?网络分区时如何保证一致性?
可迁移回答话术:“我们参考了Raft的pipeline复制策略,通过调整batch size和并发窗口,将P99从100ms降到30ms,同时利用AppendEntries中的prevLogIndex保证了线性一致性。”
💡 复习建议:手写一遍Raft选主与日志复制的时序图,包括网络分区场景下的行为,能极大提升面试临场表达能力。