30分鐘帶你理解 Raft 算法

為什么需要 Raft季稳?

  • 要提高系統(tǒng)的容錯(cuò)率,需要分布式系統(tǒng)
  • 分布式系統(tǒng)有多個(gè)實(shí)例,對(duì)于給定的一組操作狰住,需要協(xié)議讓所有實(shí)例達(dá)成一致(分布式一致性)
  • Paxos 是分布式一致性協(xié)議的標(biāo)準(zhǔn),但難以理解齿梁、實(shí)現(xiàn)
  • Raft 提供了和 Paxos 算法相同的功能催植,但更好理解、構(gòu)建實(shí)際的系統(tǒng)

Raft 是什么勺择?

  • Replicated And Fault Tolerant创南,復(fù)制和容錯(cuò)
  • 管理復(fù)制日志的一致性算法

Raft 的目標(biāo)

  • 簡單易理解
  • 提供完整的實(shí)現(xiàn)系統(tǒng),減少開發(fā)者的工作量
  • 保證所有條件下都是安全的省核,在大部分情況下是可用的
  • 常用操作是高效的

前置條件:復(fù)制狀態(tài)機(jī)

  • Raft 相當(dāng)于復(fù)制狀態(tài)機(jī)中的“一致性模塊
  • 一致性模塊(Consensus Module):管理來自客戶端的指令稿辙,接入 log
  • 日志(Log)
  • 狀態(tài)機(jī)(State Machine):執(zhí)行日志的指令,得到 Server 狀態(tài)

Raft 基礎(chǔ)

  • 節(jié)點(diǎn)狀態(tài):
    • Leader(領(lǐng)導(dǎo)者):系統(tǒng)只有一個(gè)節(jié)點(diǎn)處是 Leader气忠,處理所有客戶端的請(qǐng)求并同步給 Follower
    • Follower(跟隨者):只響應(yīng)其他服務(wù)器(Leader邻储、Candidate)的請(qǐng)求
    • Candidate(候選者):在選舉領(lǐng)導(dǎo)的時(shí)候出現(xiàn)
  • term(任期):
    • 一段選舉的任期(選舉開始+正常工作)
    • term 號(hào)自動(dòng) +1
    • 如果選票均分,則該 term 直接結(jié)束旧噪,進(jìn)入下一個(gè) term
    • Raft 中的「邏輯時(shí)鐘」吨娜,可發(fā)現(xiàn)過期信息,規(guī)則:
      • 每個(gè)節(jié)點(diǎn)會(huì)存儲(chǔ)當(dāng)前 term 號(hào)淘钟,term 編號(hào)單調(diào)遞增
      • 節(jié)點(diǎn)間通信宦赠,交換 term 號(hào)
      • (1)節(jié)點(diǎn)當(dāng)前 term 號(hào) < 他人 term 號(hào),更新 term 號(hào)
      • (2)節(jié)點(diǎn)當(dāng)前 term 號(hào) > 他人 term 號(hào)米母,拒絕請(qǐng)求
      • (3)Candidate勾扭、Leader 發(fā)現(xiàn)自己的 term < 他人 term,立即變成 Follower
  • 節(jié)點(diǎn)通信:使用 RPC
    • 請(qǐng)求投票(RequestVote) RPCs:選舉階段铁瞒,Candidate 節(jié)點(diǎn)發(fā)送給他人
    • 附加條目(AppendEntries)RPCs:非選舉階段妙色,Leader 發(fā)給所有節(jié)點(diǎn),復(fù)制日志+心跳
  • 特性(Raft 保證在任何時(shí)候都成立)
    • 選舉安全:對(duì)一個(gè)給定的 term 號(hào)精拟,最多選舉出一個(gè) Leader
    • Leader 只附加原則:Leader 不會(huì)刪除燎斩、覆蓋自己的日志虱歪,只會(huì)增加
    • 日志匹配:若兩個(gè)日志在相同索引位置的日志的 term 號(hào)相同,則日志從頭到該索引位置全部相同
    • Leader 完整特性:選舉出的 Leader栅表,會(huì)包含所有已提交的日志
    • 狀態(tài)機(jī)安全特性:Leader 已經(jīng)將給定的索引值位置的日志條目應(yīng)用到狀態(tài)機(jī)笋鄙,其他任何服務(wù)器都已執(zhí)行

Leader 選舉(選舉安全特性)

  • Raft 使用心跳機(jī)制觸發(fā) Leader 選舉
    • 集群存在 Leader,Leader 節(jié)點(diǎn)周期性發(fā)心跳包
    • 一個(gè) Follower 沒有收到任何消息(固定區(qū)間隨機(jī)的時(shí)間)怪瓶,發(fā)起選舉
  • 集群啟動(dòng)時(shí)萧落,所有節(jié)點(diǎn)都處于 Follower 狀態(tài)
  • 節(jié)點(diǎn)到達(dá)超時(shí)時(shí)間后,會(huì)進(jìn)入 Candidate 狀態(tài)洗贰,增加自己的 term 號(hào)找岖,發(fā)送請(qǐng)求投票給自己
  • Candidate 狀態(tài)機(jī)
    • 節(jié)點(diǎn)得票最多的,變成 Leader
    • 收到來自其他節(jié)點(diǎn)的“聲明自己是 Leader”的請(qǐng)求
    • 一段時(shí)間后敛滋,沒有獲得多數(shù)票许布,也沒有收到其他節(jié)點(diǎn)的 Leader 通知(平分選票)
  • 避免選舉的平分選票:隨機(jī)選舉超時(shí)時(shí)間
    • 每個(gè)節(jié)點(diǎn)隨機(jī)選擇選舉超時(shí)時(shí)間,到達(dá)時(shí)間后成為 Candidate
    • 大多數(shù)情況下绎晃,只有一個(gè)節(jié)點(diǎn)率先進(jìn)入 Candidate

日志復(fù)制(Leader只附加蜜唾、日志匹配)

  • Leader 會(huì)接收客戶端的請(qǐng)求,請(qǐng)求指令作為一個(gè)“日志條目”添加到日志中
  • 向所有 Follower 發(fā)送附加條目 RPC庶艾,讓他們復(fù)制這個(gè)日志條目
  • 得到大多數(shù)節(jié)點(diǎn)回復(fù)后袁余,Leader 會(huì)把日志寫入復(fù)制狀態(tài)機(jī),持久化咱揍,把執(zhí)行結(jié)果返回給客戶端
  • 日志非安全的颖榜;進(jìn)入狀態(tài)機(jī)中是安全的(已提交),最終會(huì)被所有可用的狀態(tài)機(jī)執(zhí)行煤裙。

index = 7 的日志已經(jīng)被大多數(shù)節(jié)點(diǎn)復(fù)制掩完,狀態(tài)為已提交。

安全

  • 選舉限制(Leader 完整性):每次選舉出來的 Leader积暖,必須包含所有已提交的日志
    • 只有已經(jīng)被大部分節(jié)點(diǎn)復(fù)制的日志藤为,才會(huì)變成“已提交”
    • 一個(gè) Candidate 必須得到大部分節(jié)點(diǎn)投票,才能變成 Leader
    • 投票時(shí)夺刑,節(jié)點(diǎn)不會(huì)把票投給沒有自己的日志新的 Candidate
  • Follower 或 Candidate 崩潰:無限重試
  • 超時(shí)和可用性:broadcastTime(廣播時(shí)間)<< electionTimeout(選舉超時(shí)時(shí)間)<< MTBF(平均故障間隔時(shí)間)

學(xué)習(xí)資料

使用 Raft 的應(yīng)用?

  • 服務(wù)發(fā)現(xiàn)框架:consul分别、etcd
  • 日志:RocketMQ
  • 數(shù)據(jù)存儲(chǔ):Tidb遍愿、k8s

擴(kuò)展:ZooKeeper ZAB 協(xié)議

  • 支持崩潰恢復(fù)的原子廣播協(xié)議:ZooKeeper Atomic Broadcast protocol
  • ZooKeeper 適合讀多寫少的場景,客戶端隨機(jī)連到 ZK 集群的一個(gè)節(jié)點(diǎn)
    • 從當(dāng)前節(jié)點(diǎn)讀
    • 寫入到 leader耘斩,leader 廣播事務(wù)沼填,半數(shù)節(jié)點(diǎn)成功才會(huì)被提交
  • 整體流程類似于 Raft,只是細(xì)節(jié)和實(shí)現(xiàn)的區(qū)別

擴(kuò)展:ZooKeeper 是什么括授?

官方定義: A Distributed Coordination Service for Distributed Applications坞笙。本質(zhì):基于內(nèi)存的 KV 系統(tǒng)岩饼,以 path 為 key

代碼薛夜、思維導(dǎo)圖筆記下載

代碼和思維導(dǎo)圖在 GitHub 項(xiàng)目中籍茧,歡迎大家 star!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梯澜,一起剝皮案震驚了整個(gè)濱河市寞冯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晚伙,老刑警劉巖吮龄,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咆疗,居然都是意外死亡漓帚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門午磁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰默,“玉大人,你說我怎么就攤上這事漓踢∏J穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵喧半,是天一觀的道長奴迅。 經(jīng)常有香客問我,道長挺据,這世上最難降的妖魔是什么取具? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮扁耐,結(jié)果婚禮上暇检,老公的妹妹穿的比我還像新娘。我一直安慰自己婉称,他們只是感情好块仆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著王暗,像睡著了一般悔据。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俗壹,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天科汗,我揣著相機(jī)與錄音,去河邊找鬼绷雏。 笑死头滔,一個(gè)胖子當(dāng)著我的面吹牛怖亭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坤检,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兴猩,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了缀蹄?” 一聲冷哼從身側(cè)響起峭跳,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缺前,沒想到半個(gè)月后蛀醉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衅码,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拯刁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逝段。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垛玻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶躯,到底是詐尸還是另有隱情帚桩,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布嘹黔,位于F島的核電站账嚎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏儡蔓。R本人自食惡果不足惜郭蕉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂江。 院中可真熱鬧召锈,春花似錦、人聲如沸获询。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐付。三九已至卵惦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓦戚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工丛塌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留较解,地道東北人畜疾。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像印衔,于是被迫代替她去往敵國和親啡捶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 分布式一致性 想象一下奸焙,我們有一個(gè)單節(jié)點(diǎn)系統(tǒng)瞎暑,且作為數(shù)據(jù)庫服務(wù)器,然后存儲(chǔ)了一個(gè)值(假設(shè)為X)与帆。然后了赌,有一個(gè)客戶端...
    阿飛的博客閱讀 2,551評(píng)論 1 14
  • 簡介 Raft 是一種通過日志復(fù)制來實(shí)現(xiàn)的一致性算法,提供了和Paxos 算法相同的功能和性能Raft 將一致性問...
    linking12閱讀 3,095評(píng)論 0 3
  • 原文地址 摘要 Raft是一個(gè)一致性算法玄糟,它用于管理相同的日志副本(replicated log)勿她。它可以產(chǎn)生一個(gè)...
    wangjie_yy閱讀 521評(píng)論 0 0
  • 簡介 關(guān)于Raft算法,有兩篇經(jīng)典的論文阵翎,一篇是《In search of an Understandable C...
    AnyL8023閱讀 1,739評(píng)論 0 1
  • 久違的晴天逢并,家長會(huì)。 家長大會(huì)開好到教室時(shí)郭卫,離放學(xué)已經(jīng)沒多少時(shí)間了砍聊。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22