分布式系統(tǒng)的Raft算法

Raft 協(xié)議的易理解性描述

雖然 Raft 的論文比 Paxos 簡單版論文還容易讀了,但論文依然發(fā)散的比較多谤草,相對冗長膨俐。讀完后掩卷沉思覺得還是整理一下才會更牢靠沙郭,變成真正屬于自己的榴芳。這里我就借助前面黑白棋落子里第一種極簡思維來描述和概念驗證下 Raft 協(xié)議的工作方式嗡靡。

在一個由 Raft 協(xié)議組織的集群中有三類角色:

Leader(領(lǐng)袖)

Follower(群眾)

Candidate(候選人)

就像一個民主社會,領(lǐng)袖由民眾投票選出窟感。剛開始沒有領(lǐng)袖讨彼,所有集群中的參與者都是群眾,那么首先開啟一輪大選柿祈,在大選期間所有群眾都能參與競選哈误,這時所有群眾的角色就變成了候選人,民主投票選出領(lǐng)袖后就開始了這屆領(lǐng)袖的任期躏嚎,然后選舉結(jié)束蜜自,所有除領(lǐng)袖的候選人又變回群眾角色服從領(lǐng)袖領(lǐng)導。這里提到一個概念「任期」卢佣,用術(shù)語 Term 表達重荠。關(guān)于 Raft 協(xié)議的核心概念和術(shù)語就這么多而且和現(xiàn)實民主制度非常匹配,所以很容易理解珠漂。三類角色的變遷圖如下晚缩,結(jié)合后面的選舉過程來看很容易理解尾膊。

Leader 選舉過程

在極簡的思維下媳危,一個最小的 Raft 民主集群需要三個參與者(如下圖:A、B冈敛、C)待笑,這樣才可能投出多數(shù)票。初始狀態(tài) ABC 都是 Follower抓谴,然后發(fā)起選舉這時有三種可能情形發(fā)生暮蹂。下圖中前二種都能選出 Leader,第三種則表明本輪投票無效(Split Votes)癌压,每方都投給了自己仰泻,結(jié)果沒有任何一方獲得多數(shù)票。之后每個參與方隨機休息一陣(Election Timeout)重新發(fā)起投票直到一方獲得多數(shù)票滩届。這里的關(guān)鍵就是隨機 timeout集侯,最先從 timeout 中恢復發(fā)起投票的一方向還在 timeout 中的另外兩方請求投票,這時它們就只能投給對方了,很快達成一致棠枉。

選出 Leader 后浓体,Leader 通過定期向所有 Follower 發(fā)送心跳信息維持其統(tǒng)治。若 Follower 一段時間未收到 Leader 的心跳則認為 Leader 可能已經(jīng)掛了再次發(fā)起選主過程辈讶。

Leader 節(jié)點對一致性的影響

Raft 協(xié)議強依賴 Leader 節(jié)點的可用性來確保集群數(shù)據(jù)的一致性命浴。數(shù)據(jù)的流向只能從 Leader 節(jié)點向 Follower 節(jié)點轉(zhuǎn)移。當 Client 向集群 Leader 節(jié)點提交數(shù)據(jù)后贱除,Leader 節(jié)點接收到的數(shù)據(jù)處于未提交狀態(tài)(Uncommitted)生闲,接著 Leader 節(jié)點會并發(fā)向所有 Follower 節(jié)點復制數(shù)據(jù)并等待接收響應,確保至少集群中超過半數(shù)節(jié)點已接收到數(shù)據(jù)后再向 Client 確認數(shù)據(jù)已接收勘伺。一旦向 Client 發(fā)出數(shù)據(jù)接收 Ack 響應后跪腹,表明此時數(shù)據(jù)狀態(tài)進入已提交(Committed),Leader 節(jié)點再向 Follower 節(jié)點發(fā)通知告知該數(shù)據(jù)狀態(tài)已提交飞醉。

在這個過程中冲茸,主節(jié)點可能在任意階段掛掉,看下 Raft 協(xié)議如何針對不同階段保障數(shù)據(jù)一致性的缅帘。

1. 數(shù)據(jù)到達 Leader 節(jié)點前

這個階段 Leader 掛掉不影響一致性轴术,不多說。

2. 數(shù)據(jù)到達 Leader 節(jié)點钦无,但未復制到 Follower 節(jié)點

這個階段 Leader 掛掉逗栽,數(shù)據(jù)屬于未提交狀態(tài),Client 不會收到 Ack 會認為超時失敗可安全發(fā)起重試失暂。Follower 節(jié)點上沒有該數(shù)據(jù)彼宠,重新選主后 Client 重試重新提交可成功。原來的 Leader 節(jié)點恢復后作為 Follower 加入集群重新從當前任期的新 Leader 處同步數(shù)據(jù)弟塞,強制保持和 Leader 數(shù)據(jù)一致凭峡。

3. 數(shù)據(jù)到達 Leader 節(jié)點,成功復制到 Follower 所有節(jié)點决记,但還未向 Leader 響應接收

這個階段 Leader 掛掉摧冀,雖然數(shù)據(jù)在 Follower 節(jié)點處于未提交狀態(tài)(Uncommitted)但保持一致,重新選出 Leader 后可完成數(shù)據(jù)提交系宫,此時 Client 由于不知到底提交成功沒有索昂,可重試提交。針對這種情況 Raft 要求 RPC 請求實現(xiàn)冪等性扩借,也就是要實現(xiàn)內(nèi)部去重機制椒惨。

4. 數(shù)據(jù)到達 Leader 節(jié)點,成功復制到 Follower 部分節(jié)點潮罪,但還未向 Leader 響應接收

這個階段 Leader 掛掉康谆,數(shù)據(jù)在 Follower 節(jié)點處于未提交狀態(tài)(Uncommitted)且不一致凄杯,Raft 協(xié)議要求投票只能投給擁有最新數(shù)據(jù)的節(jié)點。所以擁有最新數(shù)據(jù)的節(jié)點會被選為 Leader 再強制同步數(shù)據(jù)到 Follower秉宿,數(shù)據(jù)不會丟失并最終一致戒突。

5. 數(shù)據(jù)到達 Leader 節(jié)點,成功復制到 Follower 所有或多數(shù)節(jié)點描睦,數(shù)據(jù)在 Leader 處于已提交狀態(tài)膊存,但在 Follower 處于未提交狀態(tài)

這個階段 Leader 掛掉,重新選出新 Leader 后的處理流程和階段 3 一樣忱叭。

6. 數(shù)據(jù)到達 Leader 節(jié)點隔崎,成功復制到 Follower 所有或多數(shù)節(jié)點,數(shù)據(jù)在所有節(jié)點都處于已提交狀態(tài)韵丑,但還未響應 Client

這個階段 Leader 掛掉爵卒,Cluster 內(nèi)部數(shù)據(jù)其實已經(jīng)是一致的,Client 重復重試基于冪等策略對一致性無影響撵彻。

7. 網(wǎng)絡分區(qū)導致的腦裂情況钓株,出現(xiàn)雙 Leader

網(wǎng)絡分區(qū)將原先的 Leader 節(jié)點和 Follower 節(jié)點分隔開,F(xiàn)ollower 收不到 Leader 的心跳將發(fā)起選舉產(chǎn)生新的 Leader陌僵。這時就產(chǎn)生了雙 Leader轴合,原先的 Leader 獨自在一個區(qū),向它提交數(shù)據(jù)不可能復制到多數(shù)節(jié)點所以永遠提交不成功碗短。向新的 Leader 提交數(shù)據(jù)可以提交成功受葛,網(wǎng)絡恢復后舊的 Leader 發(fā)現(xiàn)集群中有更新任期(Term)的新 Leader 則自動降級為 Follower 并從新 Leader 處同步數(shù)據(jù)達成集群數(shù)據(jù)一致。

綜上窮舉分析了最小集群(3 節(jié)點)面臨的所有情況偎谁,可以看出 Raft 協(xié)議都能很好的應對一致性問題总滩,并且很容易理解。

總結(jié)

就引用 Raft 論文最后的一節(jié)的綜述來總結(jié)本文吧巡雨。

算法以正確性闰渔、高效性、簡潔性作為主要設(shè)計目標鸯隅。

雖然這些都是很有價值的目標澜建,但這些目標都不會達成直到開發(fā)者寫出一個可用的實現(xiàn)向挖。

所以我們相信可理解性同樣重要蝌以。

深以為然,想想 Paxos 算法是 Leslie Lamport 在 1990 年就公開發(fā)表在了自己的網(wǎng)站上何之,想想我們是什么時候才聽說的跟畅?什么時候才有一個可用的實現(xiàn)?而 Raft 算法是 2013 年發(fā)表的溶推,大家在參考[5]上面可以看到有多少個不同語言開源的實現(xiàn)庫了徊件,這就是可理解性的重要性奸攻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虱痕,隨后出現(xiàn)的幾起案子睹耐,更是在濱河造成了極大的恐慌,老刑警劉巖部翘,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硝训,死亡現(xiàn)場離奇詭異,居然都是意外死亡新思,警方通過查閱死者的電腦和手機窖梁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夹囚,“玉大人纵刘,你說我怎么就攤上這事≥┯矗” “怎么了假哎?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鞍历。 經(jīng)常有香客問我位谋,道長,這世上最難降的妖魔是什么堰燎? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任掏父,我火速辦了婚禮,結(jié)果婚禮上秆剪,老公的妹妹穿的比我還像新娘赊淑。我一直安慰自己,他們只是感情好仅讽,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布陶缺。 她就那樣靜靜地躺著,像睡著了一般洁灵。 火紅的嫁衣襯著肌膚如雪饱岸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天徽千,我揣著相機與錄音苫费,去河邊找鬼。 笑死双抽,一個胖子當著我的面吹牛百框,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牍汹,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铐维,長吁一口氣:“原來是場噩夢啊……” “哼柬泽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫁蛇,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锨并,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睬棚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳疏,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年闸拿,在試婚紗的時候發(fā)現(xiàn)自己被綠了空盼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡新荤,死狀恐怖揽趾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苛骨,我是刑警寧澤篱瞎,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站痒芝,受9級特大地震影響俐筋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜严衬,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一澄者、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧请琳,春花似錦粱挡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竖慧,卻和暖如春嫌套,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圾旨。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工踱讨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碳胳。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓勇蝙,卻偏偏與公主長得像沫勿,于是被迫代替她去往敵國和親挨约。 傳聞我的和親對象是個殘疾皇子味混,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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