一致性算法(Paxos嚣鄙、Raft吻贿、ZAB)

一致性算法(Paxos、Raft哑子、ZAB)

什么是一致性

1舅列、弱一致性
a、最終一致性
i卧蜓、DNS(Domain Name System)
j帐要、Gossip(Cassandra的通信協(xié)議)

以DNS為例:

2、強(qiáng)一致性
a弥奸、同步
b榨惠、Paxos
c、(multi-paxos)
d盛霎、ZAB(multi-paxos)

image.png

DNS 就是一種最終一致性赠橙,比如 上圖中 增加一條記錄:www.hyb.small.com, 我們從其他DNS服務(wù)器一時(shí)會(huì)讀取不到,但是過一會(huì)就會(huì)讀取得到了摩渺。

分布式系統(tǒng)的問題

數(shù)據(jù)不能存在單點(diǎn)上简烤。
分布式系統(tǒng)對(duì)fault tolerence的一般解決方案是state machine replication 。

準(zhǔn)確的來說應(yīng)該是 state machine replication 的共識(shí)(consensus)算法摇幻。

paxos其實(shí)是一個(gè)共識(shí)算法横侦,系統(tǒng)的最終一致性,不僅需要達(dá)成共識(shí)绰姻,還會(huì)取決于client的行為

強(qiáng)一致性算法---主從同步

主從同步復(fù)制

1枉侧、Master 接受寫請(qǐng)求
2、Master 復(fù)制日志到slave
3狂芋、Master 等待榨馁,直到所有從庫返回

image.png

問題:

任何一個(gè)節(jié)點(diǎn)失敗,哪怕是從節(jié)點(diǎn)(Slave)同步失敗帜矾,都會(huì)導(dǎo)致整個(gè)集群不可用翼虫,雖然保證了一致性,但是可用性卻大大降低

強(qiáng)一致性算法--多數(shù)派

基本想法:
a屡萤、多數(shù)派:
每次寫都保證寫入大于N/2個(gè)節(jié)點(diǎn)珍剑,每次讀保證從大于N/2個(gè)節(jié)點(diǎn)中讀。
比如5個(gè)節(jié)點(diǎn)死陆,每次寫大于3個(gè)節(jié)點(diǎn)才算成功招拙;讀也是大于3個(gè)節(jié)點(diǎn)才算成功。

b、多數(shù)派還不夠别凤!
在并發(fā)環(huán)境下饰序,無法保證系統(tǒng)正確性,順序非常重要规哪。比如下圖的 Inc 5; Set 0; 執(zhí)行順序亂了求豫,結(jié)果就會(huì)引發(fā)錯(cuò)亂。

image.png

強(qiáng)一致性算法---Paxos

Lesile Lamport,Latex的發(fā)明者诉稍。

為描述Paxos算法注祖,Lamport虛擬了一個(gè)叫做Paxos的希臘城邦,這個(gè)島按照議會(huì)民主制的政治模式制定法律均唉,但是沒有人愿意將自己的全部時(shí)間和精力放在這種事上是晨,所以無論是議員、議長(zhǎng)或者傳遞消息的時(shí)間舔箭。

Paxos

1罩缴、Basic Paxos
2、Multi Paxos
3层扶、Fast Paxos

強(qiáng)一致性算法---Basic Paxos

角色介紹:

Client:系統(tǒng)外部角色箫章,請(qǐng)求發(fā)起者。像民眾

Propser: 接受Client 請(qǐng)求镜会,向集群提出提議(propose)檬寂。并在沖突發(fā)生時(shí),起到?jīng)_突調(diào)節(jié)的作用戳表。像議員替民眾提出議案

Accpetor(Voter): 提議投票和接收者桶至,只有在形成法定人數(shù)(Quorum,一般即為majority 多數(shù)派)時(shí),提議才會(huì)最終接受匾旭,像國會(huì)镣屹。

Learner:提議接受者,backup价涝,備份女蜈,對(duì)集群一致性沒什么影響,像記錄員色瘩;

步驟伪窖、階段(phases):
1、Phase 1a:Prepare
proposer 提出一個(gè)提案居兆,編號(hào)為N覆山,此N 大于這個(gè)proposer之前提出提案編號(hào),向acceptors請(qǐng)求同意史辙,要求有quorum接受的才行汹买。

2聊倔、Phase 1b:Promise
N 必須大于此acceptor之前接受的任何提案編號(hào)晦毙,才會(huì)接受,否則會(huì)拒絕耙蔑。

3见妒、Phase 2a: Accept
如果達(dá)到了多數(shù)派,proposer會(huì)發(fā)出accept請(qǐng)求甸陌,此請(qǐng)求包含提案編號(hào)N ,以及提案內(nèi)容须揣。

4、Phase 2b:Accepted
如果此acceptor在此期間沒有收到任何編號(hào)大于N的提案钱豁,則接受此提案內(nèi)容耻卡,否則忽略。

流程圖如下:

image.png
image.png

操作步驟如下:
Request;
Prepare(1);
Promise(1,{Va,Vb,Vc});
Accept(1,Vn)
Accepted(1,Vn);
Response;

1牲尺、Acceptor部分節(jié)點(diǎn)失敗卵酪,但達(dá)到了Quoroms,此時(shí)仍然會(huì)成功谤碳。

image.png

如果有一個(gè)Acceptor因?yàn)楦鞣N原因掛掉了溃卡,3個(gè)Acceptors變成了2個(gè)Acceptors,還是滿足>n/2 的要求蜒简,所以還是會(huì)成功瘸羡。

image.png

2、Proposer失敗搓茬,上一次記錄不會(huì)被寫入Proposer表犹赖,然后重新開啟一個(gè)新的Proposer,來替代上次的Proposer來處理未完成請(qǐng)求卷仑,此時(shí)編號(hào)已經(jīng)增加為2冷尉,也就是Prepare(2)

image.png

Basic Paxos when an Proposer fails
如果Proposer 在發(fā)送了一條Accept消息之后,但是還沒收到Accepted消息之前就掛掉了系枪,只有一個(gè)Acceptor接收到了Accept消息雀哨。那么整個(gè)Paxos協(xié)議就沒法進(jìn)行下去了,這時(shí)一個(gè)新的Leader(Proposer)會(huì)被選舉出來私爷,重新開始一輪新的共識(shí)雾棺。

image.png

Basic Paxos潛在的問題是:活鎖(liveness)或dueling

Basic Paxos很有可能出現(xiàn)這種情況:
1、議員A(proposer A)說我們來討論提案1衬浑,大部分議員說:“好捌浩,我們來討論提案1”;
2工秩、但是此時(shí)議員A還沒有說內(nèi)容是什么尸饺,這時(shí)候又來了一個(gè)議員B进统,又來說:“我們來討論提案2”;這時(shí)候大部分還沒有接受提案1浪听,提案2的編號(hào)是大于提案1的螟碎,這時(shí)候大部分還沒有接受議案2;
3迹栓、這時(shí)候議員A以為網(wǎng)絡(luò)斷了掉分,然后把編號(hào)改下,內(nèi)容不變?nèi)缓筇岢鲎h案3克伊;然后議案4酥郭、議案5....
這樣就形成了活鎖。
解決活鎖的方法是用Random的timeout愿吹,當(dāng)兩個(gè)沖突的時(shí)候用一個(gè)隨機(jī)的等待時(shí)間不从;當(dāng)自己提議未生效時(shí),再發(fā)起提議等待幾秒犁跪。

image.png

Basic-Paxos是一個(gè)無限循環(huán)的2PC消返,1條日志的確認(rèn)至少需要2個(gè)RTT + 2次落盤(1次是prepare的廣播與回復(fù),1次是accept的廣播與回復(fù))耘拇。

Basic Paxos when multiple Proposers conflict
最后再描述一個(gè)最復(fù)雜的情況撵颊,即有多個(gè)Proposers認(rèn)為他們是Leaders,并不斷的發(fā)送Prepare請(qǐng)求惫叛。為什么會(huì)有多個(gè)Leaders呢倡勇? 有可能一個(gè)Proposer當(dāng)了一段時(shí)間Leader之后掛掉了,新的Proposer被選為L(zhǎng)eader繼續(xù)新的一輪共識(shí)嘉涌。后面掛掉的Proposer又恢復(fù)了妻熊,它認(rèn)為自己還是Leader,所以繼續(xù)發(fā)送Prepare請(qǐng)求仑最。

image.png
image.png

強(qiáng)一致性算法 ---Multi Paxos

Basic Paxos的問題
難實(shí)現(xiàn)(角色太多)扔役、效率低(2輪RPC)、活鎖問題

Multi Paxos:
新概念警医,Leader;唯一的propser亿胸,所有請(qǐng)求都需經(jīng)過此Leader;

image.png
image.png

只有一個(gè)Proposer,沒有第二個(gè)Proposer预皇; 這個(gè)Proposer就是Leader,沒人跟他搶;

再者分布式系統(tǒng)必須串行執(zhí)行所有提議侈玄,否則就會(huì)出現(xiàn)前面說的順序問題。

--------First Request(第一次執(zhí)行)----------
Request
Prepare(N) //選Leader
Promise(N,I,{Va,Vb,Vc})
Accept!(N,I,Vm)
Accepted(N,I,Vm)
Response;

--------Following Request(第二次或者以后)----------
Request
Accept!(N,I,Vm)
Accepted(N,I,Vm)
Response;

第二次或者以后吟温,就不用再選Leader了 直接執(zhí)行Request 請(qǐng)求序仙,由Leader 發(fā)出議案。
如果Leader 掛了 就選下一個(gè)總統(tǒng)Leader(N+1)

Multi-Paxos when roles are collapsed

減少角色鲁豪,進(jìn)一步簡(jiǎn)化潘悼,在Basic-Paxos中我們區(qū)分了很多角色律秃,有Clients、Proposers治唤、Acceptors棒动、 Learners,實(shí)際上Proposers肝劲、Acceptors 、Leanrners可以合并成一個(gè)郭宝,統(tǒng)稱為Server辞槐,下面是合并之后的序列圖。


image.png
image.png

Multi-Paxos when roles are collapsed and the leader is steady
同樣的粘室,當(dāng)Leader很穩(wěn)定的時(shí)候榄檬,我們可以在接下來的執(zhí)行中忽略Phase 1. 如下圖所示:

image.png

強(qiáng)一致性算法---Raft

Raft
1、劃分三個(gè)子問題
a衔统、Leader Election
b鹿榜、Log Replication
c、Safely
2锦爵、重定義角色
a舱殿、Leader
b、Follower
c险掀、Candidate

原理動(dòng)畫解釋:http://thesecretlivesofdata.com/raft
場(chǎng)景測(cè)試:https://raft.github.io

Raft 是比 Multi Paxos 還要簡(jiǎn)單的一個(gè)版本
一致性并不代表完全正確性沪袭!三個(gè)可能結(jié)果:成功,失敗樟氢,unknown

詳細(xì)內(nèi)容參考:
http://www.reibang.com/p/6cd41fe0b8f6

強(qiáng)一致性算法--ZAB
基本與raft相同冈绊。在一些名詞的叫法上有些區(qū)別:如ZAB將某一個(gè)leader的周期稱為epoch,而raft則稱為term埠啃。實(shí)現(xiàn)上也有些許不同:如raft保證日志連續(xù)性死宣,心跳方向?yàn)閘eader至follower,ZAB則相反碴开。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毅该,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潦牛,更是在濱河造成了極大的恐慌鹃骂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罢绽,死亡現(xiàn)場(chǎng)離奇詭異畏线,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)良价,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門寝殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿叠,“玉大人,你說我怎么就攤上這事蚣常∈醒剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵抵蚊,是天一觀的道長(zhǎng)施绎。 經(jīng)常有香客問我,道長(zhǎng)贞绳,這世上最難降的妖魔是什么谷醉? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮冈闭,結(jié)果婚禮上俱尼,老公的妹妹穿的比我還像新娘。我一直安慰自己萎攒,他們只是感情好遇八,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耍休,像睡著了一般刃永。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羊精,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天揽碘,我揣著相機(jī)與錄音,去河邊找鬼园匹。 笑死雳刺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裸违。 我是一名探鬼主播掖桦,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼供汛!你這毒婦竟也來了枪汪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤怔昨,失蹤者是張志新(化名)和其女友劉穎雀久,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁舀,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赖捌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矮烹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越庇。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罩锐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卤唉,到底是詐尸還是另有隱情涩惑,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布桑驱,位于F島的核電站竭恬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熬的。R本人自食惡果不足惜痊硕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悦析。 院中可真熱鬧寿桨,春花似錦此衅、人聲如沸强戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骑歹。三九已至,卻和暖如春墨微,著一層夾襖步出監(jiān)牢的瞬間道媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工翘县, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最域,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓锈麸,卻偏偏與公主長(zhǎng)得像镀脂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忘伞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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