4.3 Raft演算法

xiaohuanglv發表於2018-08-25

由於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

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

相關文章