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

2022-01-30 12:43:37 字數 2824 閱讀 5657

raft演算法中伺服器主要分為三種角色:leaderfollowercandidate,並且三種角色相互獨立,也就是伺服器在同一時間內只可能扮演其中一種角色。

leader:用於對所有使用者的請求進行處理以及日誌的複製等等。

follower:不會主動傳送訊息,只響應來自leadercandidate的請求。

candidate:用於選舉新的leader。

raft 演算法將時間劃分成為任意不同長度的任期(term)。任期用連續的數字進行表示。每乙個任期的開始都是一次選舉(election),乙個或多個候選人會試圖成為領導人。如果乙個候選人贏得了選舉,它就會在該任期的剩餘時間擔任領導人。在某些情況下,選票會被瓜分,有可能沒有選出領導人,那麼,將會開始另乙個任期,並且立刻開始下一次選舉。raft 演算法保證在給定的乙個任期最多只有乙個領導人。

網路狀態分為兩種情況:選舉階段,正常執行階段。備註:網路狀態還可能會有成員變化階段,暫時先不考慮。

每乙個任期都是以選舉階段開始。但不一定以正常執行階段結束。在某些情況下乙個完整的任期可能全部為選舉階段。如下圖:

在網路初始化時,網路中所有的伺服器都以follower的角色啟動。由於follower只被動接收訊息,所以全網中所有伺服器都處於等待狀態。同時每乙個伺服器都在本地維護乙個計時器。計時器的作用很簡單,就是判斷當前階段(選舉階段或正常執行階段)是否超時,而當計時器超時後,任期將會加1。

總之,在網路啟動後所有伺服器等待指定長度的一段時間之後,計時器將會超時。這時候計時器超時的伺服器將轉換自己的角色為candidate,從而進入選舉階段。進入選舉階段的candidate將會做以下幾件事:

(1)將自己的任期號加1。

(2)為自己投一票用以選舉出新的leader。

(3)將本地的計時器重置。

(4)傳送投票請求到網路中的其他所有的伺服器。

(5)等待下一次的計時器超時。

同時,投票選舉leader具有以下幾點要求:

(1)每個伺服器在乙個任期內只能投一票,並且只能投先到者(即投票給自己收到的第乙個請求)。如果沒有先到者,只能投票選自己了。

(2)請求投票的訊息中需要帶有請求者所處的當前任期號。

(3)投票者只會投票給任期號大於等於自己當前任期號的伺服器。

在選舉狀態會出現三種結果:

(1)自己成功當選leader

(2)網路中其他伺服器當選leader

(3)網路中沒有伺服器當選leader

當網路中某乙個candidate接收到網路中大多數成員的投票後,即可將自己的身份轉換為leader。在當選leader後,該伺服器將周期性地傳送心跳資訊(心跳資訊包含成功當選leader的伺服器的當前任期號)到網路中其他伺服器。在網路中其他的伺服器收到心跳資訊後檢查心跳訊息中的任期號是否大於等於自己的任期號。如果滿足該條件的話candidate將會轉換為follower狀態,並重置計時器。而如果任期號小於自己的任期號,伺服器將拒絕該心跳訊息並繼續處於candidate狀態。

第三種情況為網路中沒有伺服器成功當選leader。這種情況在有很多follower同時成為candidate時會發生。因為當角色轉換為candidate後將會將選票投給自己,從而導致選票被分散開來,沒有candidate可以得到網路中大部分節點的選票,從而沒有節點可以成為leader。這種情況下計時器將再次超時,網路狀態將從選舉階段進入下乙個選舉階段,同時candidate將會再次執行上面說明的幾件事。

raft演算法採用了隨機選舉超時機制來避免出現這種情況。即當計時器超時後,伺服器將隨機延遲指定的時間後才進入選舉階段。

由於隨機延遲的原因,將降低伺服器在同一時間選舉超時的情況,可以有效避免選票分散的情況。

leader成功選舉之後,將週期性傳送心跳訊息到網路中其他伺服器。同時其他伺服器將轉換自己的角色為follower,並且每次收到心跳訊息後都會重置自己的計時器,防止超時再次進入選舉階段。

如果leader因為特殊情況崩潰時,網路中的其他伺服器將不再接收到心跳訊息,在等待指定時間後計時器將會超時,從而再次進入選舉階段。

如果leader崩潰時間較短,可以在其他伺服器計時器超時之間恢復,並傳送心跳訊息,網路仍然可以恢復為leader崩潰之前的狀態。

如果leader崩潰時間較長,在網路中已有新的leader選舉產生後恢復,由於舊的leader任期號將小於新的leader,在舊的leader接收到新的leader傳送的心跳訊息後則會變為follower狀態。

Raft演算法系列教程3 日誌複製

客戶端的每乙個請求都包含被複製狀態機執行的指令。leader把這個指令作為一條新的日誌條目新增到日誌中,然後並行發起 rpc 給其他的伺服器,讓它們複製這條資訊。假如這條日誌被安全的複製,leader就應用這條日誌到自己的狀態機中,並返回給客戶端。如果follower宕機或者執行緩慢或者丟包,lea...

演算法系列教程01 開篇

為什麼要學習演算法呢?我個人覺得最終目的還是為了提高自己的職場競爭力。演算法的本質就是解決問題,所以學習演算法本質上是在提高解決問題的能力,這是職場最重要的能力之一。另外,如果你想在面試中表現得更加出色,也要對演算法有一定程度的掌握。寫教程是很耗費精力的,而且學習演算法是很枯燥的,但如果大家都能參與...

演算法系列 排序演算法(1)氣泡排序

排序 在資料處理中經常都會看到,它作為資料結構和演算法中的重要組成部分,還是需要我們系統地進行學習。對於排序的認知,我一直都處於就是對資料進行由大到小或者由小到大的排序,但具體是怎樣進行的,卻一直都沒辦法描述清楚,希望通過這次深入的學習,可以掌握更多關於排序的認知。1.程式設計師內功 八大排序演算法...