Raft協議介紹(翻譯)

2021-09-29 19:38:59 字數 3098 閱讀 7214

本文討論的的raft一致性演算法來自於**in search of an understandable consensus algorithm.所有的引用都出自這篇文章.

raft 是乙個分布式一致性演算法,它的設計很容易被理解。raft演算法解決了即使在出現故障時,多個伺服器同意同乙個共享狀態的問題。共享狀態通常是由複製日誌資料結構來保證的。只要大多數伺服器是有效的,系統就是有效和可執行的。

raft通過在集群中選舉leader來工作和執行。leader負責接受客戶端的請求和管理發往集群其他伺服器的複製日誌。資料流只有乙個方向:從leader到其它伺服器。

raft分解一致性問題為三個子問題:

以上是raft五個比較重要的概念

每個集群中的節點都在此三種狀態之一:leader,follower,candidate。

節點狀態的改變如下:

在通常的狀態下,集群只有乙個節點是leader,其餘節點都是follower。follower是被動的:它們不會主動發起請求,但是會回應來自leader和candidate節點的請求。leader會處理所有來自客戶端的請求(如果乙個請求傳送到了follower,那麼那個follower會重定向到leader)。第三種狀態,candidate,只是用於選舉乙個新的leader。

raft將時間劃分為任意長度的任期(term),每個長度以選舉開始。如果某個candidate贏得了選舉,那麼它會是此term的leader直到此term結束。如果投票出現分歧,那麼此term會以無leader結束。

任期的期數單調增加。每個節點都會儲存當前的任期期數並且在每次交流中都會交換。

如果某個節點的當前任期小於其它節點,那麼它會更新它的任期到最大值。如果某個candidate或者leader發現它自己的任期過期了,它們會立刻還原成follower狀態。如果某個節點收到錯誤的任期數,它會拒絕此次請求。

raft使用兩個rpc來執行基本操作:

leader週期的傳送心跳包給follower維持它的權威(譯者注:就是讓別的節點認可它是leader的意思)。leader選舉會在follower等候來自leader的心跳包超時過後被處罰。此時follower會變成candidate狀態並且增加它的任期期數。在它收到投票後,它也會與其它節點並行的發出投票。因此會有三種結果產生:

raft使用隨機的選舉超時時間(election timeout)來確保投票分歧是少數的,並且分歧的情況也是可以很快被解決的。為了預防第一次投票(譯者注:服務啟動)出現分歧,election timeout會從固定間隔時間(例如150-300ms)中隨機選擇。因此在大多數情況只有乙個節點會election timeout(目的就是盡量在乙個時刻只有乙個節點會變成candidate)。這樣此candidate節點就會在其它節點election timeout之前贏得選舉並傳送心跳包給其它節點。同樣的機制也用於處理投票分歧。每個candidate會在選舉開始時重新獲得隨機的election timeout,並且在開始下一輪的選舉之前等待此超時時間。這樣就在新的選舉時減少了另一種投票分歧的可能行。

客戶機請求現在被假定為只寫。每個請求都包含被所有節點的複製狀態機執行的命令。當leader接受到來自客戶端的請求,它將會增加請求到log作為新的entry。每個包含在log中的entry有以下資訊:

leader建立的entry複製給了大多數伺服器時,此次請求被認為是提交了。所有之前的entry,包括早期leader建立的也會被認為是提交了。leader一旦執行了提交,馬上會返回結果給客戶端(譯者注:此時並不一定是所有節點都處理了leader請求)。

raft維護以下屬性,這些屬性構成了匹配屬性的log:

但是在遇到leader崩潰時,leader和follower的日誌可能會不一致。

在raft中,leader通過強制follower複製自己的日誌來處理不一致問題。這意味著follower日誌中衝突的entry將會被來自leader的日誌覆蓋。

leader會嘗試找到最近的與follower日誌匹配的索引,並且將會刪除額外的日誌和增加新日誌(譯者注:來自leader同步的日誌)。

leader將會維護nextindex,這個索引是下乙個傳送給其它follower的log entry的索引。當乙個leader得到權利後,它會將它最近的index的下乙個index初始化nextindex值。

鑑於這個機制,leader不需要採取特殊的操作來讓follower保持一致性。leader只需要正常的操作,log會在一致性檢測失敗失敗後自動的匯集(譯者注:以上機制就能保證資料自動同步,不需要額外的特殊操作)。leader不會覆蓋或刪除它自己的日誌。

raft會確保leader在任期內會提前所有之前任期的log。這是為了確保所有日誌一致,並且狀態機執行相同的命令集所必需的。

在選舉期間,requestvote rpc會包含candidate的日誌資訊。如果follower發現它自己的log比candidate的日誌要新,那麼follower不會投票給這個candidate。

raft通過比較日誌中最後乙個log的索引和任期來確定兩個log中哪個log更為最新。如果log的最後乙個具有不同的term,則具有後面term的log更為最新。如果log以相同的term結束,則以較長的log為準

為了確保在配置變更時的安全,不應該出現相同任期選舉出了兩個leader。不幸的是,任何從舊配置直接切換到新配置都是不安全的。

raft使用兩階段方法來改變集群成員。首先,先切換到乙個稱為聯合共識的中間配置。然後一旦提交,它立刻切換到新的配置。

聯合共識允許各個伺服器在不同的時間在不同的配置之間進行轉換,而不會影響安全性。此外,聯合一致性允許集群在整個配置更改期間繼續為客戶機請求提供服務。

聯合共識連線了如下的新舊配置:

現在,leader可以安全地建立乙個描述c的日誌條目並將其複製到集群。同樣,此配置將在每台伺服器上看到時立即生效。當根據c的規則提交新配置時,舊配置不相關,並且可以關閉不在新配置中的伺服器。

乙個很棒的raft協議視覺化演示在這裡。

我只研究了組成raft的基本演算法和它提供的安全保證的細節。這篇**包含了更多的細節,它是非常容易理解的,因為作者的主要目標是理解。我絕對建議你讀它,即使你以前從未讀過其他的**。

raft協議問題

角色 raft通過選舉leader並由leader節點負責管理日誌複製來實現多副本的一致性。在raft中,節點有三種角色 角色轉換如下圖所示 節點的狀態時通過心跳包來進行維持的。產生的原因 如果乙個follower在election timeout的時間裡沒有收到leader的資訊,就進入新的ter...

ETCD 原始碼學習 Raft 協議介紹(二)

raft協議是分布式一致性協議的一種,所以在了解raft協議之前,我們首先要知道一致性協議的作用。1.一致性協議用於解決分布式環境下多副本之間資料一致性的問題的。2.主要包括兩個部分,一是 leader 選舉,二是日誌同步。3.一致性協議主要包括paxos zab raft及 gossip 等 le...

raft協議學習記錄

在b階段,s1下線,s5上線並被選為leader,同時寫入term3 index2,此時s1和s2中的entry仍然是term2 index2。此時在多個例項中已經存在不同的entry,根據raft的定義,將來一定會有例項的entry被另乙個 成為leader 例項的entry所覆蓋。因此需要一條額...