Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。
完整的Paxos算法如下。
Paxos通过(chosen)一个指令分为两个阶段:
1. prepare阶段
p1.proposer选择一个投票时间b并将prepare请求发送给acceptors中的一个多数派;
p2.acceptor收到prepare消息后,如果投票时间大于它已经回复的所有prepare消息,则acceptor将自己上次的批准回复给proposer,并承诺不再批准投票时间小于b的投票;
2. accept阶段
a1.当一个proposer收到了多数派acceptors对prepare的回复后,就进入批准阶段。Proposer选择所有prepare回复的批准中,最大投票时间对应投票的提议作为提议。否则,如果所有的回复中都表明之前没有批准过任何提议,则proposer可以选择任何指令作为提议。最后,proposer把投票时间b和提议作为accept请求发送给所有已经回复prepare请求的acceptors。
a2.在不违背自己向其他proposer的承诺的前提下,acceptor收到accept请求后即批准这个请求。
若提议获得多数派 acceptors 的接受,则该提议通过(chosen)。
一致性证明
要证明Paxos算法的一致性,只需要证明:
-
设b2<b1,b1,b2分别为两次paxos执行的投票时间。
-
则如果b1通过的指令为v,那么b2的指令要么通不过,要么是同一个指令v。
也就是说后面通过的指令和前面通过的指令是同一个,一致性是显然的。
证明:
用归纳法。
1.由于指令v在b1次投票获得了通过。则b1次投票的a1阶段的提议一定是v。观察a1阶段的过程,这说明这时候大多数acceptor在p2阶段的所有回复中,最大投票时间对应提议为v,设这个最大投票时间为k,并且b1>k。
2观测k'(b1<k'<k)次投票的情况。首先,观察最后一次投票b1次投票中的a1阶段,大多数的acceptor在p2阶段都没有在比k更大的投票时间中投过票。因此,k'次投票通过的指令要么通不过,要么是v.
3.我们再观察k次投票的情况。首先,观察最后一次投票b1次投票中的a1阶段,大多数的acceptor在p2阶段都没有在比k更大的投票时间中投过票。然后,第1步又说明proposer在k次投票中的提议为v,否则不会有acceptor批准v.因此,k次投票通过的指令要么通不过,要么是v.
4.根据归纳法,我们可以证明对于小于k次的投票,指令要么通不过,要么是v.
命题得证。
注:完整的Paxos协议非常复杂(是我见过最复杂的通信协议),这里只是一个粗略的描述,省略了很多词汇的明确定义以及过程的详细描述。