引言
作为分布式一致性领域的奠基性协议,Paxos算法通过多提案竞争机制与两阶段承诺规则,为解决异步网络环境下的共识难题提供了数学证明级别的理论框架。该协议将节点划分为提案者(Proposer)、接受者(Acceptor)和学习者(Learner)三重角色:提案者通过全局递增提案编号(ProposalID)发起价值提议,接受者依据承诺不退化原则(仅接受更高编号提案)过滤冲突请求,最终在多数派节点间形成确定性决议。其Prepare-Accept双阶段提交机制,既通过最大提案继承策略规避了脑裂风险,又依赖活锁规避设计(提案编号指数退避)解决了多提案者持续竞争的收敛难题。尽管其理论完备性使之成为Chubby、Megastore等系统的底层共识引擎,但角色动态重叠与消息爆炸问题也给工程实践带来了显著挑战,这种理想模型与落地复杂度之间的张力,恰恰推动着Raft、Zab等衍生协议在可理解性与一致性强度之间持续探索平衡点。
Paxos协议
Paxos协议的核心思想是通过多个节点之间的通信与协作,确保系统在面对部分节点故障或网络分区时,仍能就某一提案达成一致(保证分布式系统就某个值达成一致),从而维持系统的正常运行。
Paxos为了帮我们理解,抽象出三个角色和两个阶段:
- 三个角色:提案者(proposer)、接受者(acceptor)、学习者(learner)
- 三个阶段:prepare阶段、accept阶段、learn阶段
名词解释
提案(proposal)
在描述这些角色之前,我们需要先了解什么提案。在Paxos算法中提案是指需要达成共识的某一个值,或者某一个操作。paxos对其封装成一个提案,并为其生成唯一的提案编号。本文中使用<M, V>表示一个提案,其M表示提案编号,V表示需要达成共识的值。
提案者(proposer)
proposer的工作在于接收客户端请求,将其封装成提案(proposal)。并将提案(proposal)发给所有的接受者(acceptor)。根据接受者(acceptor)返回情况,控制是否需要提交该提案(proposal)即保存该提案(proposal)。
接受者(acceptor)
acceptor的工作在于参与对提案(proposal)的投票,接收和处理paxos的两个阶段的请求。
学习者(learner)
learner不参与提案和投票,只被动接收提案结果(消息不实时)。他的存在可用于扩展读性能,或者跨区域之间读操作。

两阶段过程
第一阶段Prepare:Proposer生成全局唯一且递增的ProposalID,并向Paxos集群的所有机器发送Prepare请求,此时不携带具体的value,只携带ProposalID。接收到Prepare请求的Acceptor会执行以下操作:
- 检查收到的ProposalID是否大于之前响应(在Prepare阶段响应的)的提案的最大ProposalID(可记为Max_N)。如果是,则将该ProposalID持久化为Max_N。
- 返回响应携带已经Accept的最大编号和提案内容,如果没有已经Accept的提案,则返回空。
- 承诺不会接受任何小于Max_N的提案。
第二阶段Accept:选举阶段,可以进一步分为P2a、P2b和P2c三个步骤。
P2a:Proposer发送Accept请求
一段时间后,Proposer收集到一些Prepare的回复,可能出现以下情况:
- 如果回复数量大于一半的Acceptor数量,并且所有回复的value都为空,那么 Proposer会发送Accept请求,并带上自己指定的value。
- 如果回复数量大于一半的Acceptor数量,并且部分回复的value不为空,那么Proposer会发送Accept请求,并带上具有最大ProposalID的value作为自己的提案内容。
- 如果回复数量小于等于一半的Acceptor数量,那么Proposer尝试生成一个更大的ProposalID,并回到准备阶段继续执行。
P2b:Acceptor应答Accept
当Acceptor接收到Accept请求后,会执行以下操作:
- 如果收到的ProposalID大于等于Max_N(通常是相等的),则回复提交成功,并将该ProposalID和value持久化。
- 如果收到的ProposalID小于Max_N,则不回复或回复提交失败。
P2c:Proposer统计投票
一段时间后,Proposer会收集到一些Accept的提交成功回复,可能出现以下情况:
- 如果回复数量大于一半的Acceptor数量,表示value提交成功,此时可以向所有的Proposer和Learner广播通知已经commit的value。
- 如果回复数量小于等于一半的Acceptor数量,则Proposer尝试生成一个更大的ProposalID,value使用最大ProposalID的回复中的value,并回到准备阶段继续执行。
总结一句话
不能接受小于等于当前提议编号的提议,只能接受大于当前编号的提议
看图说话
图一不完整,后面还有参谋1的accept失败返回<编号1, 进攻时间1>后,生成编号3再次进行prepare过程<编号3, 进攻时间2>,最终达成一致进攻时间2。


感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!
7835

被折叠的 条评论
为什么被折叠?



