說一說那些我也不太懂的 Raft 協(xié)議

分布式一致性協(xié)議 Raft,自 2013 年論文發(fā)表之后就受到了技術(shù)領(lǐng)域的熱捧泪幌,我認(rèn)為相對(duì)于其他分布式一致性算法盲厌,Raft 有效的解決了分布式一致性算法過于復(fù)雜及難于實(shí)現(xiàn)的問題,這也是 Raft 能異軍突起的主要因素祸泪。


image.png

Raft 協(xié)議有效的借鑒了美國(guó)總統(tǒng)大選的策略吗浩,采用精英(Raft 稱呼這個(gè)精英為 Leader)領(lǐng)導(dǎo)全局的方案,整個(gè)集群中只有 Leader 可以處理 client 發(fā)送過來的請(qǐng)求没隘,其他非 Leader 節(jié)點(diǎn)即使接收到請(qǐng)求也必須將其轉(zhuǎn)發(fā)到 Leader 節(jié)點(diǎn)進(jìn)行處理懂扼。Raft 集群中的成員分三種角色:

  1. Leader
  2. Follower
  3. Condidate

Raft 的選舉過程

Raft 協(xié)議在集群初始狀態(tài)下是沒有 Leader 的, 集群中所有成員均是 Follower,在選舉開始期間所有 Follower 均可參與選舉右蒲,這時(shí)所有 Follower 的角色均轉(zhuǎn)變?yōu)?Condidate, Leader 由集群中所有的 Condidate 投票選出阀湿,最后獲得投票最多的 Condidate 獲勝,其角色轉(zhuǎn)變?yōu)?Leader 并開始其任期瑰妄,其余落敗的 Condidate 角色轉(zhuǎn)變?yōu)?Follower 開始服從 Leader 領(lǐng)導(dǎo)陷嘴。這里有一種意外的情況會(huì)選不出 Leader 就是所有 Condidate 均投票給自己,這樣無法決出票數(shù)多的一方间坐,Raft 算法為了解決這個(gè)問題引入了北洋時(shí)期袁世凱獲選大總統(tǒng)的謀略灾挨,即選不出 Leader 不罷休,直到選出為止竹宋,一輪選不出 Leader涨醋,便令所有 Condidate 隨機(jī) sleap(Raft 論文稱為 timeout)一段時(shí)間,然后馬上開始新一輪的選舉逝撬,這里的隨機(jī) sleep 就起了很關(guān)鍵的因素浴骂,第一個(gè)從 sleap 狀態(tài)恢復(fù)過來的 Condidate 會(huì)向所有 Condidate 發(fā)出投票給我的申請(qǐng),這時(shí)還沒有蘇醒的 Condidate 就只能投票給已經(jīng)蘇醒的 Condidate 宪潮,因此可以有效解決 Condiadte 均投票給自己的故障溯警,便可快速的決出 Leader趣苏。

選舉出 Leader 后 Leader 會(huì)定期向所有 Follower 發(fā)送 heartbeat 來維護(hù)其 Leader 地位,如果 Follower 一段時(shí)間后未收到 Leader 的心跳則認(rèn)為 Leader 已經(jīng)掛掉梯轻,便轉(zhuǎn)變自身角色為 Condidate食磕,同時(shí)發(fā)起新一輪的選舉,產(chǎn)生新的 Leader喳挑。

Raft 的數(shù)據(jù)一致性策略

Raft 協(xié)議強(qiáng)依賴 Leader 節(jié)點(diǎn)來確保集群數(shù)據(jù)一致性彬伦。即 client 發(fā)送過來的數(shù)據(jù)均先到達(dá) Leader 節(jié)點(diǎn),Leader 接收到數(shù)據(jù)后伊诵,先將數(shù)據(jù)標(biāo)記為 uncommitted 狀態(tài)单绑,隨后 Leader 開始向所有 Follower 復(fù)制數(shù)據(jù)并等待響應(yīng),在獲得集群中大于 N/2 個(gè) Follower 的已成功接收數(shù)據(jù)完畢的響應(yīng)后曹宴,Leader 將數(shù)據(jù)的狀態(tài)標(biāo)記為 committed搂橙,隨后向 client 發(fā)送數(shù)據(jù)已接收確認(rèn),在向 client 發(fā)送出已數(shù)據(jù)接收后笛坦,再向所有 Follower 節(jié)點(diǎn)發(fā)送通知表明該數(shù)據(jù)狀態(tài)為committed区转。

Raft 如何處理 Leader 意外的?

  1. client 發(fā)送數(shù)據(jù)到達(dá) Leader 之前 Leader 就掛了版扩,因?yàn)閿?shù)據(jù)還沒有到達(dá)集群內(nèi)部废离,所以對(duì)集群內(nèi)部數(shù)據(jù)的一致性沒有影響,Leader 掛了之后礁芦,集群會(huì)進(jìn)行新的選舉產(chǎn)生新的 Leader厅缺,之前掛掉的 Leader 重啟后作為 Follower 加入集群,并同步 Leader 上的數(shù)據(jù)宴偿。這里最好要求 client 有重試機(jī)制在一定時(shí)間沒有收到 Leader 的數(shù)據(jù)已接收確認(rèn)后進(jìn)行一定次數(shù)的重試湘捎,并再次向新的 Leader 發(fā)送數(shù)據(jù)來確保業(yè)務(wù)的流暢性。

  2. client 發(fā)送數(shù)據(jù)到 Leader窄刘,數(shù)據(jù)到達(dá) Leader 后窥妇,Leader 還沒有開始向 Folloers 復(fù)制數(shù)據(jù),Leader就掛了娩践,此時(shí)數(shù)據(jù)仍被標(biāo)記為 uncommited 狀態(tài)活翩,這時(shí)集群會(huì)進(jìn)行新的選舉產(chǎn)生新的 Leader,之前掛掉的 Leader 重啟后作為 Follower 加入集群翻伺,并同步 Leader 上的數(shù)據(jù)材泄,來保證數(shù)據(jù)一致性,之前接收到 client 的數(shù)據(jù)由于是 uncommited 狀態(tài)所以可能會(huì)被丟棄吨岭。這里同樣最好要求 client 有重試機(jī)制通過在一定時(shí)間在沒有收到 Leader 的數(shù)據(jù)已接收確認(rèn)后進(jìn)行一定次數(shù)的重試拉宗,再次向新的 Leader 發(fā)送數(shù)據(jù)來確保業(yè)務(wù)的流暢性。

  3. client 發(fā)送數(shù)據(jù)到 Leader, Leader 接收數(shù)據(jù)完畢后標(biāo)記為 uncommited,開始向 Follower復(fù)制數(shù)據(jù)旦事,在復(fù)制完畢一小部分 Follower 后 Leader 掛了魁巩,此時(shí)數(shù)據(jù)在所有已接收到數(shù)據(jù)的 Follower 上仍被標(biāo)記為 uncommitted,但國(guó)不可一日無君姐浮,此時(shí)集群將進(jìn)行新的選舉谷遂,而擁有最新數(shù)據(jù)的 Follower 變換角色為 Condidate,也就意味著 Leader 將在擁有最新數(shù)據(jù)的 Follower 中產(chǎn)生卖鲤,新的 Leader 產(chǎn)生后所有節(jié)點(diǎn)開始從新 Leader 上同步數(shù)據(jù)確保數(shù)據(jù)的一致性肾扰,包括之前掛掉后恢復(fù)了狀態(tài)的 老Leader,這時(shí)也以 Follower 的身份同步新 Leader 上的數(shù)據(jù)蛋逾。

  4. client 發(fā)送數(shù)據(jù)到 Leader集晚,Leader 接收數(shù)據(jù)完畢后標(biāo)記為 uncommitted,開始向 Follower 復(fù)制數(shù)據(jù)换怖,在復(fù)制完畢所有 Follower 節(jié)點(diǎn)或者大部分節(jié)點(diǎn)(大于 N/2),并接收到大部分節(jié)點(diǎn)接收完畢的響應(yīng)后蟀瞧,Leader 節(jié)點(diǎn)將數(shù)據(jù)標(biāo)記為 committed沉颂,這時(shí) Leader 掛了,此時(shí)已接收到數(shù)據(jù)的所有 Follower 節(jié)點(diǎn)上的數(shù)據(jù)狀態(tài)由于還沒有接收到 Leader 的 commited 通知悦污,均處于 uncommited 狀態(tài)铸屉。這時(shí)集群進(jìn)行了新的選舉,新的 Leader 將在擁有最新數(shù)據(jù)的節(jié)點(diǎn)中產(chǎn)生切端,新的 Leader 產(chǎn)生后彻坛,由于 client 端因老 Leader 掛掉前沒有通知其數(shù)據(jù)已接收,所以會(huì)向新的 Leader 發(fā)送重試請(qǐng)求踏枣,而新的 Leader 上已經(jīng)存在了這個(gè)之前從老 Leader 上同步過來的數(shù)據(jù)昌屉,因此 Raft 集群要求各節(jié)點(diǎn)自身實(shí)現(xiàn)去重的機(jī)制,保證數(shù)據(jù)的一致性茵瀑。

  5. 集群腦裂的一致性處理间驮,多發(fā)于雙機(jī)房的跨機(jī)房模式的集群。假設(shè)一個(gè) 5 節(jié)點(diǎn)的 Raft 集群马昨,其中三個(gè)節(jié)點(diǎn)在 A 機(jī)房竞帽,Leader 節(jié)點(diǎn)也在 A 機(jī)房,兩個(gè)節(jié)點(diǎn)在 B 機(jī)房鸿捧。突然 A屹篓、B 兩個(gè)機(jī)房之間因其他故障無法通訊,那么此時(shí) B 機(jī)房中的 2 個(gè)Follower 因?yàn)槭ヅc Leader 的聯(lián)系匙奴,均轉(zhuǎn)變自身角色為 Condidate堆巧。根據(jù) Leader 選舉機(jī)制,B 機(jī)房中產(chǎn)生了一個(gè)新的 Leader,這就發(fā)生了腦裂即存在 A 機(jī)房中的老 Leader 的集群與B機(jī)房新 Leader 的集群恳邀。Raft 針對(duì)這種情況的處理方式是老的 Leader 集群雖然剩下三個(gè)節(jié)點(diǎn)懦冰,但是 Leader 對(duì)數(shù)據(jù)的處理過程還是在按原來 5 個(gè)節(jié)點(diǎn)進(jìn)行處理,所以老的 Leader 接收到的數(shù)據(jù)谣沸,在向其他 4 個(gè)節(jié)點(diǎn)復(fù)制數(shù)據(jù)刷钢,由于無法獲取超過 N/2 個(gè) Follower 節(jié)點(diǎn)的復(fù)制完畢數(shù)據(jù)響應(yīng)(因?yàn)闊o法連接到 B 機(jī)房中的 2個(gè)節(jié)點(diǎn)),所以 client 在向老 Leader 發(fā)送的數(shù)據(jù)請(qǐng)求均無法成功寫入乳附,而 client 向B機(jī)房新 Leader 發(fā)送的數(shù)據(jù)内地,因?yàn)槭切鲁闪⒌募海钥梢猿晒懭霐?shù)據(jù)赋除,在A阱缓、B兩個(gè)機(jī)房恢復(fù)網(wǎng)絡(luò)通訊后,A 機(jī)房中的所有節(jié)點(diǎn)包括老 Leader 再以 Follower 角色接入這個(gè)集群举农,并同步新 Leader 中的數(shù)據(jù)荆针,完成數(shù)據(jù)一致性處理。

因?yàn)樗惴ㄒ哉_性颁糟、高效性航背、簡(jiǎn)潔性為主要目標(biāo),但這些目標(biāo)都不會(huì)達(dá)成直到你通過代碼實(shí)現(xiàn)它之前棱貌,所以接下來業(yè)余時(shí)間我將通過 Python 簡(jiǎn)單造一個(gè) Raft 的小輪子玖媚,敬請(qǐng)期待_


  • 點(diǎn)擊鏈接加入群【Python實(shí)戰(zhàn)交流群】:https://jq.qq.com/?_wv=1027&k=5qwTsxH
  • 搜索 QQ 群號(hào) 397234385 入群【Python實(shí)戰(zhàn)交流群】
  • 或 QQ 掃碼入群:
qq群.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市婚脱,隨后出現(xiàn)的幾起案子今魔,更是在濱河造成了極大的恐慌,老刑警劉巖障贸,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错森,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡篮洁,警方通過查閱死者的電腦和手機(jī)问词,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘀粱,“玉大人激挪,你說我怎么就攤上這事》孢叮” “怎么了垄分?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娃磺。 經(jīng)常有香客問我薄湿,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任豺瘤,我火速辦了婚禮吆倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坐求。我一直安慰自己蚕泽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布桥嗤。 她就那樣靜靜地躺著须妻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泛领。 梳的紋絲不亂的頭發(fā)上荒吏,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音渊鞋,去河邊找鬼绰更。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锡宋,可吹牛的內(nèi)容都是我干的儡湾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼员辩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盒粮!你這毒婦竟也來了鸵鸥?” 一聲冷哼從身側(cè)響起奠滑,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妒穴,沒想到半個(gè)月后宋税,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讼油,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年杰赛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矮台。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乏屯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘦赫,到底是詐尸還是另有隱情辰晕,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布确虱,位于F島的核電站含友,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窘问,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一辆童、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惠赫,春花似錦把鉴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至概疆,卻和暖如春逗威,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岔冀。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工凯旭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人使套。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓罐呼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親侦高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫉柴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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