分布式儲存系統通常通過維護多個副本來進行容錯,提高系統的可用性。這就必須要解決分布式儲存系統的最核心問題:維護多個副本的一致性。
一致性(consensus),是構建具有容錯性(fault-tolerant)的分布式系統的基礎。在乙個具有一致性性質的的集群裡,同一時刻所有節點中的資料有相同的值。集群具有自動恢復的性質,當少數節點失效時,不會影響整個集群對外提供服務;但當超過一半節點失效時,整個集群不可用(但不會返回錯誤的結果)。
一致性協議就是用來幹這事的,及用來保證在小部分副本宕機時,系統仍在可正常對外提供服務。
一致性協議基於replicated state machines,即所有節點都從乙個state出發,都經過同樣的一些操作序列(log),最後達到同樣的state。
系統中每個節點有三個元件:
1、狀態機:當我們說一致性時,就是在說要保證這個狀態機的一致性。狀態機 會從log裡面取出所有的命令,然後執行一遍,得到的結果就是我們對外提供的保證了一致性的資料。
2、log:儲存了所有的修改記錄
3、一致性模組:一致性模組演算法就是用來保證寫入的log的命令的一致性,這也是raft演算法的核心內容。
raft是一種更容易理解的一致性演算法,意在取代paxos演算法。目前,各種主流語言中都有一些開源實現,如基於jgroup的raft協議實現。
動畫版raft的原理:
在raft中,每個節點會處於下面三種狀態中的一種:
成為candidate的節點發起新的選舉期(election term)去「拉選票」:
如果不巧,兩個follower同時成為candidate都去「拉票」怎麼辦?這時會發生split vote情況。兩個節點可能都拉到了同樣多的選票,勝負難分,選舉失敗,本term沒有leader。之後又有計時器超時的follower會成為candidate,將開始新一輪的投票。
raft能夠正確地處理網路分割槽(「腦裂」)問題。假設a~e五個節點,b是leader。如果發生「腦裂」,a、b成為乙個子分割槽,c、d、e成為乙個子分割槽。此時c、d、e會發生選舉,選出c作為新的term的leader,這樣在兩個子分割槽就有了不同term的兩個leader。這時如果有客戶端寫a時,因為b無法複製日誌到大部分follower,所以日誌處於uncommited未提交狀態。而同時另乙個客戶端對c的寫操作卻能正確完成,因為c是新leader,它只知道d和e。
當網路通訊恢復,b能夠傳送心跳給c、d、e了,卻發現「改朝換代」了,因為c的term值更啊,所以b自動降為follower。然後a和b都回滾未提交的日誌,並從新的leader那裡複製最新的日誌。
raft協議學習記錄
在b階段,s1下線,s5上線並被選為leader,同時寫入term3 index2,此時s1和s2中的entry仍然是term2 index2。此時在多個例項中已經存在不同的entry,根據raft的定義,將來一定會有例項的entry被另乙個 成為leader 例項的entry所覆蓋。因此需要一條額...
raft協議問題
角色 raft通過選舉leader並由leader節點負責管理日誌複製來實現多副本的一致性。在raft中,節點有三種角色 角色轉換如下圖所示 節點的狀態時通過心跳包來進行維持的。產生的原因 如果乙個follower在election timeout的時間裡沒有收到leader的資訊,就進入新的ter...
Raft協議介紹(翻譯)
本文討論的的raft一致性演算法來自於 in search of an understandable consensus algorithm.所有的引用都出自這篇文章.raft 是乙個分布式一致性演算法,它的設計很容易被理解。raft演算法解決了即使在出現故障時,多個伺服器同意同乙個共享狀態的問題。...