Paxos算法

Paxos算法

1.概念

Paxos算法是一个在可能出现非拜占庭故障的分布式系统中,指导多个节点就某个值达成一致,从而保证系统一致性的共识算法。

Paxos算法解决的问题就是在分布式系统中如何就某个值(决议)达成一致。

共识算法的三个性质:

  • 终止性:所有正确的进程最终都会认同某个值。
  • 协定性:所有正确的进程最终认同的值是同一个值。
  • 完整性:如果正确的进程都提议同一个值 v v v,那么任何正确进程最终认同的值一定是 v v v

继而,可以从上述性质中提炼出两个属性:

  • 安全性:所有正确的进程最终都会认同同一个值。
  • 活性:系统最终会认同某一个值。

提案:包含提案编号和提案值。
提案者:提出议案。
接受者:参与决议提案。
学习者:不参与决议,学习被批准的提案。

一旦某个值被批准,未来的提案就必须提案该值。

2.流程

Round One

  • 1.1
    提案者向超过半数接受者发出一个 P r e p a r e Prepare Prepare议案,只包含提案编号 n n n
  • 1.2
    接受者收到议案后。
          ~~~~~      若提案编号 n > n> n>之前收到过的最大提案值 n ′ n' n,则返回 P r o m i s e Promise Promise响应,包含之前接受的最大提案编号 n ′ ′ n'' n′′和对应的提案值 v ′ ′ v'' v′′。若之前没接受任何提案,则返回 N i l Nil Nil
          ~~~~~      否则,返回 R e j e c t Reject Reject

Round Two

  • 2.1
    若提案者收到超过半数的 P r o m i s e Promise Promise响应,则继续向接收者发送 A c c e p t ( n , v ′ ′ ′ ) Accept(n,v''') Accept(n,v′′′)请求,包含提案编号 n n n以及 P r o m i s e Promise Promise中最大的提案编号 n ′ ′ ′ n''' n′′′对应的提案值 v ′ ′ ′ v''' v′′′。如果 P r o m i s e Promise Promise中都是 N i l Nil Nil,则 v ′ ′ ′ v''' v′′′可以任意指定。
  • 2.2
    接受者收到 A c c e p t ( n , v ′ ′ ′ ) Accept(n,v''') Accept(n,v′′′)请求后,若 n ≥ n\geq n该接受者收到过的最大提案值,则该接受者采纳该提案。

若超过半数的接受者采纳提案,则该提案被批准。

3.活锁问题

在第一个提议者发来 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中的编号更大)。反复如此,接收者会陷入不断更新其最大编号的循环中,陷入活锁状态。
Paxos算法_第1张图片
解决方法:
1.若提议者发现Accept消息没有被接受,则等待一个随机事件再重新发送Prepare,让出机会,减少一直互相抢占的可能性。
2.选取一个主proposer,只有主proposer才能提出提案。



4.符号模型描述Paxos算法

提案者和接受者为进程 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

Round One

1.1

e i → m s g e j e_i \rightarrow _{msg} e_j eimsgej

∀ P j ∈ A \forall P_j\in A PjA,提案者 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为超过半数的接受者集合。

1.2

e j → m s g e i e_j \rightarrow _{msg} e_i ejmsgei

∀ P j ∈ A \forall P_j\in A PjA 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' NN,则 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

Round Two

2.1

e i → m s g e j e_i \rightarrow _{msg} e_j eimsgej

∀ P j ∈ A \forall P_j\in A PjA,提案者 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′′′

2.2

e j → m s g e i e_j \rightarrow _{msg} e_i ejmsgei

∀ P j ∈ A \forall P_j\in A PjA 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' NN,则 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 PjA,均有 P j P_j Pj接受了该提案,则该提案被批准。

你可能感兴趣的:(分布式)