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

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協議超級詳細解釋+簡單例項

Basic-Paxos演算法(可以先看後面的實際例子再看前面的具體介紹部分) Paxos演算法的目的 Paxos演算法的目的是為了解決分散式環境下一致性的問題。     多個節點併發操縱資料,如何保證在讀寫過程中資料的一致性,並且解決方案要能適應分散式環境下的不可靠性(系統

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

sso 使用 paxos basic 同步 有意 AR 接收消息 pro 轉載自: https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos協議超級詳細解釋+簡單實例 Basic-Paxos

基於連通性狀態壓縮的動態規劃--【插頭DP】模板超級詳細解釋

斷斷續續卡了本公舉三天的插頭dp終於搞完了,貌似好多網友也都是學了好多天才搞懂的,特別用成就感,作為一個模板160+行的dp也是醉了 首先一定要看陳丹琪的論文!一個高中女孩能讓許多大老爺們為難好多天真是厲害,然後我結合孫大神的課件充分理解了模板上的每一句話,哈哈哈,勞資看

poj 2104 K-th Number 主席樹+超級詳細解釋

題目大意:給出一段數列,讓你求[L,R]區間內第幾大的數字! 在這裡先介紹一下主席樹! 如果想了解什麼是主席樹,就先要知道線段樹,主席樹就是n棵線段樹,因為線段樹只能維護最大值或者最小值,要想求出第二大的數字怎麼辦呢?兩顆線段樹唄!好,那麼第n大呢,就可

微信公眾平臺開發例項文件 wx_sample.php 詳細解釋

<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest();//將11行的class類例項化 $wechatO

linux-CentOS7 下的 Docker最新入門教程 超級詳細 (安裝以及簡單的使用)

1、為什麼使用Docker(本人) 最近總是頻繁的在新伺服器釋出專案, 每次釋出都需要佈置專案所需要的環境特別麻煩,而且還有一臺機器需要兩個環境的狀況 例如:釋出java web 專案而言 需要下載安裝jdk 和tomcat 安裝Docker後只需要幾個命令就輕鬆搞定,

Android呼叫JNI的簡單例項(附詳細步驟)

最近想呼叫FFmepg庫來做編解碼的東西,首先就得學會使用JNI(JAVA Native Interface)呼叫。 下面做個簡單的JNI呼叫例項,中間遇到的問題及解決過程省略一萬字,查詢到的資料也都

vue-cli的構建+Vue的超級簡單例項

☞ vue-cli的構建: 0.概要(精華): # 安裝vue-cli npm install -g vue-cli # 使用vue-cli初始化專案 vue init webpack my-project # 進入到目錄 cd my-project

SSM框架下一個簡單的模糊查詢(超級詳細)

引言:模糊查詢作為後臺常用的一種查詢方式,我們可以根據相應的 關鍵字對其檢索,從而獲得所需要的記錄,本次模糊查詢我們通過名字的任何一個欄位進行匹配查詢。 如果想學習java後臺開發或者前端開發,需要各種資料,以及遇到開發中的問題,想看原始碼,可以加我的群:java愛好者學習

【演算法筆記】 關於簡單貪心的詳細解釋

1.三值排序貪心策略:統計1,2,3的個數首先在根據統計的個數規定1,2,3的區間首先,將1的區間內有3的個數時交換並統計然後,再在1的區間內找2最後,在2的區間內找3奉上pascal程式碼:progr

Mac-配置全域性環境變數與.bash_profile檔案被鎖定的解決辦法(簡單易懂,超級詳細)

全域性環境變數的檔案路徑是:/Users/admin/.bash_profile;配置全域性環境變數的步驟:1,開啟終端,路徑切換到“~“2, 輸入touch .bash_profile (這個步驟目的是,如果沒有這個檔案,可以建立一個名字為.bash_profile的檔案

詳細解讀簡單的lstm的例項

本文是初學keras這兩天來,自己仿照addition_rnn.py,寫的一個例項,資料處理稍微有些不同,但是準確性相比addition_rnn.py 差一點,下面直接貼程式碼,解釋和註釋都在程式碼裡邊。 <span style="font-family: Aria

簡單的TCP、UDP案例及各函式的詳細解釋

TCP: server #include "stdafx.h" #include<iostream> #define BUF_SZIE 64 #include "winsock2.h" #pragma comment(lib, "ws2_32.lib")

Action的實現方式和struts.xml配置的詳細解釋,Struts2的簡單執行過程(二)

我把你的頭像,設定成我的名字,此刻你便與我同在。我把你的名字,寫進我的程式碼裡面,以後,我的世界便存在著你。         “兩個蝴蝶飛”特別喜歡"java1234知識分享網"小峰的實用主義,所以本文及其系列文章均是採用實用主義,

Action的三種實現方式,struts.xml配置的詳細解釋及其簡單執行過程(二)

> 勿以惡小而為之,勿以善小而不為--------------------------劉備 > > 勸諸君,多行善事積福報,莫作惡 上一章簡單介紹了Struts2的'兩個蝴蝶飛,你好' (一),如果沒有看過,[請觀看上一章](https://www.cnblogs.com/yjltx/

SSM:spring+springmvc+mybatis框架中的XML配置文件功能詳細解釋

con initial -m and 整理 .get 尺寸 internal 頁面 SSM:spring+springmvc+mybatis框架中的XML配置文件功能詳細解釋 2016-04-14 23:40 13030人閱讀 評論(2) 收藏 舉報

圖解Http協議(二章簡單的Http協議

客戶 持久化 請求方法 體驗 cnblogs 圖解 重要 cookies logs 先放上我的思維導圖 個人感覺這個就是一個和我們平常聊天一樣 來,我們一起拿起手中的手機,體驗一把http之旅 在一個風和日麗的午後,鐵柱剛從工地搬磚回來,吃飽喝足,整了點小酒。然後抹了

set_include_path詳細解釋(轉)

好處 name efi conn 方便 ooo pre def define 首先我們來看這個全局變量:__FILE__它表示文件的完整路徑(當然包括文件名在內)也就是說它根據你文件所在的目錄不同,有著不同的值;當然,當它用在包行文件中的時候,它的值是包含的路徑;然

Sed命令的使用詳細解釋

lin 格式 next printing 操作 模式匹配 oot att mman Sed命令的使用詳細解釋 一:sed命令的簡介 sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用s

基於HTTP協議的輕量級開源簡單隊列服務:HTTPSQS[轉]

海量數據 短信 最大 ima 站內搜索 功能 .html 調用 python HTTPSQS(HTTP Simple Queue Service)是一款基於 HTTP GET/POST 協議的輕量級開源簡單消息隊列服務,使用 Tokyo Cabinet 的 B+Tree K