關(guān)于Paxos的理解

Paxos作用

功能: 在多個(gè)節(jié)點(diǎn)協(xié)同工作的場(chǎng)景下,一致性地決定一個(gè)變量的值

理解的重點(diǎn)

在每一個(gè)中間條件被推導(dǎo)出來(lái)的時(shí)候晾虑,都必須思考一下玉组,Paxos如何保持節(jié)點(diǎn)之間的一致性静袖。是預(yù)設(shè)條件還是條件中已經(jīng)包含了一致性寡痰。

Paxos模型

下面使用論文中的模型敘述推導(dǎo)過(guò)程(省去listener以簡(jiǎn)化模型)抗楔,其中:

  • 實(shí)體
    • Value(決議): 變量的值棋凳,下面會(huì)用v代稱(chēng)
    • Proposal(議案): 包含決議和一個(gè)唯一的id,下面會(huì)用p{n, v}代稱(chēng)
    • proposer(提案人): 提出議案的節(jié)點(diǎn)
    • accepter(接受人): 決定議案是否被接受的節(jié)點(diǎn)
  • 動(dòng)作
    • prepare request: 由proposer發(fā)起
    • response(回應(yīng)): accepter對(duì)proposer的prepare request的回應(yīng)
    • choose(選擇) / accept(確認(rèn)): accepter對(duì)proposer的accept request的回應(yīng)连躏。

Paxos的推導(dǎo)

那么現(xiàn)在就需要從必要條件剩岳,推導(dǎo)出可實(shí)行的充分條件。在滿(mǎn)足這些充分條件的情況下入热,就能得出變量的值一致這個(gè)斷言拍棕。

  1. 模型等價(jià)必要條件: 多數(shù)派accepter選擇了同一個(gè)決議

  2. 那么可以先推導(dǎo)出充分條件的一部分:

P1: 每個(gè)accepter必須接受他第一個(gè)收到的決議

其中P1可以充分保證,即使僅僅一個(gè)Proposer提出了一個(gè)決議才顿,這個(gè)決議也會(huì)被選擇。假如沒(méi)有P1尤蒿,那么accepter完全可以等待永遠(yuǎn)不會(huì)到來(lái)的下一個(gè)決議郑气,那么最終可能出現(xiàn)無(wú)休止等待的結(jié)果。P1保證了accepter最終將選擇一個(gè)決議腰池。

但是P1仍然不能充分保證尾组,多數(shù)派accepter選擇同一個(gè)決議。比如一共三個(gè)accepter示弓,都各自選擇了不同的決議的情況讳侨。所以我們需要完善P1,引出P2去充分保證奏属,多數(shù)派accepter選擇同一個(gè)決議跨跨。

P2: 如果一個(gè)決議v被多數(shù)派選擇,那么編號(hào)更高且被選擇的決議囱皿,必須包含v

首先描述一下新的模型: proposer可以提出議案勇婴,accepter可以批準(zhǔn)多個(gè)議案,每個(gè)議案包含一個(gè)決議和唯一編號(hào)嘱腥。那么我們現(xiàn)在想要推導(dǎo)的條件變成了耕渴,多數(shù)派accepter選擇了同一個(gè)提案。這個(gè)新條件蘊(yùn)含前一個(gè)模型的條件(多數(shù)派accepter選擇了同一個(gè)決議)齿兔。

下面詳細(xì)推理一下P2是如何解決多數(shù)派這個(gè)問(wèn)題的橱脸。因?yàn)榇蠖鄶?shù)中文論壇上并沒(méi)有詳細(xì)描述,所以我用榆木腦子腦補(bǔ)了一天分苇,得到了P2的完整詳細(xì)描述:

  1. 多數(shù)派選擇提案添诉,并不意味著多數(shù)派的accepter全部已經(jīng)選擇了提盤(pán)p{n,v},而是多數(shù)派中所有accepter医寿,或者選擇了提案p{n,v}吻商,或者還沒(méi)有選擇任何提案
  2. 如果一個(gè)決議v被任意多數(shù)派選擇,這意味著只要存在足夠的 選擇了決議v的accepter沒(méi)有選擇任何決議的accepter糟红,這兩者的數(shù)量和超過(guò)半數(shù)艾帐。那么這兩個(gè)集合就可以組合成一個(gè)選擇了決議v的多數(shù)派
  3. 編號(hào)更高且被選擇的提案包含v乌叶,這意味著所有accepter在2條件達(dá)成以后,所能選擇的決議一定是v柒爸。這樣2條件中的多數(shù)派中准浴,沒(méi)有選擇任何提案的accepter,最后選擇的決議也一定是v捎稚,防止了翻轉(zhuǎn)乐横。
  4. 最重要的就是保證多數(shù)派的弱一致性,無(wú)論通信今野、計(jì)算是否異步葡公,請(qǐng)求到達(dá)順序、中間過(guò)程如何条霜,多數(shù)派都會(huì)達(dá)到最終一致的狀態(tài)催什,選擇了同一個(gè)提案。最終使用了二階段執(zhí)行宰睡,來(lái)保證多數(shù)派的弱一致性蒲凶。

為了保證多數(shù)派一致性,P2并不類(lèi)似與P1拆内,要求單節(jié)點(diǎn)選擇第一個(gè)收到的提案旋圆。所以P2也蘊(yùn)含了一個(gè)風(fēng)險(xiǎn),因?yàn)椴粩嗟絹?lái)的新提案麸恍,永遠(yuǎn)無(wú)法到達(dá)最終一致的狀態(tài)灵巧。

P2A. 如果一個(gè)議案{n, v}被選擇,那么任何acceptor批準(zhǔn)的議案(編號(hào)更高)包含的決議都是v抹沪。

相比P2孩等,P2A的要求更加具體,容易實(shí)現(xiàn)采够。同時(shí)P2A包含P2肄方。

P2B. 如果一個(gè)議案{n, v}被選擇,那么此后蹬癌,任何proposer提出的議案(編號(hào)更高)包含的決議都是v权她。

通過(guò)限制“提出議案”的行為,可以間接限制“批準(zhǔn)議案”的行為逝薪。P2B與P2A基本等效隅要,不過(guò)P2B相比起來(lái)有更高的容錯(cuò)性,它有效阻止了部分Acceptor因?yàn)殄礄C(jī)等原因產(chǎn)生的錯(cuò)誤的批準(zhǔn)行為董济。

P2C. 對(duì)于任意的v和n步清,如果議案{n, v}被提出,那么存在一個(gè)由acceptor的多數(shù)派組成的集合S,或者a) S中沒(méi)有acceptor批準(zhǔn)過(guò)編號(hào)小于n的議案廓啊,或者b) 在S的任何acceptor批準(zhǔn)的所有議案(編號(hào)小于n)中欢搜,v是編號(hào)最大的議案的決議。

P2C(a)意味著存在一個(gè)多數(shù)派沒(méi)有選擇過(guò)議案谴轮,P2C(b)意味著存在一個(gè)多數(shù)派已經(jīng)選擇了議案(n{m, v})炒瘟,只有這兩種情況下能夠提出議案。這意味著如果一個(gè)議案已經(jīng)被多數(shù)派選擇第步,那么accepter只能批準(zhǔn)相同提議(v)的序號(hào)更高的議案疮装,也就是P2A。多以P2C包含P2B包含P2A粘都。

P2C相比P2B廓推,其實(shí)是增加了沒(méi)有議案被多數(shù)派選擇前的行為指導(dǎo)。更加具體更易實(shí)現(xiàn)翩隧。同時(shí)P2C已經(jīng)解決了多數(shù)派弱一致的具體實(shí)現(xiàn)的問(wèn)題樊展,就是由Proposer去尋找并判定多數(shù)派的最終一致結(jié)果,并維護(hù)這個(gè)結(jié)果鸽心。因此即使多數(shù)派仍然處于不一致?tīng)顟B(tài)(部分節(jié)點(diǎn)未批準(zhǔn)決議v)滚局,但因?yàn)樾碌淖h案必定包含v居暖,所以這些不一致節(jié)點(diǎn)最終也會(huì)達(dá)到一致?tīng)顟B(tài)顽频。

但是P2C距離真正的弱一致性還缺一個(gè)鎖,因?yàn)?strong>查詢(xún)最終一致結(jié)果和提出符合最終一致結(jié)果的議案之間太闺,可能會(huì)產(chǎn)生查詢(xún)結(jié)果變更糯景。因?yàn)榭展?jié)點(diǎn)(未批準(zhǔn)任何提案的節(jié)點(diǎn))可以屬于任何一個(gè)多數(shù)派,如果它在兩階段中間批準(zhǔn)了舊的提案省骂,并且這一行為導(dǎo)致了原先多數(shù)派消失(因?yàn)槭タ展?jié)點(diǎn)蟀淮,所以數(shù)量不足),那么第二階段的提案就會(huì)導(dǎo)致最終一致性的混亂钞澳。
因此在兩階段之間的鎖是有必要的怠惶,通過(guò)改進(jìn)P1來(lái)實(shí)現(xiàn)這個(gè)鎖:

P1A. acceptor可以批準(zhǔn)一個(gè)編號(hào)為n的議案,當(dāng)且僅當(dāng)它沒(méi)有回應(yīng)過(guò)一個(gè)編號(hào)大于n的prepare請(qǐng)求轧粟。

P1A就像是一個(gè)前向鎖策治,鎖住了舊提案的批準(zhǔn)請(qǐng)求,但是又防止了死鎖的風(fēng)險(xiǎn)兰吟,因?yàn)樗试S被新提案所覆蓋通惫。

具體實(shí)現(xiàn)

經(jīng)過(guò)一番條件推導(dǎo),具體實(shí)現(xiàn)已經(jīng)很簡(jiǎn)單了混蔼,可以細(xì)化到各節(jié)點(diǎn)的行為:

Accepter

  • 如果接收到的prepare請(qǐng)求的編號(hào)n大于它已經(jīng)回應(yīng)的任何prepare請(qǐng)求履腋,它就回應(yīng)已經(jīng)批準(zhǔn)的編號(hào)最高的議案(如果有的話),并承諾不再回應(yīng)任何編號(hào)小于n的議案
  • 如果收到了議案{n, v}的accept請(qǐng)求,它就批準(zhǔn)該議案遵湖,除非它已經(jīng)回應(yīng)了一個(gè)編號(hào)大于n的議案悔政。

Proposer

  1. Proposer選擇一個(gè)議案編號(hào)n,向acceptor的多數(shù)派發(fā)送編號(hào)也為n的prepare請(qǐng)求奄侠。
  2. 如果收到了多數(shù)acceptor對(duì)prepare請(qǐng)求(編號(hào)為n)的回應(yīng)卓箫,它就向這些acceptor發(fā)送議案{n, v}的accept請(qǐng)求,其中v是所有回應(yīng)中編號(hào)最高的議案的決議垄潮,或者是proposer選擇的值烹卒,如果回應(yīng)說(shuō)還沒(méi)有議案。

偽代碼

func accepter(request) {
  static atomic accepted = 0 // 批準(zhǔn)的提案號(hào)
  static atomic responsed = 0 // 回應(yīng)的提案號(hào)
  if (request.type == PREPARE and
    request.seq > responsed) { // 如果接收到的prepare請(qǐng)求編號(hào)大于已回應(yīng)編號(hào)
    responsed = request.req
    response(request.src, accepted) // 回應(yīng)已經(jīng)批準(zhǔn)的提案
  }
  if (request.type == ACCEPT and
    accepted <= request.seq) { // 如果收到的accept請(qǐng)求編號(hào)不小于已批準(zhǔn)提案
    accepted = request.seq
    accept(request) // 批準(zhǔn)提案
  }
}
    
func proposer(stage=INIT) {
  static atomic seq = 0
  switch (stage):
  case INIT:  // Init階段
  // proposer需要知道集群目前最大的n弯洗,才能提出更新的議案
    request(SEQ,
      callback = lambda ret: set_seq(ret)
    )
  break
  case PREAPRE:  // Prepare階段
    request_multi(PREPARE,
      seq = seq,
      callback = lambda ret: quorum_max(ret)
      )
  break
  case ACCEPT: // Accept階段
    request_multi(
      seq = seq
    )
    break
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旅急,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牡整,更是在濱河造成了極大的恐慌藐吮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逃贝,死亡現(xiàn)場(chǎng)離奇詭異谣辞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)沐扳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)泥从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沪摄,你說(shuō)我怎么就攤上這事躯嫉。” “怎么了杨拐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵祈餐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我哄陶,道長(zhǎng)帆阳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任屋吨,我火速辦了婚禮蜒谤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘离赫。我一直安慰自己芭逝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布渊胸。 她就那樣靜靜地躺著旬盯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖翰,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天接剩,我揣著相機(jī)與錄音,去河邊找鬼萨咳。 笑死懊缺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的培他。 我是一名探鬼主播鹃两,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舀凛!你這毒婦竟也來(lái)了俊扳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猛遍,失蹤者是張志新(化名)和其女友劉穎馋记,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體懊烤,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梯醒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腌紧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茸习。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寄啼,靈堂內(nèi)的尸體忽然破棺而出逮光,到底是詐尸還是另有隱情代箭,我是刑警寧澤墩划,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站嗡综,受9級(jí)特大地震影響乙帮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜极景,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一察净、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盼樟,春花似錦氢卡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春筑悴,著一層夾襖步出監(jiān)牢的瞬間们拙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工阁吝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砚婆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓突勇,卻偏偏與公主長(zhǎng)得像装盯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甲馋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 【這篇論文我翻一下來(lái)验夯,首先感覺(jué)還是不好懂,很多地方結(jié)論的得出不夠清楚摔刁,需要讀者自己思考其中的原因挥转。要理解Paxos...
    好好學(xué)習(xí)天天引體向上閱讀 6,597評(píng)論 3 51
  • 為了解決分布式系統(tǒng)的一致性問(wèn)題,在長(zhǎng)期的探索研究過(guò)程中共屈,涌現(xiàn)出了一大批經(jīng)典的一致性協(xié)議和算法绑谣,其中最著名的就是二階...
    codersm閱讀 345評(píng)論 0 0
  • 問(wèn)題: 基于消息傳遞通信模型的分布式系統(tǒng),不可避免的會(huì)發(fā)生以下錯(cuò)誤:進(jìn)程可能會(huì)慢拗引、被殺死或者重啟借宵,消息可能會(huì)延遲、...
    LaxChan閱讀 1,948評(píng)論 6 1
  • 如果有一天 你走進(jìn)我的心里 你會(huì)哭矾削,因?yàn)槔锩嫒悄?如果有一天 我走進(jìn)你的心里 我也會(huì)哭 因?yàn)槟抢餂](méi)有我 不知道 ...
    光落在你臉上閱讀 360評(píng)論 3 2
  • 現(xiàn)在我的故鄉(xiāng)已經(jīng)被許多人包括我自己遺忘了壤玫,或者說(shuō)她從來(lái)就沒(méi)有被人提起過(guò),記起過(guò)哼凯,從來(lái)就沒(méi)有欲间,未曾有過(guò)。她太渺小了断部,...
    陌上冷閱讀 203評(píng)論 0 0