a.基础协议
b.完整议会协议
Proposer :提议者 Acceptor:决策者 Learner:学习者(同步决策者),每个进程可以同时担任其中的一个或者多个角色
Paxos在一个由多轮表决构成的集合上定义了3 个条件:
B1(ß): ß中的每一轮表决,都有一个唯一的编号
===================================================
B2(ß): ß中任意两轮表决的法定人数集中,至少有一个公共的牧师成员
===================================================
B3(ß):对于每一轮表决B,如果B的法定人数集中的任何一个牧师在p中一个更小轮的表决中投过赞成票,那么B的法令与所有这些更小轮表决中的最大的那次表决的法令相同
任一议员(或者牧师)需维护这三个记录:
lastTried[p]:由p 试图发起的最后一个表决的编号,如果没有发起过则记录-∞
prevVote [p] :由p投票的所有表决中,编号最大的表决对应的p的投票,如果没则记录-∞
nextBal [p]:由p发出的所有lastVote(b,v)消息中,表决编号b的最大值
(1)牧师p选择一个比lastTried[p]大的表决编写b,设置lastTried[p]为b,然后发送NextBal( b)消息给某些牧师.
------------------------------------------------------------------------------------------------------------------------
(2)q在从p收到一个b大于nextBal[q]的NextBallot(b)消息后,牧师q将nextBallot[q]设置为b,然后发送一个lastVote (b,v)消息给p,其中v等于preVote[q] (b<= nextBal [q]的消息被忽略)(如果preVote[q]为空也可以)
------------------------------------------------------------------------------------------------------------------------
(3)p 从某个多数集合Q 的每个成员都收到一个lastVote(b, v)消息后,牧师p发起一个编号为b,法定人数集为Q,法令为d的新表决,其中d的选择遵守B3(ß)条件。然后他发送一个BeginBallot(b,d)消息给Q中的每一个牧师
------------------------------------------------------------------------------------------------------------------------
(4)q在收到一个b= nextBal [q]的BeginBallot( b,d)消息后,牧师q在编号为b的表决中投出他的一票,设置prevVote[p]为这一票,然后发送Voted( b,q)消息给p (b=! nextBa[q]的BeginBallot(b, d)消息将被忽略)
------------------------------------------------------------------------------------------------------------------------
(5)在p收到Q中每一个Voted(b,d)消息后(这里Q表示b的法定人数集合,b=lastTriped,他p 将d(这轮表决的法令)记录到他的律簿上,然后发送一条Success( d )消息给每个议员(牧师)
------------------------------------------------------------------------------------------------------------------------
(6)一个牧师在接收到Success (d)消息后,将法令d写到他的律簿上。
leader选举基本协议维护了一致性,但是没有保证任何进展性,因为它仅仅规定了一个牧师可以怎么做,它没要求他一定要做任何事情
如果满足了总统选举要求,那么完整协议将具有如下特性:如果多数的议员在议会厅内,并且在T+99分钟内没有人进出会议厅. 那么在这段时间的最后,议会厅中的每个牧师的律簿上都会记下一条法令.
7 4
T T-11 | T+99 = (T+22+22) + (55)