【精品】浅谈Paxos

2017/11/01 - 数学/算法 协议

本文只涉及paxos的算法过程,不包含理论推导。

Paxos协议最终解决什么了问题?

当一个提议被多数派接受后,这个提议对应的值被选定,一旦有一个值被选定,那么只要按照协议的规则继续交互,后续被选定的值都是同一个值,也就是这个选定值的一致性问题。(可用于选举leader)

基本概念

  • Proposal Value: 提议的值
  • Proposal Number: 提议编号,要求提议编号不能冲突
  • Proposal: 提议 = 提议的值 + 提议编号
  • Proposer: 提议发起者
  • Acceptor: 提议接受者
  • Learner: 提议学习者

记{n,v}为提议编号为n,提议的值为v的提议

记(m,{n,v})为承诺了Prepare(m)请求,并接受了提议{n,v}。

每个参与者又可兼领多个角色

协议中Proposer有两个阶段。

一是Proposer向Acceptor发Prepare请求。

二是Proposer向Acceptor发Accept请求。

Acceptor则根据协议规则,对Proposer的请求作出应答。

最后Learner可以根据Acceptor的状态,学习最终被确定的值。

协议过程

第一阶段A:

Proposer选择一个提议编号n,向所有的Acceptor广播Prepare(n)请求。

第一阶段B:

Acceptor接收到Prepare(n)请求,若提议编号n比之前接收的Prepare请求都要大,则承诺将不会接收提议编号比n小的提议,并且带上之前Accept的提议中编号小于n的最大的提议,否则不予理会。

第二阶段A:

proposer得到了多数Acceptor的承诺后,如果没有发现有一个Acceptor接受过一个值,那么向所有的Acceptor发起自己的值和提议编号n,否则,从所有接受过的值中选择对应的提议编号最大的,作为提议的值,提议编号仍然为n。

第二阶段B:

Acceptor接收到提议后,如果该提议编号不违反自己做过的承诺,则接受该提议。

需要注意的是,Proposer发出Prepare(n)请求后,得到多数派的应答,然后可以随便再选择一个多数派广播Accept请求,而不一定要将Accept请求发给有应答的Acceptor,这是常见的Paxos理解误区。

上面的图例中,P1广播了Prepare请求,但是给A3的丢失,不过A1、A2成功返回了,即该Prepare请求得到多数派的应答,然后它可以广播Accept请求,但是给A1的丢了,不过A2,A3成功接受了这个提议。因为这个提议被多数派(A2,A3形成多数派)接受,我们称被多数派接受的提议对应的值被Chosen。

这个图例中,三个Acceptor之前都没有接受过Accept请求,所以不用返回接受过的提议,但是如果接受过提议,则根据第一阶段B,要带上之前Accept的提议中编号小于n的最大的提议。

Proposer广播Prepare请求之后,收到了A1和A2的应答,应答中携带了它们之前接受过的{n1, v1}和{n2, v2},Proposer则根据n1,n2的大小关系,选择较大的那个提议对应的值,比如n1 >n2,那么就选择v1作为提议的值,最后它向Acceptor广播提议{n, v1}。

fast paxos

Paxos算法在出现竞争的情况下,其收敛速度很慢,甚至可能出现活锁的情况,例如当有三个及三个以上的proposer在发送prepare请求后,很难有一个proposer收到半数以上的回复而不断地执行第一阶段的协议。因此,为了避免竞争,加快收敛的速度,在算法中引入了一个Leader这个角色,在正常情况下同时应该最多只能有一个参与者扮演Leader角色,而其它的参与者则扮演Acceptor的角色,同时所有的人又都扮演Learner的角色。只有Leader可以提出议案,从而避免了竞争使得算法能够快速地收敛而趋于一致,此时的paxos算法在本质上就退变为两阶段提交协议。在异常情况下,系统可能会出现多Leader的情况,但这并不会破坏算法对一致性的保证,此时多个Leader都可以提出自己的提案,优化的算法就退化成了原始的paxos算法。

参考资料


如果文章对您有帮助,欢迎扫描下方二维码赞助(一分也是爱噢),谢谢

Search

    一分也是爱噢 一分也是爱

    目录