what:
raft是分布式的一致性協議(Consensus),其相對pasox更加簡單。用來保障servers上副本一致性的一種算法。
一致性協議是為了確保容錯性,也就是即使系統中有一兩個服務器當機,也不會影響其處理過程
how:
確保一致性的核心思想:
采用選舉機制,參選者需要說服大多數選民(服務器)投票給他,一旦選定(leader)后,其他的server就是(follower)跟隨leader操作,從而確保分布式的一致性。
選leader:
參考如下圖(也是follower狀態轉化圖):
Raft 的選主基於一種“心跳機制”。leader 會周期性的向所有節點發送心跳包來維持自己的權威。
第一步:准備選舉自己
剛啟動時,所以的server節點都是follower身份(Step: starts up)。沒有leader時,某個server節點和leader的心跳先超時,它就會從follower變為candidate,而發起選舉(Step: times out, starts election)。(注意:為了各節點不同時變為candidate,在各節點的固定超時時間上某個范圍內的隨機數)。如下圖:
第二步:開始選舉自己:
節點身份切換為 candidate,並將term加上1。然后它會向集群其它節點發送“請給自己投票”的消息(RequestVote RPC)。
第三步:選擇結果:
candidate會有3種結果,分別對應上面狀態圖的3條線。
1. 選舉成功(Step: receives votes from majority of servers):
2、選舉失敗(Step: discovers current leader or new term):
Candidate 在等待投票回復的時候,收到其它自稱是 leader 節點發送的心跳包,且term 不小於 candidate 當前的 term,那么 candidate 會承認這個 leader,並將身份切回 follower。term 比自己小,candidate 會拒絕這次請求並保持選舉狀態。
3、選舉超時(Step: times out, new election):
多個 follower 同時成為 candidate,選票是可能被瓜分的,如果沒有任何一個 candidate 能得到大多數節點的支持,那么每一個 candidate 都會超時。這里的“特殊處理”指的就是前文所述的隨機化選舉超時時間。此時 candidate 需要增加自己的 term,然后發起新一輪選舉。
第四步、老leader更換:
即上面狀態圖的:discovers server with higher term。一段時間后老 leader 恢復了(如:網絡故障、或者機器宕機恢復),收到了來自新leader 的心跳包,發現心跳中的 term 大於自己的 term,此時該節點會立刻切換為 follower 並跟隨的新 leader。