三種節(jié)點
- follower
- candidate
- leader
- 一般情況下,只有一個leader,其他節(jié)點全是follower燕鸽。
- leader:處理所有的客戶端請求(如果一個客戶端和follower聯(lián)系闪彼,那follower會把請求重定向給leader)
- follower:不會發(fā)送任何請求,只是簡單的響應來自leader或者candidate的請求吝秕。
- candidate: 選舉時期泊脐,來描述選舉新leader
選舉過程
term(任期):有一個follower成為候選人,term+1
集群中只有follower
follower -> candidate
- 這里涉及到了一個選舉超時時間烁峭,一個追隨者在成為候選人之前等待的時間容客,每個follower被隨機分配在150ms和300ms之間。
Raft 使用一種心跳機制來觸發(fā)領導人選舉约郁。一個服務器節(jié)點要想繼續(xù)保持著跟隨者狀態(tài)除非他從領導人或者候選者處接收到有效的 RPCs缩挑。
如果一個follower 在一段時間里沒有接收到任何消息,也就是選舉超時鬓梅,然后他就會認為系統(tǒng)中沒有可用的領導者然后開始進行選舉以選出新的領導者供置。
要開始一次選舉過程,跟隨者先要增加自己的當前任期號并且轉換到候選人狀態(tài)绽快,并且給自己投一票芥丧。然后他會并行的向集群中的其他服務器節(jié)點發(fā)送請求投票的 RPCs 來給自己投票紧阔。
如果接收節(jié)點沒有在此期間投票,那么這票也算為candidate投票续担;再發(fā)送選票后擅耽,重置自己的選舉超時時間
Candidate的三種結局
收到大部分選票,成為leader
收到大量同一個任期的選票物遇,保證一個任期號乖仇,最多只會有一個領導人被選舉出來
一旦候選人贏得選舉,他就立即成為領導人询兴。然后他會向其他的服務器發(fā)送心跳消息來建立自己的權威并且阻止新的領導人的產生乃沙。
其他服務器成為了leader
在等待投票的時候,候選人可能會從其他的服務器接收到聲明它是領導人的附加日志項 RPC诗舰。如果這個領導人的任期號(包含在此次的 RPC中)不小于候選人當前的任期號警儒,那么候選人會承認領導人合法并回到跟隨者狀態(tài)。 如果此次 RPC 中的任期號比自己小始衅,那么候選人就會拒絕這次的 RPC 并且繼續(xù)保持候選人狀態(tài)冷蚂。
選票瓜分,既沒有贏也沒有輸
意味著有多個跟隨者同時成為候選人汛闸,而導致無法產生結果蝙茶。
當這種情況發(fā)生的時候,每一個候選人都會超時诸老,然后通過增加當前任期號來開始一輪新的選舉隆夯。
Raft 算法使用隨機選舉超時時間的方法來確保很少會發(fā)生選票瓜分的情況,就算發(fā)生也能很快的解決。為了阻止選票起初就被瓜分,選舉超時時間是從一個固定的區(qū)間(例如 150-300毫秒)隨機選擇赠尾。這樣可以把服務器都分散開以至于在大多數(shù)情況下只有一個服務器會選舉超時;然后他贏得選舉并在其他服務器超時之前發(fā)送心跳包愧口。同樣的機制被用在選票瓜分的情況下。每一個候選人在開始一次選舉的時候會重置一個隨機的選舉超時時間类茂,然后在超時時間內等待投票的結果耍属;這樣減少了在新的選舉中另外的選票瓜分的可能性。
這個選舉任期將持續(xù)到跟隨者停止接受心跳并成為候選人巩检。
leader宕機
其他follower在超時期間厚骗,未收到心跳包,則重新選舉兢哭。