目錄
- 三個狀態
- 什么是任期
- 節點之間的通信
1. 三個狀態
Raft 設計了 3 個狀態,用於表示節點的狀態,分別是跟隨者,候選者,領導者。
- 領導者:通常只有一個領導人,並且其他節點都是跟隨者。
- 跟隨者:跟隨者不會發送任何請求,只是簡單的響應領導者或者候選人的請求,由領導人處理所有的客戶端請求(如果客戶端請求了跟隨者,那么跟隨者會將請求轉發給領導者)
- 候選者:選舉新的領導人時使用。
3 個角色的轉換關系和流程:
可以看到,這張圖里的幾個概念:
- 初始化:所有服務器啟動時,都是跟隨者
- 超時:當初始時, 沒有收到領導人的心跳,便開始選舉。如果候選者選舉的時候,也超時了,便重新選舉。
- 大多數的選票:成為領導人的關鍵是 —— 獲取大多數服務器的選票,可以看做是鴿籠原理。
2. 什么是任期
目錄:
- 2 個階段
- 任期
- 服務器之間的通信
背景:由於機器的物理時間是不可靠的,所以需要一個邏輯時間。稱之為任期(term)。
從 2 個階段開始說起:
集群節點通常有 2 個節點:
- 選舉階段
- 領導者正常運行
例外:當選舉失敗,會進行加時賽,即連續有 2 個選舉過程。
見下圖:
圖 2 可見任期 3 選舉失敗,然后進行了重新選舉。
重新選舉會繼續失敗嗎?
答:如果不做限制,是會理解失敗的。
Raft 使用了一個限制來規避:每台服務器在選舉的時候,使用一個隨機數(150 -200),即每個服務器在不同的時間發出選舉。防止沖突。稱之為“加時賽”。
任期號
在上文中說道:由於機器的物理時間是不可靠的,所以需要一個邏輯時間。稱之為任期(term)。
有關任期的幾個特點:
- 節點有可能觀察不到任何一次選舉或者任期。
- 任期充當邏輯時鍾,服務器節點可以通過任期號查明過期的領導者或過期的信息。
- 每個節點存儲當前任期號,單調遞增。
- 服務器之間的每次通信,都會交換當前任期號,交換任期號的目的: 4.1 如果一個服務器的當前任期號比其他人小,則更新自己。 4.2 如果一個候選人或者領導人發現自己的任期號過期了,立刻將自己變成跟隨者狀態。 4.3 如果一個節點收到一個過期的任期號的請求,直接拒絕。
3. 節點之間的通信
服務器之間通過 RPC 通信,即遠程方法調用。
在 Raft 中,RPC 分成 3 種:
- 請求投票: RequestVote 由候選人在選舉任期發起
- 附加條目 AppendEntries 由領導人發起,用來復制日志和提供心跳。
- 為了傳輸快照單獨增加的 RPC。
備注:當服務沒有及時收到 RPC 的響應時,會發起重試。
Summary
- 3 個狀態的意義和他們之間切換
- 任期的設計背景,任期在節點通信時的作用,任期在增長策略。
- 節點直接的通信 RPC 類型以及策略。