Paxos算法是一个在可能出现非拜占庭故障的分布式系统中,指导多个节点就某个值达成一致,从而保证系统一致性的共识算法。
Paxos算法解决的问题就是在分布式系统中如何就某个值(决议)达成一致。
共识算法的三个性质:
继而,可以从上述性质中提炼出两个属性:
提案:包含提案编号和提案值。
提案者:提出议案。
接受者:参与决议提案。
学习者:不参与决议,学习被批准的提案。
一旦某个值被批准,未来的提案就必须提案该值。
若超过半数的接受者采纳提案,则该提案被批准。
在第一个提议者发来 A c c e p t Accept Accept请求之前,第二个提议者发来 P r e p a r e Prepare Prepare信息,并导致接收者收到的最大编号更新,继而使第一个提议者发来的 A c c e p t Accept Accept请求被拒绝(因为第二个提议者的 P r e p a r e Prepare Prepare提案使接受者的最大编号更新,从而比第一个提案者发的Accept中的编号更大)。反复如此,接收者会陷入不断更新其最大编号的循环中,陷入活锁状态。
解决方法:
1.若提议者发现Accept消息没有被接受,则等待一个随机事件再重新发送Prepare,让出机会,减少一直互相抢占的可能性。
2.选取一个主proposer,只有主proposer才能提出提案。
提案者和接受者为进程 P i P_i Pi
进程 P i P_i Pi的第x个事件为 e i x e_i^x eix
进程 P i P_i Pi到进程 P j P_j Pj的信道为 C i j C_{ij} Cij
进程 P i P_i Pi发给进程 P j P_j Pj的消息为 M i j M_{ij} Mij
e i → m s g e j e_i \rightarrow _{msg} e_j ei→msgej
∀ P j ∈ A \forall P_j\in A ∀Pj∈A,提案者 P i P_i Pi通过信道 C i j C_{ij} Cij发送 M i j = P r e p a r e P r o p o s a l ( N , N i l ) M_{ij}=Prepare~Proposal(N,Nil) Mij=Prepare Proposal(N,Nil),其中 A A A为超过半数的接受者集合。
e j → m s g e i e_j \rightarrow _{msg} e_i ej→msgei
∀ P j ∈ A \forall P_j\in A ∀Pj∈A, P j P_j Pj接收到 P r e p a r e P r o p o s a l ( N , N i l ) Prepare~Proposal(N,Nil) Prepare Proposal(N,Nil)后。若 N ≥ N ′ N\geq N' N≥N′,则 P j P_j Pj通过信道 C j i C_{ji} Cji返回 M j i = P r o m i s e ( N ′ ′ , V ′ ′ ) M_{ji}=Promise(N'',V'') Mji=Promise(N′′,V′′)。否则 R e j e c t Reject Reject。其中 N ′ N' N′为 P j P_j Pj收到过的最大提案编号, N ′ N' N′是 P j P_j Pj接受的最大提案编号, V ′ ′ V'' V′′为对应的提案值。若 P j P_j Pj未接受过任何提案,则 P r o m i s e = N i l Promise=Nil Promise=Nil。
e i → m s g e j e_i \rightarrow _{msg} e_j ei→msgej
∀ P j ∈ A \forall P_j\in A ∀Pj∈A,提案者 P i P_i Pi通过信道 C i j C_{ij} Cij发送 M i j = A c c e p t M e s s a g e ( N , V ′ ′ ′ ) M_{ij}=Accept~Message(N,V''') Mij=Accept Message(N,V′′′),其中 A A A为超过半数的接受者集合, V ′ ′ ′ V''' V′′′提案者 P i P_i Pi收到的所有 P r o m i s e Promise Promise中最大编号对应的提案值,若 P r o m i s e Promise Promise均为 N i l Nil Nil,则可以任意指定 V ′ ′ ′ V''' V′′′。
e j → m s g e i e_j \rightarrow _{msg} e_i ej→msgei
∀ P j ∈ A \forall P_j\in A ∀Pj∈A, P j P_j Pj接收到 A c c e p t M e s s a g e ( N , V ′ ′ ′ ) Accept~Message(N,V''') Accept Message(N,V′′′)后,若 N ≥ N ′ N\geq N' N≥N′,则 P j P_j Pj接受该提案,否则 R e j e c t Reject Reject。其中 N ′ N' N′为 P j P_j Pj收到过的最大提案编号。
最终,若 ∀ P j ∈ A \forall P_j\in A ∀Pj∈A,均有 P j P_j Pj接受了该提案,则该提案被批准。