一、Paxos算法的描述
通过一个决议分为两个阶段:
1、prepare阶段:
(1) proposer选择一个提案编号n并将prepare请求发送给acceptors中的一个多数派;
(2) acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提案回复给proposer,并承诺不再回复小于n的提案;
2、批准阶段:
(1) 当一个proposer收到了多数acceptors对prepare的回复后,就进入批准阶段。它要向回复prepare请求的acceptors发送accept请求,包括编号n和根据P2c决定的value(如果根据P2c没有已经接受的value,那么它可以自由决定value)。
(2) 在不违背自己向其他proposer的承诺的前提下,acceptor收到accept请求后即接受这个请求。
这个过程在任何时候中断都可以保证正确性。例如如果一个proposer发现已经有其他proposers提出了编号更高的提案,则有必要中断这个过程。因此为了优化,在上述prepare过程中,如果一个acceptor发现存在一个更高编号的提案,则需要通知proposer,提醒其中断这次提案。
二、Paxos算法的实例描述
有A1, A2, A3, A4, A5 5位议员,就税率问题进行决议。议员A1决定将税率定为10%,因此它向所有人发出一个草案。这个草案的内容是:
现有的税率是什么?如果没有决定,则建议将其定为10%.时间:本届议会第3年3月15日;提案者:A1
在最简单的情况下,没有人与其竞争;信息能及时顺利地传达到其它议员处。
于是, A2-A5回应:
我已收到你的提案,等待最终批准
而A1在收到2份回复后就发布最终决议:
税率已定为10%,新的提案不得再讨论本问题。
这实际上退化为二阶段提交协议。
现在我们假设在A1提出提案的同时, A5决定将税率定为20%:
现有的税率是什么?如果没有决定,则建议将其定为20%.时间:本届议会第3年3月15日;提案者:A5
草案要通过侍从送到其它议员的案头。 A1的草案将由4位侍从送到A2-A5那里。现在,负责A2和A3的侍从将草案顺利送达,负责A4和A5的侍从则不上班. A5的草案则顺利的送至A2和A3手中。
现在, A1, A2, A3收到了A1的提案; A2, A3, A5收到了A5的提案。按照协议, A1, A2, A4, A5将接受他们收到的提案,侍从将拿着
我已收到你的提案,等待最终批准
的回复回到提案者那里。而A3的行为将决定批准哪一个。
情况一:
假设A1的提案先送到A3处,而A5的侍从决定放假一段时间。于是A3接受并派出了侍从. A1等到了两位侍从,加上它自己已经构成一个多数派,于是税率10%将成为决议. A1派出侍从将决议送到所有议员处:
税率已定为10%,新的提案不得再讨论本问题。
A3在很久以后收到了来自A5的提案。由于税率问题已经讨论完毕,他决定不再理会。但是他要抱怨一句:
税率已在之前的投票中定为10%,你不要再来烦我!
这个回复对A5可能有帮助,因为A5可能因为某种原因很久无法与与外界联系了。当然更可能对A5没有任何作用,因为A5可能已经从A1处获得了刚才的决议。
情况二:
依然假设A1的提案先送到A3处,但是这次A5的侍从不是放假了,只是中途耽搁了一会。这次, A3依然会将"接受"回复给A1.但是在决议成型之前它又收到了A5的提案。这时协议有两种处理方式:
1、如果A5的提案更早,按照传统应该由较早的提案者主持投票。现在看来两份提案的时间一样(本届议会第3年3月15日)。但是A5是个惹不起的大人物。于是A3回复:
我已收到您的提案,等待最终批准,但是您之前有人提出将税率定为10%,请明察。
于是, A1和A5都收到了足够的回复。这时关于税率问题就有两个提案在同时进行。但是A5知道之前有人提出税率为10%.于是A1和A5都会向全体议员广播:
税率已定为10%,新的提案不得再讨论本问题。
一致性得到了保证。
2.、A5是个无足轻重的小人物。这时A3不再理会他, A1不久后就会广播税率定为10%.
情况三:
在这个情况中,我们将看见,根据提案的时间及提案者的权势决定是否应答是有意义的。在这里,时间和提案者的权势就构成了给提案编号的依据。这样的编号符合"任何两个提案之间构成偏序"的要求。
A1和A5同样提出上述提案,这时A1可以正常联系A2和A3; A5也可以正常联系这两个人。这次A2先收到A1的提案; A3则先收到A5的提案. A5更有权势。
在这种情况下,已经回答A1的A2发现有比A1更有权势的A5提出了税率20%的新提案,于是回复A5说:
我已收到您的提案,等待最终批准。
而回复了A5的A3发现新的提案者A1是个小人物,不予理会。
A1没有达到多数,A5达到了,于是A5将主持投票,决议的内容是A5提出的税率20%。
如果A3决定平等地对待每一位议员,对A1做出"你之前有人提出将税率定为20%"的回复,则将造成混乱。这种情况下A1和A5都将试图主持投票,但是这次两份提案的内容不同。
这种情况下, A3若对A1进行回复,只能说:
有更大的人物关注此事,请等待他做出决定。
另外,在这种情况下, A4与外界失去了联系。等到他恢复联系,并需要得知税率情况时,他(在最简单的协议中)将提出一个提案:
现有的税率是什么?如果没有决定,则建议将其定为15%.时间:本届议会第3年4月1日;提案者:A4
这时,(在最简单的协议中)其他议员将会回复:
税率已在之前的投票中定为20%,你不要再来烦我!