圖解Paxos

一.簡(jiǎn)要介紹

《聊聊分布式存儲(chǔ)——問(wèn)題與矛盾》中已經(jīng)提到,在對(duì)一個(gè)分布式系統(tǒng)進(jìn)行架構(gòu)設(shè)計(jì)時(shí)财异,往往會(huì)在可用性和一致性之間反復(fù)權(quán)衡劳跃。為了解決分布式一致性問(wèn)題,產(chǎn)生了一系列一致性協(xié)議和算法邑闲。其中比較著名的有:二階段提交協(xié)議(2PC)算行、三階段提交協(xié)議(3PC)、Paxos 算法苫耸、Raft 算法等州邢。

本文主要介紹?Paxos 算法。


我們知道褪子,信息交換一般有兩種方式量淌,一種是通過(guò)共享內(nèi)存共用一份數(shù)據(jù);另一種是通過(guò)消息投遞來(lái)完成信息的傳遞嫌褪。

在分布式系統(tǒng)中呀枢,節(jié)點(diǎn)之間主要使用消息投遞方式來(lái)完成。但通過(guò)消息投遞的方式會(huì)遇到很多意外的情況笼痛,例如網(wǎng)絡(luò)問(wèn)題裙秋、進(jìn)程掛掉琅拌、機(jī)器掛掉、進(jìn)程很慢沒(méi)有響應(yīng)残吩、進(jìn)程重啟等情況财忽,這就會(huì)造成消息重復(fù)、一段時(shí)間內(nèi)部不可達(dá)等現(xiàn)象泣侮。而?Paxos 算法就是基于消息傳遞且具有高度容錯(cuò)特性的一致性算法即彪。換句話說(shuō),Paxos算法的作用就是在可能發(fā)生這些異常情況的分布式系統(tǒng)中活尊,快速且正確地在集群內(nèi)部對(duì)某個(gè)數(shù)據(jù)的值達(dá)成一致隶校。


二.背景約束

在各類介紹?Paxos 算法的文章中,都會(huì)提到著名的“拜占庭將軍問(wèn)題”蛹锰,以及偶爾也會(huì)提到的“兩軍問(wèn)題”深胳。關(guān)于這兩個(gè)問(wèn)題的詳細(xì)介紹可以閱讀這篇下面這篇文章,基本講清楚了铜犬。

拜占庭將軍問(wèn)題


簡(jiǎn)單的來(lái)說(shuō)舞终,拜占庭將軍問(wèn)題描述了這樣一個(gè)場(chǎng)景:

拜占庭帝國(guó)有許多支軍隊(duì),不同軍隊(duì)的將軍之間必須制訂一個(gè)統(tǒng)一的行動(dòng)計(jì)劃癣猾,從而做出進(jìn)攻或者撤退的決定敛劝,同時(shí),各個(gè)將軍在地理上都是被分隔開(kāi)來(lái)的纷宇,只能依靠軍隊(duì)的通訊員來(lái)進(jìn)行通訊夸盟。然而,在所有的通訊員中可能會(huì)存在叛徒像捶,這些叛徒可以任意篡改消息上陕,從而達(dá)到欺騙將軍的目的。

這就是著名的“拜占廷將軍問(wèn)題”拓春。從理論上來(lái)說(shuō)释簿,在分布式計(jì)算領(lǐng)域,試圖在異步系統(tǒng)和不可靠的通道上來(lái)達(dá)到一致性狀態(tài)是不可能的痘儡。因此在對(duì)一致性的研究過(guò)程中辕万,往往假設(shè)信道是可靠的。事實(shí)上沉删,大多數(shù)系統(tǒng)都是部署在同一個(gè)局域網(wǎng)中的渐尿,因此消息被篡改的情況非常罕見(jiàn);另一方面矾瑰,由于硬件和網(wǎng)絡(luò)原因而造成的消息不完整問(wèn)題砖茸,只需一套簡(jiǎn)單的校驗(yàn)算法即可避免——因此,在實(shí)際工程實(shí)踐中殴穴,可以假設(shè)不存在拜占庭問(wèn)題凉夯,即假設(shè)所有消息都是完整的货葬,沒(méi)有被篡改的。

三.基本思路

Paxos 算法是分布式技術(shù)大師 Lamport 提出的劲够。Lamport 為了講述這個(gè)算法震桶,假想了一個(gè)叫做 Paxos 的希臘城邦進(jìn)行選舉的情景。這個(gè)算法也是因此而得名征绎。在他的假想中蹲姐,這個(gè)城邦要采用民主提議和投票的方式選出一個(gè)最終的決議,但由于城的居民沒(méi)有人原意把全部時(shí)間和精力放在這種事情上人柿,所以他們只能不定時(shí)的來(lái)參加提議柴墩,不定時(shí)來(lái)了解提議、投票進(jìn)展凫岖,不定時(shí)的表達(dá)自己的投票意見(jiàn)江咳。?Paxos 算法的目標(biāo)就是讓他們按照少數(shù)服從多數(shù)的方式,最終達(dá)成一致意見(jiàn)哥放。


四.算法描述

主要角色

1.?Proposer(提案者/提議者):提議一個(gè)值歼指,用于被投票決議。

2.?Acceptor(附議者/接受者):對(duì)每個(gè)提議進(jìn)行投票甥雕。

3.?Learner(學(xué)習(xí)者/告知者):被告知投票的結(jié)果东臀,不參與投票過(guò)程。


執(zhí)行過(guò)程

規(guī)定一個(gè)提議包含兩個(gè)字段:[n, v]犀农,其中 n 為序號(hào)(具有唯一性),v 為提議值宰掉。


下圖演示了兩個(gè)?Proposer(提案者) 和三個(gè) Acceptor(附議者) 的系統(tǒng)中運(yùn)行該算法的初始過(guò)程呵哨,每個(gè) Proposer 都會(huì)向所有 Acceptor 發(fā)送提議請(qǐng)求。



當(dāng)?Acceptor 接收到一個(gè)提議請(qǐng)求轨奄,包含的提議為 [n1, v1]孟害,并且之前還未接收過(guò)提議請(qǐng)求,那么發(fā)送一個(gè)提議響應(yīng)挪拟,設(shè)置當(dāng)前接收到的提議為 [n1, v1]挨务,并且保證以后不會(huì)再接受序號(hào)小于 n1 的提議。


如下圖玉组,Acceptor X 在收到 [n=2, v=8] 的提議請(qǐng)求時(shí)谎柄,由于之前沒(méi)有接收過(guò)提議,因此就發(fā)送一個(gè) [no previous] (尚無(wú)提案)的提議響應(yīng)惯雳,并且設(shè)置當(dāng)前接收到的提議為 [n=2, v=8]朝巫,并且保證以后不會(huì)再接受序號(hào)小于 2 的提議。其它的 Acceptor 類似石景。


如果?Acceptor 接收到一個(gè)提議請(qǐng)求劈猿,包含的提議為 [n2, v2]拙吉,并且之前已經(jīng)接收過(guò)提議 [n1, v1]。如果 n1 > n2揪荣,那么就丟棄該提議請(qǐng)求筷黔;否則,發(fā)送提議響應(yīng)仗颈,該提議響應(yīng)包含之前已經(jīng)接收過(guò)的提議 [n1, v1]佛舱,設(shè)置當(dāng)前接收到的提議為 [n2, v2],并且保證以后不會(huì)再接受序號(hào)小于 n2 的提議揽乱。

如下圖名眉,Acceptor Z 收到 Proposer A 發(fā)來(lái)的 [n=2, v=8] 的提議請(qǐng)求,由于之前已經(jīng)接收過(guò) [n=4, v=5] 的提議凰棉,并且 n > 2损拢,因此就拋棄該提議請(qǐng)求;Acceptor X 收到 Proposer B 發(fā)來(lái)的 [n=4, v=5] 的提議請(qǐng)求撒犀,因?yàn)橹敖邮盏降奶嶙h為 [n=2, v=8]福压,并且 2 <= 4,因此就發(fā)送 [n=2, v=8] 的提議響應(yīng)或舞,設(shè)置當(dāng)前接收到的提議為 [n=4, v=5]荆姆,并且保證以后不會(huì)再接受序號(hào)小于 4 的提議。Acceptor Y 類似映凳。

當(dāng)一個(gè)?Proposer 接收到超過(guò)一半 Acceptor 的提議響應(yīng)時(shí)胆筒,就可以發(fā)送接受請(qǐng)求。


Proposer A 接收到兩個(gè)提議響應(yīng)之后诈豌,就發(fā)送 [n=2, v=8] 接受請(qǐng)求仆救。該接受請(qǐng)求會(huì)被所有 Acceptor 丟棄,因?yàn)榇藭r(shí)所有 Acceptor 都保證不接受序號(hào)小于 4 的提議矫渔。


Proposer B 過(guò)后也收到了兩個(gè)提議響應(yīng)彤蔽,因此也開(kāi)始發(fā)送接受請(qǐng)求。需要注意的是庙洼,接受請(qǐng)求的 v 需要取它收到的最大 v 值顿痪,也就是 8。因此它發(fā)送 [n=4, v=8] 的接受請(qǐng)求油够。


Acceptor 接收到接受請(qǐng)求時(shí)蚁袭,如果序號(hào)大于等于該 Acceptor 承諾的最小序號(hào),那么就發(fā)送通知給所有的 Learner(學(xué)習(xí)者)石咬。當(dāng) Learner 發(fā)現(xiàn)有大多數(shù)的 Acceptor 接收了某個(gè)提議撕阎,那么該提議的提議值就被 Paxos 選擇出來(lái)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碌补,一起剝皮案震驚了整個(gè)濱河市虏束,隨后出現(xiàn)的幾起案子棉饶,更是在濱河造成了極大的恐慌,老刑警劉巖镇匀,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件照藻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汗侵,警方通過(guò)查閱死者的電腦和手機(jī)幸缕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晰韵,“玉大人发乔,你說(shuō)我怎么就攤上這事⊙┲恚” “怎么了栏尚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)只恨。 經(jīng)常有香客問(wèn)我译仗,道長(zhǎng),這世上最難降的妖魔是什么官觅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任纵菌,我火速辦了婚禮,結(jié)果婚禮上休涤,老公的妹妹穿的比我還像新娘咱圆。我一直安慰自己,他們只是感情好功氨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布闷堡。 她就那樣靜靜地躺著,像睡著了一般疑故。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弯菊,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天纵势,我揣著相機(jī)與錄音,去河邊找鬼管钳。 笑死钦铁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的才漆。 我是一名探鬼主播牛曹,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼醇滥!你這毒婦竟也來(lái)了黎比?” 一聲冷哼從身側(cè)響起超营,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阅虫,沒(méi)想到半個(gè)月后演闭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颓帝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年米碰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片购城。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕座,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘪板,到底是詐尸還是另有隱情吴趴,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布篷帅,位于F島的核電站史侣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏魏身。R本人自食惡果不足惜惊橱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箭昵。 院中可真熱鬧税朴,春花似錦、人聲如沸家制。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颤殴。三九已至觅廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涵但,已是汗流浹背杈绸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矮瘟,地道東北人瞳脓。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像澈侠,于是被迫代替她去往敵國(guó)和親劫侧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 一.簡(jiǎn)要介紹 在《聊聊分布式存儲(chǔ)——問(wèn)題與矛盾》中已經(jīng)提到,在對(duì)一個(gè)分布式系統(tǒng)進(jìn)行架構(gòu)設(shè)計(jì)時(shí)烧栋,往往會(huì)在可用性和一致...
    左小岸禮閱讀 3,520評(píng)論 5 6
  • 理解Paxos算法 1. 背景 Paxos是一種分布式一致性算法写妥,該算法由Leslie Lamport在論文[Th...
    zeinwolf閱讀 1,459評(píng)論 0 0
  • 原文:Paxos Made Simple作者:Leslie Lamport時(shí)間:01 Nov 2001 1 Int...
    隨安居士閱讀 1,566評(píng)論 1 2
  • Paxos是什么 Paxos算法是基于消息傳遞且具有高度容錯(cuò)特性的一致性算法,是目前公認(rèn)的解決分布式一致性問(wèn)題最有...
    jiangmo閱讀 1,537評(píng)論 0 6
  • 0.前言 本文記錄筆者學(xué)習(xí)和理解區(qū)塊鏈共識(shí)算法Paxos的點(diǎn)滴劲弦,文章比較長(zhǎng)耳标,需要耐心來(lái)細(xì)細(xì)琢磨,筆者也是苦戰(zhàn)了一個(gè)...
    WallisW閱讀 3,233評(píng)論 2 14