Raft選舉演算法

2022-07-01 10:39:08 字數 1320 閱讀 8978

目標:分布式集群中,選舉leader,保持資料一致性

集群中每個節點都有三種狀態:

follower:純小弟

candidate:候選人。我原來是小弟,但我現在想當老大

leader:老大

集群狀態:

有明確的老大(穩定狀態)

沒有老大,選舉中

有老大的狀態:

follower內有倒計時(150ms~300ms)。leader定期(例如50ms)給follower發心跳訊息(廣播告訴小弟:老大還活著,所有人繼續當小弟)。小弟收到心跳後,重置倒計時器。

所有節點內,維持乙個資料結構(term2,leadera),表示當前是第2任老大,老大是a

一旦老大掛了:

此時所有小弟還在倒計時,但是收不到老大的心跳了...

直到某個小弟b自身倒計時結束,他首先意識到「老大掛了,社團不能沒有老大,我最早覺醒的,那麼就有我來開啟新時代(term+1)吧「(自身狀態為candidate)。

於是,b廣播給所有小弟(包括已經涼了的a),「大家來選舉第3任老大,老大是b」(傳送vfm(voteforme)訊息)。

其他小弟發現要來到新時代了(term3>term2),不管自身倒計時有沒有結束,紛紛擁護b作為新老大(返回ok資訊,更新自身資料結構:term3,leaderb)。

b收到多數人的投票後,就成為名副其實的新一任的老大(狀態:candidate->leader)

如果兩個小弟同時覺醒

例如b、c。設定,集群為5個節點,a、b、c、d、e,此時,a涼了,b、c同時覺醒相當老大,d、e還是小弟狀態(倒計時中)

那麼,b、c會同時向其他節點(b->acde,c->abde)傳送vfm訊息(b的vfm訊息:term3,leaderb;c的vfm訊息是term3,leaderc)。

de收到訊息後,會做如下邏輯判斷:vfm.term > this.term ? ok:不ok。(如果要開啟新時代,那麼就認新老大。不認舊時代的新老大)

例如,e先收到c的vfm訊息,判斷了一下this.term(2)之後e又收到了b的vfm訊息,判斷了一下this.term(3)

此時,集群整體會存在兩種情況:

b、c各自收到相等的投票,選舉失敗狀態,例如(b:d同意e反對;c收到:d反對e同意,a涼了)

那麼,b、c各自重新開啟乙個隨機倒計時(elaction),誰先倒計時完,誰再重新廣播vfm請求(例如,c先倒計時結束,則發起新的vote,term4,leaderc)

b、c收到不等的投票,例如(de選舉c,無人選b,a涼了)

參考:**版:

動畫版:

Raft演算法系列教程1 Leader選舉

raft演算法中伺服器主要分為三種角色 leader follower candidate,並且三種角色相互獨立,也就是伺服器在同一時間內只可能扮演其中一種角色。leader 用於對所有使用者的請求進行處理以及日誌的複製等等。follower 不會主動傳送訊息,只響應來自leader與candida...

raft演算法 Paxos和Raft共識演算法(二)

raft 譯文 在過去的 10 年中,leslie lamport 的 paxos 演算法幾乎已經成為了一致性演算法的代名詞,但是paxos 有兩個致命的缺點 第乙個是 paxos 太難以理解,第二個缺點是它難以在實際環境中實現。其中乙個原因是,對於多決策 paxos multi paxos 大家還...

Raft演算法詳解

3 log replication 4 腦裂問題 raft協議中,乙個節點任一時刻處於以下三個狀態之一 有節點啟動時都是follower狀態,在一段時間內如果沒有收到來自leader的心跳,從follower切換到candidate,發起選舉。如果收到集群中大多數的票 含自己的一票 則切換到lead...