Paxos 算法

共識算法:Paxos 算法


1. 目錄

[TOC]

2. 共識問題 [1]

  • 什么是共識問題覆享?
    粗略地說昔驱,該問題是在一個或多個進程提議了一個值應(yīng)當(dāng)是什么后黍瞧,使進程對這個值達(dá)成一致協(xié)定躬翁。
  • 解決什么問題昧旨?
  • 在一個計算機提議一個動作后拜轨,控制引擎的所有計算機要決定“繼續(xù)”還是“放棄”抽减。
  • 在互斥中,進程對哪個進程可以進入臨界區(qū)達(dá)成協(xié)定橄碾。
  • 在選舉中卵沉,進程對當(dāng)選進程達(dá)成協(xié)定。
  • 在全排序組播中法牲,進程對消息傳遞順序達(dá)成協(xié)定史汗。

2.1 一個例子:問題描述 [2]

假設(shè)有兩支(或多支)軍隊,他們必須做到同時進攻或同時防守拒垃,否則就會失敗停撞。所有軍隊組成一個系統(tǒng),他們必須共同動作悼瓮。問題是戈毒,如何讓他們步調(diào)一致?

現(xiàn)在不妨把軍隊看做”進程“横堡,把進攻或防守看做一個變量”行動“埋市。

  • 單機系統(tǒng)中,這個問題很容易解決命贴。用一個互斥量就搞定了道宅,類似于多線程食听。

  • 分布式系統(tǒng)中,這個問題就麻煩啦污茵。假設(shè)每個進程都在不同的服務(wù)器上樱报,他們就無法通過共享內(nèi)存達(dá)到同步。如果進程是軍隊的話省咨,軍隊之間只能通過通信兵來進行通信(消息傳遞)$枋遥基于消息傳遞的分布式軍隊系統(tǒng)會有這些問題:

  1. 如何確定另一支軍隊是否被干掉零蓉?(服務(wù)器崩潰)
  2. 如何知道通信兵是否被殺死(消息丟失)或久久未到達(dá)其他軍隊(延遲不可預(yù)知)?
  3. 如果馬路等通信信道被切斷怎么辦穷缤?(網(wǎng)絡(luò)分割)

2.2 另一個例子

在一個分布式數(shù)據(jù)庫系統(tǒng)中敌蜂,如果各節(jié)點(server,或進程)的初始狀態(tài)一致津肛,每個節(jié)點都執(zhí)行相同的操作序列章喉,那么他們最后能得到一個一致的狀態(tài)。為保證每個節(jié)點執(zhí)行相同的命令序列身坐,需要在每一條指令上執(zhí)行一個“一致性算法”以保證每個節(jié)點看到的指令一致秸脱,是分布式計算中的重要問題。

3. Paxos 的一致性原則 [3]

  • Safety (壞的事情一定不會發(fā)生)
  1. 只有被提議的值才會被選擇部蛇;
  2. 只能有一個值被批準(zhǔn)摊唇,不能出現(xiàn)第二個值把第一個覆蓋的情況;
  3. 每個節(jié)點只能學(xué)習(xí)到已經(jīng)被批準(zhǔn)的值涯鲁,不能學(xué)習(xí)沒有被批準(zhǔn)的值 巷查。
  • Liveness (好的事情最終一定會發(fā)生)
  1. 最終會批準(zhǔn)某個被提議的值;
  2. 一個值被批準(zhǔn)了抹腿,其他進程最終會學(xué)習(xí)到這個值岛请。

Paxos 只保證Safety,而不能保證Liveness警绩。

4. Paxos算法描述

4.1 假設(shè) [3]

每個server都可以擔(dān)任三種角色:提案者(Proposer)崇败、接受者(Acceptor)、學(xué)習(xí)者(Learner)肩祥。提案者負(fù)責(zé)提出提案(proposal)僚匆,接受者負(fù)責(zé)通過提案,而學(xué)習(xí)者負(fù)責(zé)更新提案搭幻。

每個提案都會被分配一個自然數(shù)$n$作為ID咧擂,以及一個需要提出的值$v$。

4.2 選擇一個值(Choosing a Value) [3]

階段一
a. 提案者選擇一個提案(proposal)編號$n$檀蹋,向接受者多數(shù)派組播一個prepare請求松申。
b. 如果一個接受者收到一個prepare請求云芦,并且編號$n$是所有他已經(jīng)通過的prepare請求中最大的,那么他會同意這個新的prepare請求贸桶,并承諾不會再同意任何比$n$小的prepare請求和accept請求舅逸。

階段二
a. 如果提案者收到一個接受者多數(shù)派的回應(yīng)prepare_ok(n,na, va)皇筛,那么他就選出最大的$n_a$所對應(yīng)的$v_a$琉历。或者水醋,若所有回應(yīng)中$v_a$都為空旗笔,也就是還沒有同意過任何提案,那么就選擇自己的$v$拄踪。然后發(fā)送accept(n,v)請求蝇恶。
b. 如果一個接受者收到一個 accept(n,v) 請求,并且$n$大于所有它 prepare 過的$n_p$惶桐,那么他就接受這個$v$撮弧,然后回復(fù) accept_ok(n)

4.3 學(xué)習(xí)一個值(Learning a Chosen Value)

當(dāng)一個提案被多數(shù)派通過姚糊,這提案者就向所有人(servers)發(fā)送decided(v)贿衍,貫徹與落實這個$v$。

4.4 Paxos偽代碼[4]

# Proposer
proposer(v):
    while not decided:
        n = heigher(N[:])  # 嘗試分配一個當(dāng)前最大的n值給這個proposal
        send prepare(n)     # 向所有acceptor發(fā)送prepare request
        # 若大部分返回ok:
        if prepare_ok(n, na, va) from majority:
            # 從{na...}中選出最大的那個和對應(yīng)的va救恨,令v=va舌厨;否則,就選自己的v
            v = va with heighest na; otherwise choose its own v
         
            send accept(n, v) to all  # 向所有acceptor發(fā)送accept request
            if accept_ok(n) from majority:
                send decided(v) to all  # 決定v并通知所有成員

# Acceptor
acceptor state on each node (persistent):
    np      # 最大的promise值
    na, va  # 最大的accepted值
    
    prepare(n) handler:
        if n > np:
            n = np
            send prepare_ok(n)  # 承諾不再接受任何比 n 小的proposal
        else:
            send prepare_reject
    
    accept(n, v) handler:
        if n >= np:
            na = n
            va = v
            send accept_ok(n)
        else:
            send accept_reject

直觀理解

這里寫圖片描述

這里寫圖片描述

容錯性分析(Fault tolerant) [5]

究竟Paxos是如何保證一致性的呢忿薇?例子如下裙椭。

3.1服務(wù)器崩潰(crash)

若有 $2f+1$ 臺服務(wù)器,則最多可以容忍 $f$ 臺服務(wù)器崩潰署浩。下面舉一個簡單的例子揉燃,假設(shè)一個分布式系統(tǒng)由5個servers組成,其中2個在任意時刻崩潰筋栋。存在兩種情況:1.AcceptorLearner崩潰了炊汤;2.Leader崩潰了。

3.1.1. Acceptor 崩潰

如下圖所示弊攘,S1Leader抢腐,當(dāng)其發(fā)出Accept請求時,S4S5崩潰了襟交。但是S1迈倍,S2S3仍然構(gòu)成多數(shù)派捣域,所以$v$仍然可以被決定下來啼染。

acceptor crash

3.1.2. Leader 崩潰

Learder崩潰要稍微麻煩一點宴合。首先要有錯誤檢測,發(fā)現(xiàn)leader S1掛了迹鹅。然后卦洽,因為沒有l(wèi)eader了,所以要重新選舉斜棚。如圖阀蒂,S1S5掛了弟蚀,但是S2蚤霞,S2S3仍然構(gòu)成多數(shù)派粗梭。S2發(fā)出prepare請求争便,S3级零,S4返回最近接受的$v_1$断医,$v_1$再次被S2請求接受。于是$v_1$還是成功被決定下來了奏纪。

leader crash

3.2 網(wǎng)絡(luò)分割(network partitioning)

另一種常見錯誤是網(wǎng)絡(luò)分割鉴嗤。如下圖所示,S1序调,S2S3醉锅,S4S5之間的通信被斷開发绢,分成了兩個子網(wǎng)絡(luò)硬耍。在這種悲催的情況下,系統(tǒng)仍然可以達(dá)成共識边酒。
一旦發(fā)生分割经柴,通過錯誤檢測是可以發(fā)現(xiàn)的,例如超時墩朦。然后多數(shù)派一方就會進行重新選舉坯认,如圖,S3成為新leader氓涣。系統(tǒng)又可以正常運作了牛哺。
不過,問題還沒完劳吠。如果網(wǎng)絡(luò)通信在某一時刻又恢復(fù)正常引润,分布式系統(tǒng)中就會同時存在兩個leader!Paxos還可以保證共識嗎痒玩?是可以的椰拒。因為$n_2>n_1$晶渠,S3~S4 已經(jīng)承諾不再接受比$n_2$小的提案了。所以老leader S1的提案$(n_1,v_1)$會被拒絕燃观,而S3的提案$(n_2,v')$會獲得通過褒脯。

network partitioning

3.3 消息丟失(message lost)

由于網(wǎng)絡(luò)層是不可靠的,消息丟失和延時是無法避免的缆毁。應(yīng)對這類錯誤的主要方法還是重傳番川。

參考文獻


  1. 分布式系統(tǒng):概念與設(shè)計, 共識和相關(guān)問題 系統(tǒng)模型和問題定義 ?

  2. 分布式系統(tǒng):概念與設(shè)計脊框, 共識和相關(guān)問題 同步系統(tǒng)中的共識問題 ?

  3. Lamport,L: Paxos Made Simple. ACM Trans. on Comp. Syst. ? ? ?

  4. MIT 6.824 Lab 3: Paxos-based Key/Value Service ?

  5. Tutorial Summary: Paxos Explained from Scratch ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颁督,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浇雹,更是在濱河造成了極大的恐慌沉御,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭灵,死亡現(xiàn)場離奇詭異吠裆,居然都是意外死亡,警方通過查閱死者的電腦和手機烂完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門试疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抠蚣,你說我怎么就攤上這事祝旷。” “怎么了嘶窄?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵怀跛,是天一觀的道長。 經(jīng)常有香客問我柄冲,道長吻谋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任羊初,我火速辦了婚禮滨溉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘长赞。我一直安慰自己晦攒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布得哆。 她就那樣靜靜地躺著脯颜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贩据。 梳的紋絲不亂的頭發(fā)上栋操,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天闸餐,我揣著相機與錄音,去河邊找鬼矾芙。 笑死舍沙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剔宪。 我是一名探鬼主播拂铡,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼葱绒!你這毒婦竟也來了感帅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤地淀,失蹤者是張志新(化名)和其女友劉穎失球,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮毁,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡实苞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了作箍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硬梁。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡前硫,死狀恐怖胞得,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屹电,我是刑警寧澤阶剑,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站危号,受9級特大地震影響牧愁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜外莲,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一猪半、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偷线,春花似錦磨确、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亥曹,卻和暖如春邓了,著一層夾襖步出監(jiān)牢的瞬間恨诱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工骗炉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照宝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓句葵,卻偏偏與公主長得像硫豆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笼呆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Paxos是什么 Paxos算法是基于消息傳遞且具有高度容錯特性的一致性算法熊响,是目前公認(rèn)的解決分布式一致性問題最有...
    jiangmo閱讀 1,528評論 0 6
  • 持續(xù)更新 如何淺顯易懂地解說 Paxos 的算法? 參考資料 #8:知行學(xué)社的分布式系統(tǒng)與Paxos算法視頻課程诗赌,...
    xiewen閱讀 16,674評論 0 44
  • 引言 有人說分布式系統(tǒng)里面就是可用性汗茄,可擴展性,可靠性铭若,一致性洪碳,性能等各種特性之間的trade off,沒有一個功...
    ssdutzs閱讀 1,722評論 2 3
  • Paxos算法與Zookeeper分析 1 Paxos算法 1.1基本定義 算法中的參與者主要分為三個角色叼屠,同時每...
    meng_philip123閱讀 657評論 0 11
  • 1.來源 Paxos算法是萊斯利·蘭伯特(Leslie Lamport)于1990年提出的一種基于消息傳遞的一致性...
    Lane0x閱讀 898評論 0 3