由Consul談到Raft

在前一篇文章consul配置與實戰(zhàn)中木柬,介紹了consul的一些內(nèi)幕及consul配置相關(guān),并對項目中的一些實際配置進行展示淹办。這篇文章重點介紹consul中所涉及到的一致性算法raft眉枕。

1. 背景

分布式系統(tǒng)的一致性是相當重要的,即為CAP理論中的C(Consistency)怜森。一致性又可以分為強一致性和最終一致性齐遵。這篇文章重點討論強一致性算法raft。

Lamport發(fā)表Paxos一致性算法從90年提出到現(xiàn)在已經(jīng)有二十幾年了塔插,直到2006年Google的三篇論文初現(xiàn)“云”的端倪梗摇,其中的Chubby Lock服務(wù)使用Paxos作為Chubby Cell中的一致性算法,Paxos的人氣從此一路狂飆想许。而Paxos流程太過于繁雜實現(xiàn)起來也比較復雜伶授,雖然現(xiàn)在很廣泛使用的Zookeeper也是基于Paxos算法來實現(xiàn),但是Zookeeper使用的ZAB(Zookeeper Atomic Broadcast)協(xié)議對Paxos進行了很多的改進與優(yōu)化流纹,復雜性是制約他發(fā)展的一個重要原因糜烹。Raft的設(shè)計初衷就是易于理解性。

Raft是斯坦福的Diego Ongaro漱凝、John Ousterhout兩個人以易懂(Understandability)為目標設(shè)計的一致性算法疮蹦,在2013年發(fā)布了論文:《In Search of an Understandable Consensus Algorithm》

從2013年發(fā)布到現(xiàn)在不過只有兩年,到現(xiàn)在已經(jīng)有了十多種語言的Raft算法實現(xiàn)框架茸炒,較為出名的有etcd愕乎。

2. Raft詳解

強調(diào)的是易懂(Understandability)阵苇,Raft和Paxos一樣只要保證n/2+1節(jié)點正常就能夠提供服務(wù);眾所周知但問題較為復雜時可以把問題分解為幾個小問題來處理感论,Raft也使用了分而治之的思想把算法流程分為三個子問題:選舉(Leader election)绅项、日志復制(Log replication)、安全性(Safety)三個子問題比肄。

2.1 raft基本概念

  1. states
    一個raft集群擁有多個server快耿,通常會有5臺,這樣可以允許系統(tǒng)中兩臺server宕機芳绩。在任何情況下掀亥,所有的server只有如下三種狀態(tài)之一:

    • Leader,負責Client交互和log復制妥色,同一時刻系統(tǒng)中最多存在1個
    • Follower铺浇,被動響應(yīng)請求RPC,從不主動發(fā)起請求RPC
    • Candidate垛膝,由Follower向Leader轉(zhuǎn)換的中間狀態(tài)

    在正常的操作流程中鳍侣,集群中有且只有一個server,其他所有的server都是follower吼拥。follower是被動的倚聚,他們只是被動地相應(yīng)Candidate和leader的請求。凿可。leader處理所有的客戶端請求惑折,follower自己不處理而是轉(zhuǎn)發(fā)給leader。第三種狀態(tài)是Candidate枯跑,用來選舉一個新的leader惨驶。

    角色轉(zhuǎn)換
    角色轉(zhuǎn)換
  2. Terms
    Raft將時間劃分成任意的長度周期。Terms可以理解為邏輯周期敛助,用連續(xù)的整數(shù)表示粗卜。在分布式環(huán)境中,時間同步很重要纳击,同時是一個難題续扔。在Raft中使用了一個可以理解為周期(任期)的概念,用Term作為一個周期焕数,每個Term都是一個連續(xù)遞增的編號纱昧,每一輪選舉都是一個Term周期,在一個Term中只能產(chǎn)生一個Leader堡赔。
    每個term伴隨著一次election识脆,一個或多個Candidate試圖成為leader,如上圖的狀態(tài)轉(zhuǎn)換。如果某個Candidate贏得了這次election灼捂,它將升級為剩余server的leader离例。在某些election的情形中,會產(chǎn)生耗票(Split Votes)的結(jié)果 纵东,即投票結(jié)果無效粘招,隨后一次新的term開始啥寇。raft確保在某個term至多有一個leader偎球。

    terms
    terms

    如上圖所示,時間被劃分成多個terms辑甜,每個term隨著一次election衰絮。election完成后,一個leader節(jié)點管理整個集群磷醋,直至這個term結(jié)束猫牡。有些election失敗了,未能產(chǎn)生一個leader邓线。

2.2 Leader election

所有節(jié)點都是以follower啟動淌友。一個最小的 Raft 集群需要三個參與者,這樣才可能投出多數(shù)票骇陈。初始狀態(tài) 都是 Follower震庭,然后發(fā)起選舉這時有三種可能情形發(fā)生。如果每方都投給了自己你雌,結(jié)果沒有任何一方獲得多數(shù)票器联。之后每個參與方隨機休息一陣(Election Timeout)重新發(fā)起投票直到一方獲得多數(shù)票。這里的關(guān)鍵就是隨機 timeout婿崭,最先從timeout中恢復發(fā)起投票的一方向還在 timeout 中的另外兩方請求投票拨拓,這時它們就只能投給對方了,很快達成一致氓栈。
Raft的選舉由定時器來觸發(fā)渣磷,每個節(jié)點的選舉定時器時間都是不一樣的,開始時狀態(tài)都為Follower某個節(jié)點定時器觸發(fā)選舉后Term遞增授瘦,狀態(tài)由Follower轉(zhuǎn)為Candidate幸海,向其他節(jié)點發(fā)起RequestVote RPC請求,這時候有三種可能的情況發(fā)生:
  1.該RequestVote請求接收到n/2+1(過半數(shù))個節(jié)點的投票奥务,從Candidate轉(zhuǎn)為Leader物独,向其他節(jié)點發(fā)送heartBeat以保持Leader的正常運轉(zhuǎn)。
  2.在此期間如果收到其他節(jié)點發(fā)送過來的AppendEntries RPC請求氯葬,如該節(jié)點的Term大則當前節(jié)點轉(zhuǎn)為Follower挡篓,否則保持Candidate拒絕該請求。
  3.Election timeout發(fā)生則Term遞增,重新發(fā)起選舉官研。
  在一個Term期間每個節(jié)點只能投票一次秽澳,所以當有多個Candidate存在時就會出現(xiàn)每個Candidate發(fā)起的選舉都存在接收到的投票數(shù)都不過半的問題,這時每個Candidate都將Term遞增戏羽、重啟定時器并重新發(fā)起選舉担神,由于每個節(jié)點中定時器的時間都是隨機的,所以就不會多次存在有多個Candidate同時發(fā)起投票的問題始花。

引用一張網(wǎng)上的圖片妄讯,比較形象铅匹,如下圖粉铐。


vote
vote

2.3 Log replication

日志復制主要是用于保證節(jié)點的一致性,這階段所做的操作也是為了保證一致性與高可用性讯嫂;當Leader選舉出來后便開始負責客戶端的請求浇垦,所有事務(wù)(更新操作)請求都必須先經(jīng)過Leader處理炕置,這些事務(wù)請求或說成命令也就是這里說的日志,我們都知道要保證節(jié)點的一致性就要保證每個節(jié)點都按順序執(zhí)行相同的操作序列男韧,日志復制(Log Replication)就是為了保證執(zhí)行相同的操作序列所做的工作朴摊;在Raft中當接收到客戶端的日志(事務(wù)請求)后先把該日志追加到本地的Log中,然后通過heartbeat把該Entry同步給其他Follower此虑,F(xiàn)ollower接收到日志后記錄日志然后向Leader發(fā)送ACK甚纲,當Leader收到大多數(shù)(n/2+1)Follower的ACK信息后將該日志設(shè)置為已提交并追加到本地磁盤中,通知客戶端并在下個heartbeat中Leader將通知所有的Follower將該日志存儲在自己的本地磁盤中寡壮。

log
log

上圖中贩疙,當leader選出來之后,follower的logs場景很可能出現(xiàn)在上圖中况既。follower有可能丟失entries这溅、有未提交的entries、有額外的entries等等場景棒仍。Raft中悲靴,leader通過強制followers復制自己的logs來處理不一致。這意味著莫其,在follower中l(wèi)ogs沖突的entries將會被leader logs中的覆寫癞尚。

2.4 Safety

安全性是用于保證每個節(jié)點都執(zhí)行相同序列的安全機制,如當某個Follower在當前Leader commit Log時變得不可用了乱陡,稍后可能該Follower又會倍選舉為Leader浇揩,這時新Leader可能會用新的Log覆蓋先前已committed的Log,這就是導致節(jié)點執(zhí)行不同序列憨颠;Safety就是用于保證選舉出來的Leader一定包含先前 commited Log的機制胳徽;

  • Election Safety
    每個Term只能選舉出一個Leader积锅,假設(shè)某個Term同時選舉產(chǎn)生兩個LeaderA和LeaderB,根據(jù)選舉過程定義养盗,A和B必須同時獲得超過半數(shù)節(jié)點的投票缚陷,至少存在節(jié)點N同時給予A和B投票,因此矛盾往核。
  • Leader Completeness
    這里所說的完整性是指Leader日志的完整性箫爷,當Log在Term1被Commit后,那么以后Term2聂儒、Term3…等的Leader必須包含該Log虎锚;Raft在選舉階段就使用Term的判斷用于保證完整性:當請求投票的該Candidate的Term較大或Term相同Index更大則投票,否則拒絕該請求薄货;
  • Leader Append-Only
    Leader從不“重寫”或者“刪除”本地Log翁都,僅僅“追加”本地Log碍论。Raft算法中Leader權(quán)威至高無上谅猾,當Follower和Leader產(chǎn)生分歧的時候,永遠是Leader去覆蓋修正Follower鳍悠。
  • Log Matching
    如果兩個節(jié)點上的日志項擁有相同的Index和Term税娜,那么這兩個節(jié)點[0, Index]范圍內(nèi)的Log完全一致。
  • State Machine Safety
    一旦某個server將某個日志項應(yīng)用于本地狀態(tài)機藏研,以后所有server對于該偏移都將應(yīng)用相同日志項敬矩。

3. 總結(jié)

本文主要講解了Raft算法的基本概念,以及算法中涉及到的leader選舉蠢挡,日志同步弧岳,安全性。Raft是以易理解性作為其設(shè)計的一個目標业踏,對于一個學習的新手來說禽炬,確實比Paxos易于理解很多。雖然 Raft 的論文比 Paxos 簡單版論文容易讀勤家,論文依然有很多地方需要深刻體會與理解腹尖,筆者也還是搞了好幾天。


參考

  1. Raft Animate Demo
  2. Raft Paper
  3. Raft Website
  4. Raft 為什么是更易理解的分布式一致性算法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伐脖,一起剝皮案震驚了整個濱河市热幔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讼庇,老刑警劉巖绎巨,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蠕啄,居然都是意外死亡场勤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却嗡,“玉大人舶沛,你說我怎么就攤上這事〈凹郏” “怎么了如庭?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撼港。 經(jīng)常有香客問我坪它,道長,這世上最難降的妖魔是什么帝牡? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任往毡,我火速辦了婚禮,結(jié)果婚禮上靶溜,老公的妹妹穿的比我還像新娘开瞭。我一直安慰自己,他們只是感情好罩息,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布嗤详。 她就那樣靜靜地躺著,像睡著了一般瓷炮。 火紅的嫁衣襯著肌膚如雪葱色。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天娘香,我揣著相機與錄音苍狰,去河邊找鬼。 笑死烘绽,一個胖子當著我的面吹牛淋昭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诀姚,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼响牛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赫段?” 一聲冷哼從身側(cè)響起呀打,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糯笙,沒想到半個月后贬丛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡给涕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年豺憔,在試婚紗的時候發(fā)現(xiàn)自己被綠了额获。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡恭应,死狀恐怖抄邀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昼榛,我是刑警寧澤境肾,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站胆屿,受9級特大地震影響奥喻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜非迹,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一环鲤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憎兽,春花似錦冷离、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桦锄。三九已至扎附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間结耀,已是汗流浹背留夜。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留图甜,地道東北人碍粥。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像黑毅,于是被迫代替她去往敵國和親嚼摩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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