Paxos协议详解:分布式系统如何通过多数派协商达成数据一致

引言

作为分布式一致性领域的奠基性协议,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。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值