raft
在Raft中,任何時候一個服務器可以扮演下面角色之一:
- Leader: 處理所有客戶端交互雳灾,日志復制等漠酿,一般一次只有一個Leader.
- Follower: 類似選民,完全被動
- Candidate候選人: 類似Proposer律師谎亩,可以被選為一個新的領導人炒嘲。
raft 分為2個階段 選舉和恢復
選舉
- 每個服務器都可以成為Candidate宇姚,向其他follower發(fā)送請求,要求選擇我
- 其他服務器同意夫凸,發(fā)送ok. 注意如果在這個過程中浑劳,有一個Follower當機,沒有收到請求選舉的要求夭拌,因此候選者可以自己選自己魔熏,只要達到N/2 + 1 的大多數(shù)票,候選人還是可以成為Leader的
恢復
- 新leader向follower發(fā)出指令鸽扁,進行操作蒜绽,比如日志復制
- leader和follower之間進行心跳聯(lián)系,如果有l(wèi)eader奔潰后桶现,重新選舉
Splite Vote是因為如果同時有兩個候選人向大家邀票躲雅,這時通過類似加時賽來解決,兩個候選者在一段timeout比如300ms互相不服氣的等待以后骡和,因為雙方得到的票數(shù)是一樣的吏夯,一半對一半,那么在300ms以后即横,再由這兩個候選者發(fā)出邀票噪生,這時同時的概率大大降低,那么首先發(fā)出邀票的的候選者得到了大多數(shù)同意东囚,成為領導者Leader跺嗽,而另外一個候選者后來發(fā)出邀票時,那些Follower選民已經(jīng)投票給第一個候選者页藻,不能再投票給它桨嫁,它就成為落選者了,最后這個落選者也成為普通Follower一員了份帐。
Term
在Raft中使用了一個可以理解為周期(第幾屆璃吧、任期)的概念,用Term作為一個周期废境,每個Term都是一個連續(xù)遞增的編號畜挨,每一輪選舉都是一個Term周期,在一個Term中只能產(chǎn)生一個Leader噩凹;先簡單描述下Term的變化流程: Raft開始時所有Follower的Term為1巴元,其中一個Follower邏輯時鐘到期后轉換為Candidate,Term加1這是Term為2(任期)驮宴,然后開始選舉逮刨,這時候有幾種情況會使Term發(fā)生改變:
1:如果當前Term為2的任期內(nèi)沒有選舉出Leader或出現(xiàn)異常,則Term遞增堵泽,開始新一任期選舉
2:當這輪Term為2的周期選舉出Leader后修己,過后Leader宕掉了恢总,然后其他Follower轉為Candidate,Term遞增睬愤,開始新一任期選舉
3:當Leader或Candidate發(fā)現(xiàn)自己的Term比別的Follower小時Leader或Candidate將轉為Follower离熏,Term遞增
4:當Follower的Term比別的Term小時Follower也將更新Term保持與其他Follower一致;
可以說每次Term的遞增都將發(fā)生新一輪的選舉戴涝,Raft保證一個Term只有一個Leader,在Raft正常運轉中所有的節(jié)點的Term都是一致的钻蔑,如果節(jié)點不發(fā)生故障一個Term(任期)會一直保持下去啥刻,當某節(jié)點收到的請求中Term比當前Term小時則拒絕該請求进萄;
3树埠、選舉(Election)
Raft的選舉由定時器來觸發(fā),每個節(jié)點的選舉定時器時間都是不一樣的鳄袍,開始時狀態(tài)都為Follower某個節(jié)點定時器觸發(fā)選舉后Term遞增窗怒,狀態(tài)由Follower轉為Candidate映跟,向其他節(jié)點發(fā)起RequestVote RPC請求,這時候有三種可能的情況發(fā)生:
1:該RequestVote請求接收到n/2+1(過半數(shù))個節(jié)點的投票扬虚,從Candidate轉為Leader努隙,向其他節(jié)點發(fā)送heartBeat以保持Leader的正常運轉
2:在此期間如果收到其他節(jié)點發(fā)送過來的AppendEntries RPC請求,如該節(jié)點的Term大則當前節(jié)點轉為Follower辜昵,否則保持Candidate拒絕該請求
3:Election timeout發(fā)生則Term遞增荸镊,重新發(fā)起選舉
在一個Term期間每個節(jié)點只能投票一次,所以當有多個Candidate存在時就會出現(xiàn)每個Candidate發(fā)起的選舉都存在接收到的投票數(shù)都不過半的問題堪置,這時每個Candidate都將Term遞增躬存、重啟定時器并重新發(fā)起選舉,由于每個節(jié)點中定時器的時間都是隨機的舀锨,所以就不會多次存在有多個Candidate同時發(fā)起投票的問題岭洲。
什么時候選舉
1:Raft初次啟動,不存在Leader坎匿,發(fā)起選舉盾剩;
2:Leader宕機或Follower沒有接收到Leader的heartBeat,
- 發(fā)生election timeout從而發(fā)起選舉;