分布式系统理论基础1: 一致性、2PC和3PC
分布式系統(tǒng)理論基礎(chǔ) - 一致性、2PC和3PC
引言
狹義的分布式系統(tǒng)指由網(wǎng)絡(luò)連接的計(jì)算機(jī)系統(tǒng),每個(gè)節(jié)點(diǎn)獨(dú)立地承擔(dān)計(jì)算或存儲(chǔ)任務(wù),節(jié)點(diǎn)間通過(guò)網(wǎng)絡(luò)協(xié)同工作。廣義的分布式系統(tǒng)是一個(gè)相對(duì)的概念,正如Leslie Lamport所說(shuō)[1]:
What is a distributed systeme.?Distribution is in the eye of the beholder.
To the user sitting at the keyboard, his IBM personal computer is a nondistributed system.?
To a flea crawling around on the circuit board, or to the engineer who designed it, it's very much a distributed system.
?
?一致性是分布式理論中的根本性問(wèn)題,近半個(gè)世紀(jì)以來(lái),科學(xué)家們圍繞著一致性問(wèn)題提出了很多理論模型,依據(jù)這些理論模型,業(yè)界也出現(xiàn)了很多工程實(shí)踐投影。下面我們從一致性問(wèn)題、特定條件下解決一致性問(wèn)題的兩種方法(2PC、3PC)入門(mén),了解最基礎(chǔ)的分布式系統(tǒng)理論。
?
一致性(consensus)
何為一致性問(wèn)題?簡(jiǎn)單而言,一致性問(wèn)題就是相互獨(dú)立的節(jié)點(diǎn)之間如何達(dá)成一項(xiàng)決議的問(wèn)題。分布式系統(tǒng)中,進(jìn)行數(shù)據(jù)庫(kù)事務(wù)提交(commit transaction)、Leader選舉、序列號(hào)生成等都會(huì)遇到一致性問(wèn)題。這個(gè)問(wèn)題在我們的日常生活中也很常見(jiàn),比如牌友怎么商定幾點(diǎn)在哪打幾圈麻將:
《賭圣》,1990
?
假設(shè)一個(gè)具有N個(gè)節(jié)點(diǎn)的分布式系統(tǒng),當(dāng)其滿(mǎn)足以下條件時(shí),我們說(shuō)這個(gè)系統(tǒng)滿(mǎn)足一致性:
?
有人可能會(huì)說(shuō),決定什么時(shí)候在哪搓搓麻將,4個(gè)人商量一下就ok,這不很簡(jiǎn)單嗎?
?
但就這樣看似簡(jiǎn)單的事情,分布式系統(tǒng)實(shí)現(xiàn)起來(lái)并不輕松,因?yàn)樗媾R著這些問(wèn)題:
- 消息傳遞異步無(wú)序(asynchronous): 現(xiàn)實(shí)網(wǎng)絡(luò)不是一個(gè)可靠的信道,存在消息延時(shí)、丟失,節(jié)點(diǎn)間消息傳遞做不到同步有序(synchronous)
- 節(jié)點(diǎn)宕機(jī)(fail-stop): 節(jié)點(diǎn)持續(xù)宕機(jī),不會(huì)恢復(fù)
- 節(jié)點(diǎn)宕機(jī)恢復(fù)(fail-recover): 節(jié)點(diǎn)宕機(jī)一段時(shí)間后恢復(fù),在分布式系統(tǒng)中最常見(jiàn)
- 網(wǎng)絡(luò)分化(network partition): 網(wǎng)絡(luò)鏈路出現(xiàn)問(wèn)題,將N個(gè)節(jié)點(diǎn)隔離成多個(gè)部分
- 拜占庭將軍問(wèn)題(byzantine failure)[2]: 節(jié)點(diǎn)或宕機(jī)或邏輯失敗,甚至不按套路出牌拋出干擾決議的信息
?
假設(shè)現(xiàn)實(shí)場(chǎng)景中也存在這樣的問(wèn)題,我們看看結(jié)果會(huì)怎樣:
我: 老王,今晚7點(diǎn)老地方,搓夠48圈不見(jiàn)不散! …… (第二天凌晨3點(diǎn)) 隔壁老王: 沒(méi)問(wèn)題! // 消息延遲 我: …… ---------------------------------------------- 我: 小張,今晚7點(diǎn)老地方,搓夠48圈不見(jiàn)不散! 小張: No …… (兩小時(shí)后……) 小張: No problem! // 宕機(jī)節(jié)點(diǎn)恢復(fù) 我: …… ----------------------------------------------- 我: 老李頭,今晚7點(diǎn)老地方,搓夠48圈不見(jiàn)不散! 老李: 必須的,大保健走起! // 拜占庭將軍 (這是要打麻將呢?還是要大保健?還是一邊打麻將一邊大保健……)還能不能一起愉快地玩耍...
?
我們把以上所列的問(wèn)題稱(chēng)為系統(tǒng)模型(system model),討論分布式系統(tǒng)理論和工程實(shí)踐的時(shí)候,必先劃定模型。例如有以下兩種模型:
2比1多了節(jié)點(diǎn)恢復(fù)、網(wǎng)絡(luò)分化的考量,因而對(duì)這兩種模型的理論研究和工程解決方案必定是不同的,在還沒(méi)有明晰所要解決的問(wèn)題前談解決方案都是一本正經(jīng)地耍流氓。
?
一致性還具備兩個(gè)屬性,一個(gè)是強(qiáng)一致(safety),它要求所有節(jié)點(diǎn)狀態(tài)一致、共進(jìn)退;一個(gè)是可用(liveness),它要求分布式系統(tǒng)24*7無(wú)間斷對(duì)外服務(wù)。FLP定理(FLP impossibility)[3][4]?已經(jīng)證明在一個(gè)收窄的模型中(異步環(huán)境并只存在節(jié)點(diǎn)宕機(jī)),不能同時(shí)滿(mǎn)足 safety 和 liveness。
?
FLP定理是分布式系統(tǒng)理論中的基礎(chǔ)理論,正如物理學(xué)中的能量守恒定律徹底否定了永動(dòng)機(jī)的存在,FLP定理否定了同時(shí)滿(mǎn)足safety 和 liveness 的一致性協(xié)議的存在。
《怦然心動(dòng) (Flipped)》,2010
?
工程實(shí)踐上根據(jù)具體的業(yè)務(wù)場(chǎng)景,或保證強(qiáng)一致(safety),或在節(jié)點(diǎn)宕機(jī)、網(wǎng)絡(luò)分化的時(shí)候保證可用(liveness)。2PC、3PC是相對(duì)簡(jiǎn)單的解決一致性問(wèn)題的協(xié)議,下面我們就來(lái)了解2PC和3PC。
?
2PC
2PC(tow phase commit)兩階段提交[5]顧名思義它分成兩個(gè)階段,先由一方進(jìn)行提議(propose)并收集其他節(jié)點(diǎn)的反饋(vote),再根據(jù)反饋決定提交(commit)或中止(abort)事務(wù)。我們將提議的節(jié)點(diǎn)稱(chēng)為協(xié)調(diào)者(coordinator),其他參與決議節(jié)點(diǎn)稱(chēng)為參與者(participants, 或cohorts):
2PC, phase one
在階段1中,coordinator發(fā)起一個(gè)提議,分別問(wèn)詢(xún)各participant是否接受。
2PC, phase two
在階段2中,coordinator根據(jù)participant的反饋,提交或中止事務(wù),如果participant全部同意則提交,只要有一個(gè)participant不同意就中止。
?
在異步環(huán)境(asynchronous)并且沒(méi)有節(jié)點(diǎn)宕機(jī)(fail-stop)的模型下,2PC可以滿(mǎn)足全認(rèn)同、值合法、可結(jié)束,是解決一致性問(wèn)題的一種協(xié)議。但如果再加上節(jié)點(diǎn)宕機(jī)(fail-recover)的考慮,2PC是否還能解決一致性問(wèn)題呢?
?
coordinator如果在發(fā)起提議后宕機(jī),那么participant將進(jìn)入阻塞(block)狀態(tài)、一直等待coordinator回應(yīng)以完成該次決議。這時(shí)需要另一角色把系統(tǒng)從不可結(jié)束的狀態(tài)中帶出來(lái),我們把新增的這一角色叫協(xié)調(diào)者備份(coordinator watchdog)。coordinator宕機(jī)一定時(shí)間后,watchdog接替原coordinator工作,通過(guò)問(wèn)詢(xún)(query) 各participant的狀態(tài),決定階段2是提交還是中止。這也要求?coordinator/participant 記錄(logging)歷史狀態(tài),以備coordinator宕機(jī)后watchdog對(duì)participant查詢(xún)、coordinator宕機(jī)恢復(fù)后重新找回狀態(tài)。
?
從coordinator接收到一次事務(wù)請(qǐng)求、發(fā)起提議到事務(wù)完成,經(jīng)過(guò)2PC協(xié)議后增加了2次RTT(propose+commit),帶來(lái)的時(shí)延(latency)增加相對(duì)較少。
?
3PC
3PC(three phase commit)即三階段提交[6][7],既然2PC可以在異步網(wǎng)絡(luò)+節(jié)點(diǎn)宕機(jī)恢復(fù)的模型下實(shí)現(xiàn)一致性,那還需要3PC做什么,3PC是什么鬼?
?
在2PC中一個(gè)participant的狀態(tài)只有它自己和coordinator知曉,假如coordinator提議后自身宕機(jī),在watchdog啟用前一個(gè)participant又宕機(jī),其他participant就會(huì)進(jìn)入既不能回滾、又不能強(qiáng)制commit的阻塞狀態(tài),直到participant宕機(jī)恢復(fù)。這引出兩個(gè)疑問(wèn):
?
相比2PC,3PC增加了一個(gè)準(zhǔn)備提交(prepare to commit)階段來(lái)解決以上問(wèn)題:
圖片截取自wikipedia
coordinator接收完participant的反饋(vote)之后,進(jìn)入階段2,給各個(gè)participant發(fā)送準(zhǔn)備提交(prepare to commit)指令。participant接到準(zhǔn)備提交指令后可以鎖資源,但要求相關(guān)操作必須可回滾。coordinator接收完確認(rèn)(ACK)后進(jìn)入階段3、進(jìn)行commit/abort,3PC的階段3與2PC的階段2無(wú)異。協(xié)調(diào)者備份(coordinator watchdog)、狀態(tài)記錄(logging)同樣應(yīng)用在3PC。
?
participant如果在不同階段宕機(jī),我們來(lái)看看3PC如何應(yīng)對(duì):
- 階段1:?coordinator或watchdog未收到宕機(jī)participant的vote,直接中止事務(wù);宕機(jī)的participant恢復(fù)后,讀取logging發(fā)現(xiàn)未發(fā)出贊成vote,自行中止該次事務(wù)
- 階段2:?coordinator未收到宕機(jī)participant的precommit ACK,但因?yàn)橹耙呀?jīng)收到了宕機(jī)participant的贊成反饋(不然也不會(huì)進(jìn)入到階段2),coordinator進(jìn)行commit;watchdog可以通過(guò)問(wèn)詢(xún)其他participant獲得這些信息,過(guò)程同理;宕機(jī)的participant恢復(fù)后發(fā)現(xiàn)收到precommit或已經(jīng)發(fā)出贊成vote,則自行commit該次事務(wù)
- 階段3: 即便coordinator或watchdog未收到宕機(jī)participant的commit ACK,也結(jié)束該次事務(wù);宕機(jī)的participant恢復(fù)后發(fā)現(xiàn)收到commit或者precommit,也將自行commit該次事務(wù)
因?yàn)橛辛藴?zhǔn)備提交(prepare to commit)階段,3PC的事務(wù)處理延時(shí)也增加了1個(gè)RTT,變?yōu)?個(gè)RTT(propose+precommit+commit),但是它防止participant宕機(jī)后整個(gè)系統(tǒng)進(jìn)入阻塞態(tài),增強(qiáng)了系統(tǒng)的可用性,對(duì)一些現(xiàn)實(shí)業(yè)務(wù)場(chǎng)景是非常值得的。
?
小結(jié)
以上介紹了分布式系統(tǒng)理論中的部分基礎(chǔ)知識(shí),闡述了一致性(consensus)的定義和實(shí)現(xiàn)一致性所要面臨的問(wèn)題,最后討論在異步網(wǎng)絡(luò)(asynchronous)、節(jié)點(diǎn)宕機(jī)恢復(fù)(fail-recover)模型下2PC、3PC怎么解決一致性問(wèn)題。
?
閱讀前人對(duì)分布式系統(tǒng)的各項(xiàng)理論研究,其中有嚴(yán)謹(jǐn)?shù)赝评怼⒆C明,有一種數(shù)學(xué)的美;觀現(xiàn)實(shí)中的分布式系統(tǒng)實(shí)現(xiàn),是綜合各種因素下妥協(xié)的結(jié)果。
?
[1]?Solved Problems, Unsolved Problems and Problems in Concurrency,?Leslie Lamport, 1983
[2]?The Byzantine Generals Problem,?Leslie Lamport,Robert Shostak and Marshall Pease, 1982
[3]?Impossibility of Distributed Consensus with One Faulty Process,?Fischer, Lynch and Patterson, 1985
[4]?FLP Impossibility的證明,?Daniel Wu, 2015
[5]?Consensus Protocols: Two-Phase Commit,?Henry Robinson, 2008
[6]?Consensus Protocols: Three-phase Commit,?Henry Robinson, 2008
[7]?Three-phase commit protocol,?Wikipedia
?
總結(jié)
以上是生活随笔為你收集整理的分布式系统理论基础1: 一致性、2PC和3PC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python爬虫(二)——豆瓣图书决策树
- 下一篇: 3YAdmin-专注通用权限控制与表单的