成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這或許是最通俗易懂的數(shù)據(jù)一致性問(wèn)題解讀

開發(fā) 前端
回過(guò)頭來(lái)看,我們發(fā)現(xiàn),想要更嚴(yán)謹(jǐn)?shù)囊恢滦裕敲淳托枰黾酉嗷ネㄓ嵈_認(rèn)的次數(shù),但是這會(huì)導(dǎo)致性能低下,正如PBFT和Paxos一樣。但是分布式系統(tǒng)就是這樣,到處都需要Balance,找到最適合的才是最重要的。

本文從普遍認(rèn)為的分布式系統(tǒng)中最最重要的數(shù)據(jù)一致性開始。內(nèi)容適合經(jīng)驗(yàn)>=0年技術(shù)相關(guān)經(jīng)驗(yàn)的人群。

一、對(duì)數(shù)據(jù)一致性問(wèn)題的剖析

1為什么需要分布式系統(tǒng)?

任何事物能夠被持續(xù)的運(yùn)用和發(fā)展,必然有其價(jià)值,分布式系統(tǒng)也是一樣。分布式系統(tǒng)的產(chǎn)生我認(rèn)為主要的目的就是“快”和“海量”。這個(gè)“快”可以分為兩個(gè)方面:

  • 系統(tǒng)的處理速度快
  • 開發(fā)的速度快(歷時(shí)短)

這2點(diǎn)本質(zhì)都是相同的,把一個(gè)動(dòng)作或者一件事情拆成兩部分或者多個(gè)部分去同時(shí)進(jìn)行,使得整體的耗時(shí)縮短。比如:原本一件事情要一個(gè)人做的話要兩分鐘。那么我雇傭兩個(gè)人幫我各自做一部分,那么最理想情況下一分鐘就可以完成了。

當(dāng)然這兩個(gè)方面中第二項(xiàng)從某種意義上來(lái)說(shuō)是可以克服的,但是第一項(xiàng)是無(wú)法克服的。因?yàn)闆]有一個(gè)程序或計(jì)算機(jī)的性能是無(wú)窮大的,如果有,那分布式系統(tǒng)也不會(huì)像現(xiàn)在這么普遍了(很多時(shí)候用錢能解決的問(wèn)題都不是問(wèn)題)。

“海量”則是由于不存在無(wú)窮大的硬盤,所以我們需要把數(shù)據(jù)分別存儲(chǔ)到不同的硬盤上,才能滿足需求。這些硬盤可能在不同主機(jī)、不同機(jī)房、不同地域(未來(lái)或許還可能會(huì)在不同的星球)。

2分布式系統(tǒng)的副作用

所謂每個(gè)事物都是矛盾統(tǒng)一的結(jié)合體,都具有兩面性。分布式系統(tǒng)再帶來(lái)了前面提到的好處的同時(shí),也帶來(lái)了業(yè)界普遍認(rèn)為最大的問(wèn)題——數(shù)據(jù)一致性問(wèn)題。

系統(tǒng)是給人用的,構(gòu)成使用場(chǎng)景的概念叫業(yè)務(wù)。業(yè)務(wù)是核心,對(duì)一個(gè)系統(tǒng)來(lái)說(shuō),業(yè)務(wù)的發(fā)展歸根到底是建立在數(shù)據(jù)之上的。我可以慢,可以宕機(jī),可以搞得很復(fù)雜,這些都能忍。但唯獨(dú)不能忍的就是數(shù)據(jù)問(wèn)題——數(shù)據(jù)錯(cuò)誤、數(shù)據(jù)不一致等等。

分布式就意味著分治與協(xié)作,一件事一個(gè)人只負(fù)責(zé)一部分。

生活中這樣的例子也無(wú)處不在,就拿舉辦一個(gè)Party來(lái)說(shuō):一部分人去準(zhǔn)備吃的,一部分人去準(zhǔn)備喝的,一部分人去準(zhǔn)備場(chǎng)地布置。這些事情大家都可以同時(shí)進(jìn)行,但是任一環(huán)節(jié)掉鏈子了,或者說(shuō)不符合Party主題的話,都是失敗的。(不知道為什么,腦子里浮現(xiàn)的是一場(chǎng)發(fā)布會(huì),大家喊著cheers,一口干了高腳杯里的二鍋頭。。。)。

再舉個(gè)電商場(chǎng)景中的程序案例:

這或許是最通俗易懂的數(shù)據(jù)一致性問(wèn)題解讀

這里的4個(gè)操作以目標(biāo)來(lái)看,其實(shí)先后順序并不重要,重要的是要么都成功,要么都失敗,其中任意一個(gè)程序不一致那么就會(huì)出問(wèn)題。這個(gè)問(wèn)題本質(zhì)上和人與人之間的溝通問(wèn)題是類似的,與溝通唯一的不同在于,對(duì)程序來(lái)說(shuō),不一定都要得到響應(yīng),都沒響應(yīng)也是一致。當(dāng)一個(gè)事情分成100個(gè)部分去做的時(shí)候,很可怕,從概率的角度來(lái)看,達(dá)到一致的概率是2/5050。

這里舉的程序例子并不是嚴(yán)謹(jǐn),因?yàn)閷?shí)際的分布式系統(tǒng)中因?yàn)槌?ldquo;write”操作還有“read”操作,所以一致性問(wèn)題比這個(gè)更復(fù)雜,后面會(huì)有更詳細(xì)的說(shuō)明。

3產(chǎn)生數(shù)據(jù)不一致的原因

那么是什么原因?qū)е铝藬?shù)據(jù)不一致的產(chǎn)生呢?

有一種原因是程序設(shè)計(jì)問(wèn)題(代碼寫錯(cuò)了)。這點(diǎn)很好理解,也很容易想到解決方案——多做測(cè)試,驗(yàn)證是否符合預(yù)期咯。常見的單元測(cè)試、接口測(cè)試、自動(dòng)化測(cè)試、集成測(cè)試等都是為了更具性價(jià)比地將BUG降低到無(wú)限接近于0,也造就了“測(cè)試工程師”這個(gè)崗位更大的作用。

但是,假設(shè)真的沒有BUG,卻還是會(huì)產(chǎn)生數(shù)據(jù)不一致。因?yàn)檐浖沁\(yùn)行在硬件之上的,所以還有硬件的因素存在。對(duì)我們這里的大部分人來(lái)說(shuō),我們對(duì)硬件的掌控力相比對(duì)軟件,更弱。

這其中,最嚴(yán)重的屬網(wǎng)絡(luò)問(wèn)題。網(wǎng)絡(luò)相比其它而言是一個(gè)更大、更復(fù)雜的組織,未知性會(huì)隨著局域網(wǎng)、廣域網(wǎng)這樣范圍越大越嚴(yán)重。想象一下,每一臺(tái)主機(jī)僅僅是一張大網(wǎng)中的一個(gè)渺小的連接點(diǎn),它所承載的鏈接越多越容易出現(xiàn)問(wèn)題。

可能有的小伙伴會(huì)有疑問(wèn),其它像硬盤、電源斷電什么的,也有出現(xiàn)問(wèn)題的可能性,為什么網(wǎng)絡(luò)問(wèn)題最為嚴(yán)重呢?

其實(shí)硬盤、電源好比是你身體的一部分,如手和腳。而網(wǎng)絡(luò)是人與人之間溝通的渠道,比如手機(jī)通話,雖然你沒有主動(dòng)掛斷電話,但是整個(gè)通話過(guò)程是有很多可能性導(dǎo)致中斷的,對(duì)方的主觀意愿也好、信號(hào)不好也罷,甚至被第三者給攔截了。相信大家也能認(rèn)可,打電話出現(xiàn)異常的概率相比自己的手腳不聽使喚是高很多的吧。

現(xiàn)實(shí)中網(wǎng)絡(luò)的特點(diǎn),常遇到的問(wèn)題如:延遲、丟包、亂序等問(wèn)題。為了解決這些問(wèn)題,從互聯(lián)網(wǎng)第一次出現(xiàn)的1969年(當(dāng)年美軍在ARPA制定的協(xié)定下用網(wǎng)絡(luò)連接了4所大學(xué))到現(xiàn)在,幾十年間出了很多的理論和解決方案,這些會(huì)在后續(xù)的文章中給大家一一做梳理。本部分先和大家具體剖析下什么是一致性。

4詳解一致性

什么叫達(dá)成一致了?說(shuō)起來(lái)很簡(jiǎn)單——在任意時(shí)間、任意位置看到的同一個(gè)事物是完全一致的。

比如一場(chǎng)足球賽,不管我們?cè)诂F(xiàn)場(chǎng)還是在電視機(jī)前,看到足球從球員A傳給球員B,這個(gè)信息都是一樣的。但是嚴(yán)格意義上來(lái)說(shuō),這個(gè)并稱不上真正的一致,因?yàn)殡娨暀C(jī)接收到這個(gè)信息需要經(jīng)過(guò)衛(wèi)星信號(hào)、網(wǎng)絡(luò)等的傳輸,我們看到的時(shí)候相比現(xiàn)場(chǎng)的人肯定要晚。哪怕在現(xiàn)場(chǎng)的人,根據(jù)他所處的位置,理論上看到的信息也存在延遲差,只是因?yàn)楣馑俜浅?欤沟迷谙嗖顜装倜字畠?nèi),這個(gè)延遲小到完全感受不到而已。

能得出的結(jié)論是:在考慮時(shí)間維度的情況下,不存在真正意義上的一致。

況且我們?cè)诜植际较到y(tǒng)中,也沒有必要去達(dá)到真正的意義上的一致。因?yàn)樵节吔谝恢拢到y(tǒng)相當(dāng)于又歸一成一個(gè)單體了,在某一個(gè)時(shí)刻,只能做一件事,完全喪失了分布式系統(tǒng)的兩個(gè)目的之一“快”的優(yōu)勢(shì)。也因此衍生出多種一致性的變種,分別適用于不同的場(chǎng)景。為了便于理解,我們從嚴(yán)格程度的低到高來(lái)說(shuō)。

大多數(shù)情況下,為了盡可能的“快”,系統(tǒng)中使用的大部分方案都是所謂的最終一致性,也就容忍一定條件下的不一致,優(yōu)先保證局部一致,然后再通過(guò)一系列復(fù)雜的狀態(tài)同步達(dá)到全局的一致。最終一致性很多可實(shí)現(xiàn)的分支,列出幾種常見的,拋磚引玉一下:

  • 因果一致性:僅要求有因果關(guān)系的操作順序得到保證。比如朋友圈的回復(fù)功能。問(wèn)“飯吃了嗎?”肯定得在回答“吃了”之前。
  • 讀你所寫一致性:文字看著別扭,但很好解釋。比如你在朋友圈下面回復(fù)一句話,其它好友可以不用馬上看到你的回復(fù),但是你自己必須得馬上看到,要不然回復(fù)到哪去了?
  • 會(huì)話一致性:與人的一次聊天可以理解為一次會(huì)話。聊天雖然也有一定的因果關(guān)系,但是大部分場(chǎng)景下更多的是邏輯上的先后關(guān)系。比如你闡述一個(gè)事情,分為3條信息:首先...,然后...,最后...。如果這里的一致性得不到保證那么可能會(huì)變成:最后...,首先...,然后...。

比局部一致更嚴(yán)格一些的就是全局的順序一致性[1],保證所有進(jìn)程看到的全局執(zhí)行順序一致,并且每個(gè)進(jìn)程自身的執(zhí)行順序和實(shí)際發(fā)生順序一致。

注:文中[1-6]標(biāo)注皆可于文末找到對(duì)應(yīng)參考資料

像上面提到的足球賽,比如實(shí)際發(fā)生的事情是①梅西把球傳給了C羅,②C羅又把球回傳給了梅西,那么每個(gè)人看到順序都應(yīng)該是這樣。哪怕現(xiàn)場(chǎng)觀眾已經(jīng)看到②了,電視機(jī)前的我們還沒看到①,但是沒關(guān)系,這個(gè)事情發(fā)生的順序,對(duì)全世界來(lái)說(shuō)都是一樣的。

再嚴(yán)格一些,就是在全局的順序一致性基礎(chǔ)上再增加一個(gè)相對(duì)時(shí)間的一致性要求,業(yè)界稱之為線性一致性[2]。還是用上面梅西和C羅相互傳球的例子來(lái)做個(gè)比喻,相當(dāng)于梅西傳出球給C羅之后,整個(gè)球場(chǎng)“暫停”了,要等所有在觀看這場(chǎng)球賽的人都接收到這個(gè)傳球信息之后,C羅才能做下一個(gè)回傳。這里需要一個(gè)上帝(全局時(shí)鐘)來(lái)“暫停”。這是我們實(shí)際可以做到的極限了,滿足這類要求的系統(tǒng)中,名氣最大的就屬Google的Spanner了。

對(duì)不同級(jí)別的一致性匯總概述如下:

這或許是最通俗易懂的數(shù)據(jù)一致性問(wèn)題解讀

二、通過(guò)共識(shí)達(dá)成數(shù)據(jù)一致性

第一部分我們已經(jīng)對(duì)數(shù)據(jù)一致性問(wèn)題做了一次剖析,那么怎么解決由于故障導(dǎo)致的不一致問(wèn)題呢?通過(guò)共識(shí)來(lái)達(dá)成。所以,本部分會(huì)圍繞“共識(shí)”這個(gè)點(diǎn)展開。

1“共識(shí)”是什么?為什么會(huì)產(chǎn)生?

一致性問(wèn)題其實(shí)是一個(gè)「結(jié)果」,本質(zhì)是由于數(shù)據(jù)冗余導(dǎo)致的,如果沒有冗余,也就不會(huì)有一致性問(wèn)題了。

分布式系統(tǒng)里的各個(gè)子系統(tǒng)之間之所以能夠相互協(xié)作,就是因?yàn)槠渲g冗余了相同的數(shù)據(jù)作為“信物”。要不然我都不認(rèn)識(shí)你的話,為什么要配合你干活呢?所以這個(gè)“信物”變了,你得通知我,要不然我又不認(rèn)識(shí)你了。這個(gè)“信物”變更達(dá)成一致性的過(guò)程稱作達(dá)成「共識(shí)」。所以:

一致性問(wèn)題是結(jié)果,共識(shí)是為達(dá)到這個(gè)結(jié)果所要經(jīng)過(guò)的過(guò)程,或者說(shuō)一種手段。

在分布式系統(tǒng)中,冗余數(shù)據(jù)的場(chǎng)景不限于此,因?yàn)橐?guī)模越大的系統(tǒng),越不能容忍某一個(gè)子系統(tǒng)出問(wèn)題后產(chǎn)生蝴蝶效應(yīng),所以往往會(huì)做高可用。小明1號(hào)倒下了還有千千萬(wàn)萬(wàn)個(gè)小明X號(hào)在堅(jiān)守崗位,理想中的全天候24小時(shí)提供服務(wù)。

高可用的本質(zhì)是通過(guò)相同數(shù)據(jù)存儲(chǔ)多個(gè)副本,并都可對(duì)外提供服務(wù)。比如每個(gè)小明X號(hào)都有一本《按摩指法白皮書》,誰(shuí)請(qǐng)假了都可以由其它小明X號(hào)提供相同的按摩服務(wù)。但是這個(gè)本《按摩指法白皮書》改了,就得通知到每個(gè)人,因?yàn)檫@是服務(wù)的全部和來(lái)源,所以在做了高可用的集群中數(shù)據(jù)冗余的問(wèn)題更為突出。

實(shí)際上,如果分布式系統(tǒng)中各個(gè)節(jié)點(diǎn)都能保證瞬時(shí)響應(yīng)、無(wú)故障運(yùn)行,則達(dá)成共識(shí)很容易。就好像我們?nèi)艘粯樱谝欢ǚ秶鷥?nèi)只要吼一嗓子,通過(guò)穩(wěn)定的空氣傳播,相關(guān)人是否接收到這個(gè)消息,并且給出響應(yīng)幾乎可以是“瞬時(shí)”的。

但是正如前文提到,這樣的系統(tǒng)只停留在想象中,響應(yīng)請(qǐng)求往往存在延時(shí),網(wǎng)絡(luò)會(huì)發(fā)生中斷,節(jié)點(diǎn)發(fā)生故障,甚至存在惡意節(jié)點(diǎn)故意要破壞系統(tǒng)。這就衍生出了經(jīng)典的「拜占庭將軍問(wèn)題」[3]。

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

我們一般把「拜占庭將軍問(wèn)題」分為2種情況來(lái)看待:

  • 拜占庭錯(cuò)誤。表示通過(guò)偽造信息進(jìn)行惡意響應(yīng)產(chǎn)生的錯(cuò)誤。
  • 非拜占庭錯(cuò)誤。沒有進(jìn)行響應(yīng)產(chǎn)生的錯(cuò)誤。

這個(gè)問(wèn)題的核心在于:

如何解決某個(gè)變更在分布式網(wǎng)絡(luò)中得到一致的執(zhí)行結(jié)果是被參與多方都承認(rèn)的,同時(shí)這個(gè)信息是被確定的,不可推翻的。

好比如何讓所有的小明X號(hào)收到的都是《按摩指法白皮書Ⅱ》,而不是其它的,并且把原來(lái)的那本銷毀掉。

這個(gè)問(wèn)題衍生出了很多“共識(shí)”算法,解決「拜占庭錯(cuò)誤」的稱作Byzantine Fault Tolerance(BFT)類算法,解決「非拜占庭錯(cuò)誤」的稱作Crash Fault Tolerance(CFT)類算法。從這個(gè)2個(gè)名字中也可以看出,本質(zhì)的工作就是「容錯(cuò)」。

有的小伙伴在平時(shí)的工作中可能對(duì)「容錯(cuò)」的重要性感知沒那么強(qiáng)烈——不就產(chǎn)生一個(gè)BUG或者異常數(shù)據(jù)么?但是在航天領(lǐng)域,一個(gè)小錯(cuò)誤可能導(dǎo)致整個(gè)發(fā)射的失敗,代價(jià)非常巨大。

對(duì)「拜占庭將軍問(wèn)題」想深入的了解的,可以自行查閱相關(guān)資料,這里就不展開了,文末附上剛才我們標(biāo)注的論文。

我們常見的軟件開發(fā)中一般不會(huì)考慮「拜占庭錯(cuò)誤」,但它是區(qū)塊鏈項(xiàng)目的必需品。不過(guò)在主流的分布式數(shù)據(jù)庫(kù)中,皆能看到「非拜占庭錯(cuò)誤」的身影,諸如TiDB的Paxos算法,CockroachDB的Raft算法。雖然我們大家在日常的coding中,對(duì)數(shù)據(jù)庫(kù)底層原理的了解并不是必須項(xiàng)。但是只要當(dāng)我們涉及到應(yīng)用程序級(jí)別的高可用時(shí),那么至少「非拜占庭錯(cuò)誤」是必須要面臨的一道坎。

BFT類算法

BFT類型算法又有2個(gè)分支。「基于確定性的」和「基于概率的」。

先聊聊「基于確定性的」:

此類算法表示一旦對(duì)某個(gè)結(jié)果達(dá)成共識(shí)就不可逆轉(zhuǎn),即共識(shí)是最終結(jié)果。它的代表作是PBFT(Practical Byzantine Fault Tolerance)算法[4],自從有了央行背書(區(qū)塊鏈數(shù)字票據(jù)交易平臺(tái)),名聲更大了。算法的原理,如下圖:

 

這或許是最通俗易懂的數(shù)據(jù)一致性問(wèn)題解讀

▲圖片來(lái)源于網(wǎng)絡(luò),版權(quán)歸原作者所有

拿軍隊(duì)來(lái)比喻,這里的直線C可以認(rèn)為是“總司令”,直線0是“軍長(zhǎng)”,直線1、直線2、直線3都是“師長(zhǎng)”,值得注意的是3號(hào)師長(zhǎng)叛變了。整個(gè)過(guò)程這樣解釋:

  • 「request」:總司令給軍長(zhǎng)下了一個(gè)命令,“干!”。
  • 「pre-prepare」:軍長(zhǎng)把命令又廣播給3個(gè)師長(zhǎng)。
  • 「prepare」:每個(gè)師長(zhǎng)收到并同意之后將發(fā)送“收到”給軍長(zhǎng)和其他兩個(gè)師長(zhǎng)。
  • 「commit」:每個(gè)師長(zhǎng)收到2f個(gè)師長(zhǎng)(軍長(zhǎng)不做prepare)的“收到”請(qǐng)求后發(fā)送“隨時(shí)開干”給軍長(zhǎng)和其他兩個(gè)師長(zhǎng)。(f為可容忍的拜占庭節(jié)點(diǎn)數(shù))
  • 「reply」:每個(gè)師長(zhǎng)收到2f+1條“隨時(shí)開干”消息之后,就能認(rèn)為總司令的命令在相關(guān)的師長(zhǎng)中都到達(dá)了“隨時(shí)開干”的狀態(tài),那么他就直接開炮了!

真正想深入了解PBFT的話還有很多內(nèi)容,這里就不繼續(xù)展開了,有興趣的小伙伴可以在文末參考處自行查閱論文。

再聊聊「基于概率的」:

此類算法的共識(shí)結(jié)果則是臨時(shí)的,隨著時(shí)間推移或某種強(qiáng)化,共識(shí)結(jié)果被推翻的概率越來(lái)越小,成為事實(shí)上的最終結(jié)果。它的代表作是PoW(Proof of Work)算法,曾經(jīng)高達(dá)2W美元/個(gè)的比特幣就是基于這個(gè)算法來(lái)實(shí)現(xiàn)的。算法的原理拿“修仙”來(lái)做個(gè)簡(jiǎn)單的比喻(實(shí)際比特中的算法比這更復(fù)雜):

  • 自己努力修煉,并讓神仙中大于一半的人認(rèn)可你的修為,同意你成仙。
  • 隨之你就成為了神仙。并且參與到評(píng)判后續(xù)其他人是否可以成為“神仙”的事情中去。
  • 這個(gè)事情如果想通過(guò)賄賂來(lái)達(dá)到的話,隨著這個(gè)團(tuán)隊(duì)的人數(shù)越多,賄賂的成本越大,就可以認(rèn)為去做賄賂的人越少,那么導(dǎo)致被誤判的概率就越低,最終就越可信。

被誤判的概率公式是:0.5^個(gè)數(shù),如果個(gè)數(shù)=6的話,誤判的概率是1.5625%。如果個(gè)數(shù)=10的話,就已經(jīng)是0.09765625%了,指數(shù)級(jí)下降。

值得注意的是,「基于確定性的」和「基于概率的」對(duì)于不合作節(jié)點(diǎn)的標(biāo)準(zhǔn)是不同的,前者至多能容忍1/3,后者是小于1/2。

4CFT類算法

正如上面所說(shuō)CFT類算法解決的是分布式系統(tǒng)中存在故障,但不存在惡意節(jié)點(diǎn)的場(chǎng)景(即可能消息丟失或重復(fù),但無(wú)錯(cuò)誤消息)下的共識(shí)達(dá)成問(wèn)題。「拜占庭將軍問(wèn)題」的提出者Leslie Lamport也在他另外的論文[5]中提出過(guò)「Paxos問(wèn)題」,與這相似。在論文中通過(guò)一個(gè)故事類比了這個(gè)問(wèn)題,如下:

  • 希臘島嶼Paxon 上的「執(zhí)法者」在「議會(huì)大廳」中表決通過(guò)『法律』,并通過(guò)「服務(wù)員」傳遞紙條的方式交流信息,每個(gè)「執(zhí)法者」會(huì)將通過(guò)的『法律』記錄在自己的「賬目」上。問(wèn)題在于「執(zhí)法者」和「服務(wù)員」都不可靠,他們隨時(shí)會(huì)因?yàn)楦鞣N事情離開「議會(huì)大廳」,并隨時(shí)可能有新的「執(zhí)法者」進(jìn)入「議會(huì)大廳」進(jìn)行法律表決。
  • 使用何種方式能夠使得這個(gè)表決過(guò)程正常進(jìn)行,且通過(guò)的『法律』不發(fā)生矛盾。

—— 百度百科

這里的關(guān)鍵對(duì)象在我們的系統(tǒng)中,可以類比為:

  • 議會(huì)大廳=分布式系統(tǒng)
  • 執(zhí)法者=某個(gè)程序
  • 服務(wù)員=RPC通道
  • 賬目=數(shù)據(jù)庫(kù)
  • 法律=一次變更操作

Leslie Lamport自己也提出了解決這個(gè)問(wèn)題的算法——Paxos算法[6]。這個(gè)算法的關(guān)鍵由以下3個(gè)定義來(lái)體現(xiàn):

  • 每次“變更”都有個(gè)唯一的序號(hào),并且能夠通過(guò)它識(shí)別新舊;
  • 「執(zhí)法者」只能接受比已知的“變更”更新的變更;
  • 任意兩次“變更”必須有相同的「執(zhí)法者」參與。

這3點(diǎn)僅僅是保證一致性的最關(guān)鍵部分,全部?jī)?nèi)容還有很多。有興趣的小伙伴可以在文末參考處自行查閱論文。

「Paxos」算法是一種無(wú)領(lǐng)導(dǎo)人(Leaderless)算法,實(shí)現(xiàn)比較復(fù)雜,所以產(chǎn)生了很多變種來(lái)簡(jiǎn)化它,其中名氣最大的應(yīng)該是「Raft」,2013年才問(wèn)世。「Raft」算法是一種領(lǐng)導(dǎo)人(Leadership)的算法。由以下2個(gè)過(guò)程保證達(dá)成共識(shí):

  • 只會(huì)存在一個(gè)活著的領(lǐng)導(dǎo)人,領(lǐng)導(dǎo)人負(fù)責(zé)跟隨者的數(shù)據(jù)同步;
  • 如果領(lǐng)導(dǎo)人“失聯(lián)”了,那么每個(gè)跟隨者都可成為候選人,最終比較誰(shuí)的term最新,誰(shuí)就是新的領(lǐng)導(dǎo)人。這個(gè)term是每個(gè)節(jié)點(diǎn)內(nèi)部維護(hù)的一個(gè)自增數(shù)。

雖然跟隨者的投票秉承先到先得,但是還是會(huì)遇到多個(gè)term相同的候選人獲得了相同票數(shù)(簡(jiǎn)稱「分割投票問(wèn)題」),那么進(jìn)行新一輪投票,直到?jīng)Q出勝負(fù)為止。由于Raft用隨機(jī)定時(shí)器來(lái)自增term,加上網(wǎng)絡(luò)是不穩(wěn)定的,所以再次遇到相同票數(shù)的概率就大大降低了。

完整的過(guò)程更復(fù)雜一些,有一個(gè)Raft算法的動(dòng)畫推薦給大家,有興趣的可以了解一下:http://thesecretlivesofdata.com/raft/。

題外話,大家經(jīng)常用的Zookeeper里的「ZAB」(ZooKeeper Atomic Broadcast)算法也是CFT類算法,是以Fast Paxos算法為基礎(chǔ)實(shí)現(xiàn)的。

5結(jié)語(yǔ)

回過(guò)頭來(lái)看,我們發(fā)現(xiàn),想要更嚴(yán)謹(jǐn)?shù)囊恢滦裕敲淳托枰黾酉嗷ネㄓ嵈_認(rèn)的次數(shù),但是這會(huì)導(dǎo)致性能低下,正如PBFT和Paxos一樣。但是分布式系統(tǒng)就是這樣,到處都需要Balance,找到最適合的才是最重要的。

聊完了數(shù)據(jù)層面的「共識(shí)」問(wèn)題,我們下回再聊聊「分布式事務(wù)」的問(wèn)題,將會(huì)圍繞著常見的CAP、BASE理論展開。

責(zé)任編輯:未麗燕 來(lái)源: 跨界架構(gòu)師訂閱號(hào)
相關(guān)推薦

2016-11-29 09:00:19

分布式數(shù)據(jù)一致性CAS

2022-06-21 21:47:13

數(shù)據(jù)系統(tǒng)

2012-09-24 09:35:42

分布式系統(tǒng)

2023-08-01 07:42:33

Redis數(shù)據(jù)項(xiàng)目

2022-05-31 08:37:59

RedisMySQL數(shù)據(jù)一致性

2024-04-11 13:45:14

Redis數(shù)據(jù)庫(kù)緩存

2019-05-27 09:00:00

蘇寧智慧零售平臺(tái)數(shù)據(jù)庫(kù)

2015-02-06 09:54:29

蘋果Android

2024-11-14 07:10:00

2025-03-27 08:20:54

2022-09-06 15:30:20

緩存一致性

2022-08-11 07:55:05

數(shù)據(jù)庫(kù)Mysql

2020-02-07 10:35:04

MidnightBSDFreeBSDLinux

2021-12-05 21:06:27

軟件

2024-12-26 15:01:29

2021-10-18 10:30:59

流計(jì)算阿里云

2023-12-01 13:51:21

數(shù)據(jù)一致性數(shù)據(jù)庫(kù)

2021-10-13 09:55:11

流計(jì)算引擎數(shù)據(jù)

2023-09-07 08:11:24

Redis管道機(jī)制

2019-02-13 11:04:42

系統(tǒng)緩存軟件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久久久久久图文区 | 成人av免费网站 | 黄色片视频免费 | 亚洲一区二区三区视频 | 久久国产成人午夜av影院武则天 | 亚洲在线日韩 | 精品国产一区二区三区性色 | 国产一级黄色网 | 久久成人精品视频 | 视频在线观看亚洲 | 久草.com | 亚洲va欧美va天堂v国产综合 | 午夜影院官网 | 欧美黄色绿像 | 激情毛片| 超碰电影| 亚洲成人一区 | 免费观看黄| 欧美专区在线 | 一级毛片视频 | 在线观看日韩精品视频 | 91久久久久久久 | 日本不卡免费新一二三区 | 91精品国产色综合久久不卡98 | 神马久久av | 精品欧美乱码久久久久久1区2区 | 国产色婷婷精品综合在线手机播放 | 久久久精彩视频 | 国产粉嫩尤物极品99综合精品 | 999免费网站 | 一区二区视频在线 | 国产视频三区 | 欧美一级久久 | 国产一级片 | 91在线精品一区二区 | 蜜月va乱码一区二区三区 | www国产亚洲精品 | 久久久久久国产一区二区三区 | 亚洲一区不卡 | 国产成人免费视频网站视频社区 | 色黄爽 |