詳解Paxos算法

Paxos算法是什麼?

Paxos算法是萊斯利.蘭伯特1990年提出的一種基於消息傳遞的、具有高容錯性的一致性算法

算法描述

算法角色描述

Paxos算法中有三種角色,分別具有三種不同的行爲,一個進程可能同時充當多個角色。
Proposer: 提案的提議者。
Acceptor: 提案的表決者。超過半數的Acceptor同意了提案,則表示提案通過。
Learners:提案的學習者,當提案通過時,需執行提案。
一個集羣中可能會存在多個提案者(Proposer)和多個表決者(Acceptor).

算法需保證以下幾點:

  • 每個提議者(Proposer)在提出提案時都會首先獲得一個全局唯一的、遞增的提案號N。
  • 表決者(Acceptor)在同意提案時會將提案編號N保存到本地,承諾後續只會同意編號大於N的提案。
  • 一旦一個題案被選定(超過半數的Acceptor同意了提案),則其他服務器會主動同步(Learn)該提案。
算法過程描述

Paxos算法的執行過程有兩個階段:準備階段(prepare)和接受階段(accept)。
1.準備階段
提議者(Proposer)準備提交一個提案,這是會獲取一個提案編號N,然後將N發送給所有的表決者(Acceptor),用於判斷集羣是否支持該編號的提議。
每個表決者(Acceptor)本地都保存了曾經同意過的提案的最大編號N,有上訴請求來時,會判斷N和本地保存的N誰大,
如果下於本地N,則不迴應
如果N大於本地N,則認爲該提議的編號是可以接受的,當前表決者會將N記錄下來,並將其曾經接受的最大提案Proposal(myid,maxN,value)反饋給提議者。
myid:當前表決者的id,
maxN:表決者本地緩存的最大編號N
value:緩存的最大編號N的提議內容。

2.接受階段
①當提議者(Proposer)的編號N收到超過半數的表決者(Acceptor)響應時,就可以將真正的提案Proposal(N,value)發送給所有的表決者。
②表決者收到提案請求後會再次取出本地緩存的最大提案號N與當前請求的提案號N比較(再次比較是因爲提議者不止一個,在這期間有可能表決者本地緩存的提案號N已經被其它提議者的請求替換了),如果提案號大於本地緩存的編號N,則該提議者反饋,表示同意提案,如果下於則不響應。
③如果提議者沒有收到超過半數表決者(Acceptor)的反饋,則重新走準備階段的流程,如果超過半數則會向外廣播信息:
向曾經通過該提案的Acceptor發送“可執行數據同步”信息,即讓他們執行提案;
向未曾反饋的Acceptor發送“提案+可執行數據同步”信號,讓他們也接受提案並執行。

Paxos算法的活鎖問題

如果大家理解了上訴步驟,就應該知道會存在這樣一個問題,一個提議者的提案可能一直通過不了,在算法的兩個階段都有可能導致提案不能通過,一直重複提案。這就是活鎖問題。
解決方法:改進Paxos算法,比如Fast Paxos算法(只允許一個提議者)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章