Raft系列文章之一: 什麼是Raft?

簡單的說,Raft是一種易於理解的一致性算法,其功能至關於Paxos。目前不少提供一致性服務的系統都採用Paxos, 例如Chubby, ZooKeeper, 那麼爲什麼還須要Raft?自Lamport 1998年提出Paxos以來, 該協議雖逐漸成爲主流一致性協議,但也以難以理解而著名,實現起來比較困難。針對Raft難以理解的缺陷,Raft 設計的主要目的之一就是容易理解,Raft將整個算法過程分解爲若干個獨立的子過程,而且詳細描述了每一個子過程如何實現,容易理解和實現。我本身也用Java實現了Raft,  代碼在 https://github.com/chicm/CmRaft , 本系列文章的最後我將介紹個人實現。git

本文主要參考了In Search of an Understandable Consensus Algorithm (Extended Version),也包含了我本身的理解。github

那麼什麼是一致性算法?

一致性是分佈式容錯系統的基本功能,例如在分佈式共享文件系統中,一般有多臺服務器向客戶提供文件服務,當客戶經過其中一臺服務器A向文件系統存儲 了一個文件,如何保證能從服務器B獲取剛剛保存的文件?其核心問題在於多臺機器就某個值達成一致,一旦某個值達成了一致,客戶向整個集羣的任何一臺機器請 求該值時都會獲得同一個值。通常一致性算法要求系統中大多數服務器處於可用狀態,纔可能就某個值達成一致。例如5臺機器的集羣,至少須要3臺機器是可用的 纔可能就某個值達成一致,這一點經過反證法很容易理解,假設某個值經過集羣的一半或一半一下服務器能達成一致,那麼另一半服務器也可能達成另外一個一致, 若是兩個一致不一樣的話,就不是一致的。分佈式系統的容錯通常經過多副本狀態機來實現。算法

多副本狀態機

一致性算法一般產生於多副本狀態機情景中,多副本狀態機即集羣中每一個服務器維護一個狀態機,它們維護同一數據狀態的相同副本,當集羣中一個或多個節 點當掉時,整個集羣仍然可以正常運行。多副本狀態機用於解決分佈式系統中的容錯問題,例如在使用GFS, HBase的大型系統中,集羣的Leader節點管理全系統配置信息,這些信息在Master 當掉時必須可以恢復, 這些系統一般使用多副本狀態機來管理Leader選舉和配置信息存儲。Chubby和ZooKeeper都是多副本狀態機。GFS使用Chubby, 而HBase使用ZooKeeper。服務器

多副本狀態機通常採用多分佈日誌來實現,上圖是一個多副本狀態機的例子。在上圖中,服務器中存儲的日誌是命令的執行序列,狀態機依次執行這些命令, 每臺服務器的狀態機按相同順序執行相同命令,所以每臺狀態機的輸出狀態也是同樣的。這樣說有點抽象,咱們按上圖中的例子來講明一下,例若有一個用來存儲鍵 值對的多副本狀態機, 每臺服務按相同順序存儲了以下命令:分佈式

1. 設置x=3模塊化

2. 設置y=1性能

3. 設置y=9spa

在多副本狀態機每一個副本上,狀態機的狀態爲:x=3, y=9設計

一致性算法主要目標就是用來確保日誌在多個副本上的一致性,例如在上例中,若是系統中有的狀態機獲得的日誌順序是1,2,3,有的是1,3,2,則就是出現了不一致的狀況,一致性算法固然要避免出現這樣的狀況。日誌

一致性算法通常具有以下特性:

正確性:任何條件下都能保證正確性,永遠不向用戶提供一個錯誤的結果

可用性: 只要多數節點可用,並能相互通訊,系統就是可用的,5個節點的集羣,只要有任何3個節點工做正常,整個系統就能正常使用。

不依賴時鐘:即便有的節點時間設置是錯誤的,也能正常工做。

少數緩慢節點不影響全系統性能:只要大多數節點能及時響應,系統不會由於少數節點響應緩慢而性能低下。

Raft特性

Raft是專門針對Paxos難以理解的缺陷而從新設計的新算法,爲使算法容易理解,採用了模塊化設計方法,將整個過程劃分爲若干子過程,包括Leader選舉,日誌分發,確保一致性。Raft和已有的一致性算法有不少類似之處,但也有本身獨特的特性:

Strong Leader: 相對其餘一致性算法,Raft的Leader做用更強,例如,全部日誌都是經過Leader分發給其餘服務器,只有Leader接受客戶請求。這一特性簡化了日誌管理,也讓算法容易理解。

Leader選舉:Leader選舉過程採用隨機時間計時器,這一看起來小小的改進簡單有效快速地解決了Leader選舉過程當中的衝突。

成員變化:當集羣的成員發生變化,例如增長或減小服務器時,Raft採用新的聯合一致性方法來進行處理,能夠保證成員變化過程當中系統正常工做。

後面的系列文章中我會詳細描述Raft原理及全部這些特性。

Raft算法因爲其易於理解,在實現時就更容易把系統實現得更加健壯,所以是比Paxos及其餘一致性算法更爲優秀的算法。目前Raft已經有不少各類語言的實現,包括博主本身的基於Java的實現。

 

文章:http://thesecretlivesofdata.com/raft/

相關文章
相關標籤/搜索