1、伺服器的三種角色
Raft演算法中伺服器主要分為三種角色:Leader
、Follower
、Candidate
,並且三種角色相互獨立,也就是伺服器在同一時間內只可能扮演其中一種角色。
Leader
:用於對所有使用者的請求進行處理以及日誌的複製等等。Follower
:不會主動傳送訊息,只響應來自Leader
與Candidate
的請求。Candidate
:用於選舉新的Leader。
2、任期介紹
Raft 演算法將時間劃分成為任意不同長度的任期(term
)。任期用連續的數字進行表示。每一個任期的開始都是一次選舉(election
),一個或多個候選人會試圖成為領導人。如果一個候選人贏得了選舉,它就會在該任期的剩餘時間擔任領導人。在某些情況下,選票會被瓜分,有可能沒有選出領導人,那麼,將會開始另一個任期,並且立刻開始下一次選舉。Raft 演算法保證在給定的一個任期最多隻有一個領導人。
3、網路狀態
網路狀態分為兩種情況:選舉階段,正常執行階段。備註:網路狀態還可能會有成員變化階段,暫時先不考慮。
每一個任期都是以選舉階段開始。但不一定以正常執行階段結束。在某些情況下一個完整的任期可能全部為選舉階段。如下圖:
4、選舉階段->正常執行階段
在網路初始化時,網路中所有的伺服器都以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演算法採用了隨機選舉超時機制來避免出現這種情況。即當計時器超時後,伺服器將隨機延遲指定的時間後才進入選舉階段。
由於隨機延遲的原因,將降低伺服器在同一時間選舉超時的情況,可以有效避免選票分散的情況。
5、正常執行階段->選舉階段
當Leader
成功選舉之後,將週期性傳送心跳訊息到網路中其他伺服器。同時其他伺服器將轉換自己的角色為Follower
,並且每次收到心跳訊息後都會重置自己的計時器,防止超時再次進入選舉階段。
如果Leader
因為特殊情況崩潰時,網路中的其他伺服器將不再接收到心跳訊息,在等待指定時間後計時器將會超時,從而再次進入選舉階段。
如果Leader
崩潰時間較短,可以在其他伺服器計時器超時之間恢復,併傳送心跳訊息,網路仍然可以恢復為Leader
崩潰之前的狀態。
如果Leader
崩潰時間較長,在網路中已有新的Leader
選舉產生後恢復,由於舊的Leader
任期號將小於新的Leader
,在舊的Leader
接收到新的Leader
傳送的心跳訊息後則會變為Follower
狀態。
6、參考
http://www.mybatis.cn/archives/1147.html