Paxos算法

Paxos算法

Paxos算法说明

阶段一

  • Proposer选择一个提案编号Mn,然后向Acceptor的某个超过半数的子集成员发送编号Mn的Prepare请求
  • 如果一个Acceptor收到一个编号为Mn的Prepare请求,且编号Mn大于该Acceptor已经响应的所有Prepare请求的编号,那么它就会将其已批准过的最大编号的提案作为响应反馈给Proposer,同时该Acceptor会承若不会再批准任何小于Mn编号的提案。

阶段二

  • 如果Proposer收到半数以上的Acceptor对于其发出的编号为Mn的Prepare请求的响应,那么它就会发送一个针对[Mn, Vn]提案的Accept请求给Acceptor。注意,Vn的值就是收到的响应值中编号最大的提案的值,如果响应中不包含任何提案,那么它就是任意值
  • 如果Acceptor收到针对[Mn, Vn]提案的Accept请求,只要该Accept尚未对编号大于Mn的Prepare做出响应,它就可以通过这个提案。

在实际过程中,每一个Proposer都有可能会产生多个提案,但只要遵循以上流程,就能够保证算法的准确性。注意:每个Proposer都可以在任意时刻丢弃一个提案,哪怕针对该提案的请求和响应在提案被丢弃后到达,依然可以保证其在提案选定上的正确性。

提案的获取

  • 方案一
    Learner获取一个已经被选定的前提是,该提案已经被半数以上的Acceptor批准,因此最简单的做法,即一旦Acceptor批准了一个提案,就将该提案发送给所有的Learner。
    显然,该做法可以让Learner尽快地获取被选定的提案,但是却需要让每个Acceptor与所有的Learner逐个进行一次通信,通信的次数至少为二者个数的乘积。

  • 方案二
    让所有的Acceptor将他们对提案的批准情况,统一发送给“主Learner”,再由其发送给其他Learner。
    该方案的优点是大大减少了通信的次数,通常是Learner和Acceptor的个数总和,缺点是“Learner”一旦故障,系统就不能正常运行。

  • 方案三
    针对方案二存在的单点问题,设置一个特定的Learner集合,即可以将批准的提案发送给该Learner集合,集合越大越稳定,但是会增加网络的通信复杂度。

保证算法的活性

考虑一个极端的情况:

Proposer P1提出一个编号为M1的提案,并且完成了阶段一的流程;与此同时,另外一个Proposer P2提出一个编号为M2的提案(M2>M1),同样也完成了阶段一的流程。于是Acceptor会承若不再批准编号小于M2的提案。
当P1进入阶段二,其发出的Accept请求会被Acceptor忽略,于是P1再次提出新的提案M3(M3>M2),并且完成了阶段一的流程;这就导致了P2的Accept请求被Acceptor忽略,以此类推,提案的选定过程进入死循序…

解决方法:

选定一个主Proposer,并规定只有主Proposer能够提出提案,便可以避免算法进入死循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值