4.3 Raft演算法
由於Paxos太難懂、太難以實現,Raft演算法應運而生。其目的是在可靠性不輸於Paxos的情況下,儘可能簡單易 懂。史丹佛大學的Diego Ongaro和John Ousterhout以易理解為目標,重新設計了一個分散式一致性演算法Raft,並於2013年底公開發布。Raft既明確定義了演算法中每個環節的細節, 也考慮到了整個演算法的簡單性與完整性。與Paxos相比,Raft更適合用來學習以及做工程實現。下面,筆者將以通俗易懂的方式來描述這個過程。
百花村村長一人負責對外事務。比如,縣和鄉兩級的公文來往,公糧徵收,工務攤派,稅收等。
Raft是一個強Leader的共識協議。我們想象百花村是一個伺服器叢集,而這個叢集的Leader就是村長, 村裡的每戶人家(follower)對應一個伺服器,每戶人家都儲存了一個資料副本。所有的資料副本都必須保證一致性。即上級官員下到村裡視察時,從每戶 人家獲得的資訊應該是一樣的。
百花村村長通過村戶選舉產生。誰得的票數多(簡單多數)誰就當選村長。村長有任期概念(term)。任期是一直向上增長的:1,2,3,…,n,n+1,…。
這裡要處理的是平票(split vote)的情況。在平票的情況下,該村村長選舉失敗,每戶人家被分配不同的睡眠值。在睡眠期間的村戶不能發起選舉,但是可以投票。而且只有選舉權,但是 沒有被選舉權。第一個走出睡眠期的村戶發起新任期的選舉。由於每戶人家有不同長度的睡眠期,這保證了選舉一定會選出一個村長,而不會僵持不下,不會出現每 次選舉都平票的情況。一旦村長產生,任何針對百花村的“寫”(比如政府政策宣示,普法教育)必須經過村長。
村長每天都要在村裡轉一圈,讓所有人都看見。表明村長身體健康,足以處理公務。
村長選舉出來後,要防止村長髮生“故障”,必須定期檢測村長是否失效。一旦發現村長髮生“故障”,就要重新選舉。
村長接收到上級命令,該命令資料處於未提交狀態(uncommitted),接著村長會併發向所有村戶傳送命令, 複製資料並等待接收響應,確保至少超過半數村戶接收到資料後再向上級確認資料已接收(命令已執行)。一旦向上級發出資料接收Ack響應後,表明此時資料狀 態進入“已提交”(committed),村長再向村戶發通知告知該資料狀態已提交(即命令已執行)。
下面我們來測試各種異常情況。
(1)異常情況1
上級命令到達前,村長掛了。這個很簡單,重新選舉村長。上級命令以及來自外面的請求會自動過時失效,他們會重發命令和請求。
(2)異常情況2
村長接到上級命令,還沒有來得及傳達到各村戶就掛了。這個和異常情況1類似,重新選舉村長。上級命令以及來自外面的請求會自動過時失效。他們會重發命令和請求。
(3)異常情況3
村長接到上級命令,已傳達到各村戶,但是各村戶尚未執行命令,村長就掛了。這種異常情況下,重新選舉村長。新村長選出後,由於已收到命令,就可以等待各村戶執行命令(也就是Commit資料)。上級命令以及來自外面的請求會自動過時失效。有可能,他們會重發命令和請求。Raft要求外部的請求可以自動去除重複。
(4)異常情況4
村長接到上級命令,已傳達到各村戶,各村戶執行了命令,但是村長並沒有收到通知,就在這時候村長掛了。這種情況類似上一種情況,新村長選出後,即可等待通知,完成剩下的任務。外部也會接到通知命令(已完成)。
(5)異常情況5
在命令執行過程中,村長身體不適,不能處理公務。因為百花村沒有收到村長的“心跳”,百花村的村戶就會自動選舉(當前任期+1)任村長。這個時候就出現2個村長。這個時候新村長就會接過老村長角色,繼續執行命令。即使原村長身體康復,也將成為普通村戶。
來源:我是碼農,轉載請保留出處和連結!
本文連結:http://www.54manong.com/?id=96
相關文章
- 10分鐘弄懂Raft演算法Raft演算法
- Raft共識演算法詳解Raft演算法
- 分散式協議與演算法-Raft演算法分散式協議演算法Raft
- 分散式系統的Raft演算法分散式Raft演算法
- 深入剖析共識性演算法 Raft演算法Raft
- 怎樣用Nacos實現Raft演算法Raft演算法
- Raft 演算法之叢集成員變更Raft演算法
- 4.3
- tikv/raft-rs:在 Rust 中實現的 Raft 分散式共識演算法原始碼RaftRust分散式演算法原始碼
- 分散式系統之Raft共識演算法分散式Raft演算法
- raft演算法一致性的研究Raft演算法
- 看動畫輕鬆學會 Raft 演算法動畫Raft演算法
- Raft演算法系列教程1:Leader選舉Raft演算法
- Raft演算法系列教程3:日誌複製Raft演算法
- 理解分散式一致性與Raft演算法分散式Raft演算法
- 淺談分散式一致性演算法raft分散式演算法Raft
- 共識演算法之爭(PBFT,Raft,PoW,PoS,DPoS,Ripple)演算法Raft
- Paxos、Raft不是一致性演算法/協議?Raft演算法協議
- 4.3 Hadoop概念Hadoop
- SEA-RAFT: Simple, Efficient, Accurate RAFT for Optical FlowRaft
- 區塊鏈共識演算法(1)分散式一致性演算法Raft區塊鏈演算法分散式Raft
- 談談RaftRaft
- raft協議Raft協議
- 螞蟻金服開源 SOFAJRaft:生產級 Java Raft 演算法庫RaftJava演算法
- zarusz/SlimCluster:在.NET中實現的Raft分散式共識演算法Raft分散式演算法
- etcd學習(5)-etcd的Raft一致性演算法原理Raft演算法
- Fabric2.x中Raft共識演算法核心資料結構Raft演算法資料結構
- 一文徹底搞懂Raft演算法,看這篇就夠了!!!Raft演算法
- Raft演算法系列教程2:狀態機複製 (State Machine Replication)Raft演算法Mac
- 學習筆記(4.3)筆記
- GO語言————4.3常量Go
- 4.3學習進度
- 4.3 建立一個 CDB
- 【SpringMVC】 4.3 攔截器SpringMVC
- raft協議詳解Raft協議
- Raft協議精解Raft協議
- 實現 Raft 協議Raft協議
- raft協議初識Raft協議