paxos算法 - wiki
如下paxos算法主要是对paxos维基百科的整理。
1. 实例
我们用实际的例子来更清晰的描述上述过程:
有A1、A2、A3、A4、A5共5位议员,就税率问题进行决议。议员A1决定将税率定为10%,因此它向所有人发出一个草案。这个草案内容是:
在最简单的情况下,没有人与其竞争;信息能及时顺利的传达到其他议员处。于是,A2-A5回应:
而A1在收到2份回复后就发布最终决议:
这实际上退化为二阶段提交协议。
现在我们假设在A1提出提案的同时,A5决定将税率定为20%:
草案要通过侍从送到其他议员的案头。 A1的草案将由4位侍从送到A2-A5那里。 现在,负责A2和A3的侍从将草案顺利送达,负责A4和A5的侍从则不上班。A5的草案则顺利的送至A4和A3手中。如下图所示:
现在, A1、A2、A3收到了A1的提案; A3、A4、A5收到了A5的提案。 按照协议, A1、A2将接受A1的提案, A4、A5将接受A5的提案,侍从将拿着
的回复回到提案者那里。而A3的行为将决定批准哪一个.
情况1:
假设A1的提案先送到A3处,而A5的侍从决定放假一段时间。于是A3接受并派出了侍从。A1等到了两位侍从,再加上它自己已经构成一个多数派,于是税率10%将成为决议。 A1派出侍从将决议送到所有议员处:
A3在很久以后收到了来自A5的提案。由于税率问题已经讨论完毕,他决定不再理会。但是他要抱怨一句:
这个回复对A5可能有帮助,因为A5可能因为某种原因很久无法与外界联系了。当然更可能对A5没有任何作用,因为A5可能已经从A1处获得了刚才的决议。
情况2:
依然假设A1的提案先送到A3处,但是这次A5的侍从不是放假了,只是中途耽搁了一会。这次,A3依然会将“接受”回复给A1。但是在决议成型之前它又收到了A5的提案。这时协议有两种处理方式:
1) 如果A5的提案更早,按照传统应该由较早的提案者主持投票。现在看来两份提案的时间一样(本届议会第3年3月15日)。但是A5是个惹不起的大人物。于是A3回复:
于是,A1和A5都收到了足够的回复。这时关于税率问题就有两个提案在同时进行。但是A5知道之前有人提出税率为10%,于是A1和A5都会向全体议员广播:
这样一致性得到了保证。
2) 如果A5是一个无足轻重的小人物。这时A3不再理会他,A1不久就会广播税率定为10%
情况3:
在这个情况中,我们将看见,根据提案的时间及提案者的权势决定是否应答是有意义的。在这里,时间和提案者的权势就构成了给提案编号的依据。这样的编号符合“任何两个提案之间构成偏序”的要求。
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与外界失去了联系。等到他恢复联系,并需要得知税率情况时,他(在最简单的协议中)将提出一个提案:
这时,(在最简单的协议中)其他议员将回复: