圖解Paxos協議及運行實例

關於paxos協議,看了很多資料,很少有流程圖資料,試了畫了一個,方便理解。如有錯誤歡迎指正。

一、節點角色

proposer:提案者-可以有多個, 但每一輪只能有一個被批准

acceptor:批准者- Proposer 提出的 value 必須獲得超過半數(N/2+1)的 Acceptor批准後才能通過。

learner:學習者-學習被批准的value

二、流程圖

三、實例演示

實例1:假設有有5 個 Acceptor,1 個 Proposer,不存在任何網絡、宕機異常。我們着重考察各個Accpetor 上變量 B 和變量 V 的變化,及 Proposer 上變量 b 的變化。

1. 初始狀態

2. Proposer 向所有 Accpetor 發送“Prepare(1)”,所有 Acceptor 正確處理,並回復 Promise(1, NULL)

3. Proposer 收到 5 個 Promise(1, NULL),滿足多餘半數的 Promise 的 value 爲空,此時發送
Accept(1, v 1 ),其中 v 1 是 Proposer 選擇的 Value。

4. 此時,v 1 被超過半數的 Acceptor 批准,v 1 即是本次 Paxos 協議實例批准的 Value。如果 Learner
學習 value,學到的只能是 v 1。

實例2:批准的 Value 無法改變

在同一個Paxos實例中,批准的Value是無法改變的,即使後續Proposer以更高的序號發起Paxos協議也無法改變 value。

1、5 個 Acceptor 中,有 3 個已經在第三輪 Paxos 協議批准了 v 1 作爲 value。其他兩個 Acceptor 的 V爲空,這可能是因爲 Proposer 與這兩個 Acceptor 的網絡中斷或者這兩個 Acceptor 宕機造成的。

2、此時,即使有新的 Proposer 發起協議,也無法改變結果。假設 Proposer 發送“prepare(4)消息”,由於 4 大於所有的Accpetor 的 B 值,所有收到 prepare 消息的 Acceptor 回覆 promise 消息。但前三個 Acceptor 只能回覆 promise(4, v 1 _3),後兩個 Acceptor 回覆 promise(4, NULL)。

3、無論如何,Proposer 要收到至少 3 個 Acceptor 的 promise 消息後才滿足協議中大於半數的約束,才能發送accpet消息。這3個promise消息中,至少有1個消息是promise(4, v 1 _3),按協議流程,Proposer 發送的 accept 消息只能是“accept(4, v 1 )”而不能自由選擇 value。

無論這個 accept 消息是否被各個 Acceptor 接收到,都無法改變 v 1 是被批准的 value 這一事實。即從全局看,有且只有 v 1 是滿足超過多數 Acceptor 批准的 value。例如,假設 accept(4, v 1 )消息被Acceptor 1、Acceptor2、Acceptor4 收到,那麼狀態變爲:

實例3:節點異常
這裏給一個較爲複雜的異常狀態下Paxos 運行實例。本例子中有 5 個Acceptor和 2 個 Proposer。
1. Proposer 1 發起第一輪 Paxos 協議,然而由於異常,只有 2 個 Acceptor 收到了 prepare(1)消息。

2. Proposer 1 只收到 2 個 promise 消息,無法發起 accept 消息;此時,Proposer 2 發起第二輪 Paxos協議,由於異常,只有 Acceptor 1、3、4 處理了 prepare 消息,併發送 promise(2, NULL)消息。

3. Proposer 2 收到了 Acceptor 1、3、4 的 promise(2, NULL) 消息,滿足協議超過半數的要求,選擇了 value 爲 v 1 ,廣播了 accept(2, v 1 )的消息。由於異常,只有 Accptor 3、4 處理了這個消息。

4. Proposer 1 以b=3發起新一輪的Paxos協議,由於異常,只有Acceptor 1、2、3、5處理了prepare(3)消息。

5. 由於異常,Proposer 1 只收到 Acceptor1、2、5 的 promise(3, NULL)的消息,符合協議要求,Proposer 1 選擇 value 爲 v 2 ,廣播 accept(3, v 2 )消息。由於異常,這個消息只被 Acceptor 1、2 處理。

6. 此時 Proposer 1 以 b=4 發起新的一輪 Paxos 協議,所有的 Acceptor 都處理了 prepare(4)消息。

7. 由於異常,Proposer 1 只收到了 Acceptor3 的 promise(4, v 1 _3)消息、Acceptor4 的 promise(4,v 1 _2)、Acceptor5 的 promise(4, NULL)消息,按協議要求,只能廣播 accept(4, v 1 )消息。假設 Acceptor2、3、4 收到了 accept(4, v 1 )消息。由於批准 v 1 的 Acceptor 超過半數,最終批准的 value 爲 v 1 。

注1:此處有個疑問,如果第7步收到了全部的消息改如何處理呢?猜想:按照之前流程圖來說應該是廣播accept(4,v2).

注2:zookeeper採用的是ZAB協議,並非paxos協議,後面會介紹ZAB協議。(參考《從Paxos到ZooKeeper 分佈式一致性原理與實踐》)

 

參考資料:

《分佈式系統原理》--劉傑

lamport的論文:https://www.microsoft.com/en-us/research/publication/paxos-made-simple/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fum%2Fpeople%2Flamport%2Fpubs%2Fpaxos-simple.pdf

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