1. 程式人生 > >Paxos協議超級詳細解釋+簡單實例

Paxos協議超級詳細解釋+簡單實例

sso 使用 paxos basic 同步 有意 AR 接收消息 pro

轉載自: https://blog.csdn.net/cnh294141800/article/details/53768464
Paxos協議超級詳細解釋+簡單實例

Basic-Paxos算法(可以先看後面的實際例子再看前面的具體介紹部分)

Paxos算法的目的

Paxos算法的目的是為了解決分布式環境下一致性的問題。

多個節點並發操縱數據,如何保證在讀寫過程中數據的一致性,並且解決方案要能適應分布式環境下的不可靠性(系統如何就一個值達到統一

Paxos的兩個組件

Proposer

提議發起者,處理客戶端請求,將客戶端的請求發送到集群中,以便決定這個值是否可以被批準。

Acceptor

提議批準者,負責處理接收到的提議,他們的回復就是一次投票。會存儲一些狀態來決定是否接收一個值

Paxos有兩個原則

1)安全原則---保證不能做錯的事

a) 針對某個實例的表決只能有一個值被批準,不能出現一個被批準的值被另一個值覆蓋的情況;(假設有一個值被多數Acceptor批準了,那麽這個值就只能被學習)

b) 每個節點只能學習到已經被批準的值,不能學習沒有被批準的值。

2)存活原則---只要有多數服務器存活並且彼此間可以通信,最終都要做到的下列事情:

a)最終會批準某個被提議的值;

b)一個值被批準了,其他服務器最終會學習到這個值。

Paxos具體流程圖

技術分享圖片

第一階段(prepare)

1).獲取一個proposal number, n;

2).提議者向所有節點廣播prepare(n)請求;

3).接收者(Acceptors比較善變,如果還沒最終認可一個值,它就會不斷認同提案號最大的那個方案)比較n和minProposal,如果n>minProposal,表示有更新的提議minProposal=n;如果此時該接受者並沒有認可一個最終值,那麽認可這個提案,返回OK。如果此時已經有一個accptedValue, 將返回(acceptedProposal,acceptedValue);

4).提議者接收到過半數請求後,如果發現有acceptedValue返回,表示有認可的提議,保存最高acceptedProposal編號的acceptedValue到本地

第二階段(Accept)

5)廣播accept(n,value)到所有節點;

6).接收者比較n和minProposal,如果n>=minProposal,則acceptedProposal=minProposal=n,acceptedValue=value,本地持久化後,返回;

否則,拒絕並且返回minProposal

7).提議者接收到過半數請求後,如果發現有返回值>n,表示有更新的提議,跳轉1(重新發起提議);否則value達成一致。

Paxos議案ID生成算法

在Google的Chubby論文中給出了這樣一種方法:假設有n個proposer,每個編號為ir(0<=ir<n),proposal編號的任何值s都應該大於它已知的最大值,並且滿足:

s %n = ir => s = m*n + ir

proposer已知的最大值來自兩部分:proposer自己對編號自增後的值和接收到acceptor的拒絕後所得到的值。

例: 以3個proposer P1、P2、P3為例,開始m=0,編號分別為0,1,2。

1) P1提交的時候發現了P2已經提交,P2編號為1 >P1的0,因此P1重新計算編號:new P1 = 1*3+1 = 4;

2) P3以編號2提交,發現小於P1的4,因此P3重新編號:new P3 = 1*3+2 = 5。

Paxos原理

任意兩個法定集合,必定存在一個公共的成員。該性質是Paxos有效的基本保障

活鎖

當某一proposer提交的proposal被拒絕時,可能是因為acceptor 承諾返回了更大編號的proposal,因此proposer提高編號繼續提交。 如果2個proposer都發現自己的編號過低轉而提出更高編號的proposal,會導致死循環,這種情況也稱為活鎖。

比如說當此時的 proposer1提案是3, proposer2提案是4, 但acceptor承諾的編號是5,那麽此時proposer1,proposer2 都將提高編號假設分別為6,7,並試圖與accceptor連接,假設7被接受了,那麽提案5和提案6就要重新編號提交,從而不斷死循環。

異常情況——持久存儲

在算法執行的過程中會產生很多的異常情況:proposer宕機,acceptor在接收proposal後宕機,proposer接收消息後宕機,acceptor在accept後宕機,learn宕機,存儲失敗,等等。

為保證paxos算法的正確性,proposer、aceptor、learn都實現持久存儲,以做到server恢復後仍能正確參與paxos處理。

propose存儲已提交的最大proposal編號、決議編號(instance id)。

acceptor存儲已承諾(promise)的最大編號、已接受(accept)的最大編號和value、決議編號。

learn存儲已學習過的決議和編號

具體實例:

假設的3軍問題

1) 1支紅軍在山谷裏紮營,在周圍的山坡上駐紮著3支藍軍;

2) 紅軍比任意1支藍軍都要強大;如果1支藍軍單獨作戰,紅軍勝;如果2支或以上藍軍同時進攻,藍軍勝;

3) 三支藍軍需要同步他們的進攻時間;但他們惟一的通信媒介是派通信兵步行進入山谷,在那裏他們可能被俘虜,從而將信息丟失;或者為了避免被俘虜,可能在山谷停留很長時間;

4) 每支軍隊有1個參謀負責提議進攻時間;每支軍隊也有1個將軍批準參謀提出的進攻時間;很明顯,1個參謀提出的進攻時間需要獲得至少2個將軍的批準才有意義;

5) 問題:是否存在一個協議,能夠使得藍軍同步他們的進攻時間?

接下來以兩個假設的場景來演繹BasicPaxos;參謀和將軍需要遵循一些基本的規則

1) 參謀以兩階段提交(prepare/commit)的方式來發起提議,在prepare階段需要給出一個編號;

2) 在prepare階段產生沖突,將軍以編號大小來裁決,編號大的參謀勝出;

3) 參謀在prepare階段如果收到了將軍返回的已接受進攻時間,在commit階段必須使用這個返回的進攻時間;

兩個參謀先後提議的場景

技術分享圖片

1) 參謀1發起提議,派通信兵帶信給3個將軍,內容為(編號1);

2) 3個將軍收到參謀1的提議,由於之前還沒有保存任何編號,因此把(編號1)保存下來,避免遺忘;同時讓通信兵帶信回去,內容為(ok);

3) 參謀1收到至少2個將軍的回復,再次派通信兵帶信給3個將軍,內容為(編號1,進攻時間1);

4) 3個將軍收到參謀1的時間,把(編號1,進攻時間1)保存下來,避免遺忘;同時讓通信兵帶信回去,內容為(Accepted);

5) 參謀1收到至少2個將軍的(Accepted)內容,確認進攻時間已經被大家接收;

6) 參謀2發起提議,派通信兵帶信給3個將軍,內容為(編號2);

7) 3個將軍收到參謀2的提議,由於(編號2)比(編號1)大,因此把(編號2)保存下來,避免遺忘;又由於之前已經接受參謀1的提議,因此讓通信兵帶信回去,內容為(編號1,進攻時間1);

8) 參謀2收到至少2個將軍的回復,由於回復中帶來了已接受的參謀1的提議內容,參謀2因此不再提出新的進攻時間,接受參謀1提出的時間;

兩個參謀交叉提議的場景

技術分享圖片

1) 參謀1發起提議,派通信兵帶信給3個將軍,內容為(編號1);

2) 3個將軍的情況如下

a) 將軍1和將軍2收到參謀1的提議,將軍1和將軍2把(編號1)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通信兵帶信回去,內容為(ok);

b) 負責通知將軍3的通信兵被抓,因此將軍3沒收到參謀1的提議;

3) 參謀2在同一時間也發起了提議,派通信兵帶信給3個將軍,內容為(編號2);

4) 3個將軍的情況如下

a) 將軍2和將軍3收到參謀2的提議,將軍2和將軍3把(編號2)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通信兵帶信回去,內容為(ok);

b) 負責通知將軍1的通信兵被抓,因此將軍1沒收到參謀2的提議;

5) 參謀1收到至少2個將軍的回復,再次派通信兵帶信給有答復的2個將軍,內容為(編號1,進攻時間1);

6) 2個將軍的情況如下

a) 將軍1收到了(編號1,進攻時間1),和自己保存的編號相同,因此把(編號1,進攻時間1)保存下來;同時讓通信兵帶信回去,內容為(Accepted);

b) 將軍2收到了(編號1,進攻時間1),由於(編號1)小於已經保存的(編號2),因此讓通信兵帶信回去,內容為(Rejected,編號2);

7) 參謀2收到至少2個將軍的回復,再次派通信兵帶信給有答復的2個將軍,內容為(編號2,進攻時間2);

8) 將軍2和將軍3收到了(編號2,進攻時間2),和自己保存的編號相同,因此把(編號2,進攻時間2)保存下來,同時讓通信兵帶信回去,內容為(Accepted);

9) 參謀2收到至少2個將軍的(Accepted)內容,確認進攻時間已經被多數派接受;

10) 參謀1只收到了1個將軍的(Accepted)內容,同時收到一個(Rejected,編號2);參謀1重新發起提議,派通信兵帶信給3個將軍,內容為(編號3);

11) 3個將軍的情況如下

a) 將軍1收到參謀1的提議,由於(編號3)大於之前保存的(編號1),因此把(編號3)保存下來;由於將軍1已經接受參謀1前一次的提議,因此讓通信兵帶信回去,內容為(編號1,進攻時間1);

b) 將軍2收到參謀1的提議,由於(編號3)大於之前保存的(編號2),因此把(編號3)保存下來;由於將軍2已經接受參謀2的提議,因此讓通信兵帶信回去,內容為(編號2,進攻時間2);

c) 負責通知將軍3的通信兵被抓,因此將軍3沒收到參謀1的提議;

12) 參謀1收到了至少2個將軍的回復,比較兩個回復的編號大小,選擇大編號對應的進攻時間作為最新的提議;參謀1再次派通信兵帶信給有答復的2個將軍,內容為(編號3,進攻時間2);

13) 將軍1和將軍2收到了(編號3,進攻時間2),和自己保存的編號相同,因此保存(編號3,進攻時間2),同時讓通信兵帶信回去,內容為(Accepted);

14) 參謀1收到了至少2個將軍的(accepted)內容,確認進攻時間已經被多數派接受;

Paxos協議超級詳細解釋+簡單實例