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

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

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

Paxos算法的目的算法

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

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

Paxos的兩個組件服務器

Proposer併發

提議發起者,處理客戶端請求,將客戶端的請求發送到集羣中,以便決定這個值是否能夠被批准。分佈式

Acceptor學習

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

Paxos有兩個原則.net

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 P一、P二、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)內容,確認進攻時間已經被多數派接受;

相關文章
相關標籤/搜索