01. 挑战:在不可靠中建立可靠
状态机复制 (SMR)
将一组不可靠的主机组合成一个单一、可靠的服务。核心要求是所有主机以相同顺序执行相同操作。
分布式共识
SMR 的实现基础。确保所有节点对操作的顺序达成一致,即使在网络延迟或节点故障的情况下也能保证安全。
强一致性
系统表现得像单一实体,提供可预测的行为(如线性一致性),极大地简化了分布式系统的编程模型。
02. 双雄对决
Paxos
“经典的复杂”
- 分布式共识的代名词 (1998)。
- 以难以理解和实现正确而闻名。
- 极其通用,常被视为一个算法家族(本文讨论 Multi-Paxos)。
- 在大型系统中久经考验 (如 Google Chubby)。
Raft
“现代的简洁”
- 为寻求可理解性而生 (2014)。
- 强调清晰的表述和工程实用性。
- 优先考虑简单性(例如,日志按顺序提交)。
- 迅速普及,应用广泛 (如 etcd, Consul)。
Raft 声称与 Paxos 效率相当,同时更易于理解。但论文作者通过分析发现,两者在核心机制上非常相似,都采用了基于领导者(Leader-based)的方法。
03. 共同基础:服务器状态模型
无论是 Paxos 还是 Raft,服务器在任何时刻都处于以下三种状态之一。两者都使用“任期(Term)”这一单调递增的逻辑时钟来检测过时的信息。点击状态节点查看详情。
(跟随者)
(候选人)
(领导者)
Follower (跟随者)
被动状态。只负责响应来自 Leader 和 Candidate 的 RPC 请求。如果选举超时未收到心跳,则转换为 Candidate。
04. 核心差异:领导者选举
研究发现,Paxos 和 Raft 的主要区别在于它们如何选举新的领导者,以及如何确保新领导者拥有所有已提交的日志条目(即保证安全性)。
Raft:资格预审机制
“只有最新的才能领导”
Candidate 请求投票 (RequestVote)。
Follower 进行“日志新鲜度检查”。
关键约束:
如果 Candidate 的日志不如 Follower 新,则拒绝投票。
获得多数票的 Candidate 成为 Leader。
结果:
新 Leader 保证拥有所有已提交的日志。选举过程无需传输日志条目,非常轻量。
Paxos:事后同步机制
“先当领导,再补课”
Candidate 请求投票 (RequestVote)。
Follower 通常都会投票(只要任期号更大)。
关键步骤:
Follower 在投票响应中,附带自己已有的日志条目。
Candidate 获得多数票后,必须先整合收到的日志,确保自己是最新的,然后才成为 Leader。
结果:
任何服务器都可以成为 Leader(更灵活)。但选举过程需要交换日志条目,相对较重。
05. 技术细节对比总结
特性/挑战 | Paxos | Raft |
---|---|---|
如何确保每个任期(Term)最多一个领导者? | 通过划分任期号(例如 t mod n = s)。每个任期通常只有一个预定的 Candidate。 | 允许多个 Candidate 同时竞选。但每个 Follower 在一个任期内只能投一票,确保只有一人获得多数票。 |
如何确保新领导者的日志包含所有已提交条目? | 投票响应包含日志条目。Candidate 收集并整合来自多数派的日志(选择最高任期号的条目)。 | 引入“日志新鲜度检查”。只有日志足够新的 Candidate 才能获得投票并当选。 |
如何安全地提交之前任期的日志条目? | 新 Leader 将之前任期的条目用自己的新任期号重新写入日志,然后按正常流程复制和提交。 | 新 Leader 复制条目时保留原始任期号。必须等到当前任期的一个新条目被提交后,才能认为旧条目安全提交。 |
06. 评估与结论
🤔 可理解性
Raft 的一个关键优势是日志条目的任期号永不改变,这比 Paxos 中条目可能被新 Leader 用新任期号覆盖(虽然安全)更直观。但 Raft 的提交规则(需要当前任期条目才能提交旧条目)也增加了微妙的复杂性。
论文结论:Raft 的方法比 Paxos 稍微容易理解一些,但差异并不显著。Raft 的可理解性很大程度上来自于论文清晰的表述和实用的抽象。
⚡ 效率
Raft 可能会因为“选票分裂”导致选举时间更长(通过随机超时缓解)。但 Paxos 在选举期间必须传输日志数据。
论文结论:Raft 的领导者选举阶段比 Paxos 更轻量。考虑到其简单性,Raft 的方法出人意料地高效,因为它不需要在选举期间交换日志条目。
最终总结
Paxos 和 Raft 采用非常相似的方法来实现分布式共识。通过使用 Raft 的术语和抽象来描述简化的 Paxos,研究表明两者仅在领导者选举方面有所不同。两者在可理解性上没有显著差异,而 Raft 提供了一种更轻量级的选举机制。