Raft算法是強上司模型,叢集中隻能有一個上司。
下面是raft的視訊講解:
raft
raft的三種角色及其概念
伺服器節點狀态一共有三種:上司者(Leader)、跟随着(Follower)、候選人(Candidate)
跟随者:接受和處理來自上司者的消息,當等待上司者心跳資訊逾時時,推薦自己當候選人
候選人:向其他節點發送請求投票的RPC消息,通知其他節點來投票,如果赢得了大多數選票,就晉升當上司者
上司者:處理寫請求、管理日志複制、不斷發送心跳資訊,表示自己還活着,不要發起新的選舉
選舉上司者的過程
初始狀态:所有節點都是跟随者
Raft算法特性時随機逾時時間,每個節點等待上司者節點心跳資訊的逾時時間間隔是随機的。
叢集中沒有上司者時,等待逾時時間最小的節點會因為沒有等到上司者心跳資訊,發生逾時。
逾時自薦
此時該節點就會增加自己的任期編号,并推舉自己為候選人,先給自己投一張選票,然後向其他節點發送請求投票RPC消息,請它們選舉自己為上司者。
選舉投票
其他節點接受到候選人的RPC消息時,并且在編号為1的任期内,沒有投過票,那麼就把選票投給該候選人,然後增加自己的任期編号。
圖1 初始狀态 | 圖2 逾時自薦 | 圖3 選舉投票 |
新上司産生
候選人在選舉逾時時間内赢得了大多數的選票,那麼它就會成為本屆任期内新的上司者。
新上司威懾維權
上司者将周期性地發送心跳消息,通知其他伺服器我是上司者,阻止跟随者發起新的選舉,篡權。
圖1 初始狀态 | 圖2 逾時自薦 |
選舉細節
1、節點間通訊方式
Raft裡,伺服器節點間溝通聯絡采用的是遠端過程調用(RPC),在上司選舉中,需要用到兩類RPC:
1、請求投票(RequestVote)RPC,由候選人在選舉期間發起,通知各個節點進行投票
2、日志複制(AppendEntries)RPC,由上司者發起,用來複制日志和提供心跳資訊
2、關于任期的rules
Raft算法中的上司者是有任期的,每個任期由單調遞增的數字(任期編号)辨別。任期編号會随着選舉的進行而變化。
Raft 算法中的任期不隻是時間段,而且任期編号的大小,會影響上司者選舉和請求的處理。
1、跟随者在等待上司者心跳資訊逾時後,推舉自己為候選人,會增加自己的任期号。(在推舉自己的時候就會++了)
2、一個伺服器節點若檢測到自己任期編号比其他節點小,更新自己的編号到較大的編号值
3、若一個候選人或者上司者檢測到自己任期編号比其他節點小,會将自己恢複成跟随着狀态。是以,raft 不相容作惡節點。 隻要有一個作惡節點發送“任期編号更大“的心跳消息,立馬就能讓這個叢集變成無 leader 的,進而無法工作
4、如果一個節點接收到一個包含較小的任期編号值的請求,那麼它會直接拒絕這個請求。
3、關于選舉的rules
1、上司者周期性向所有跟随者發送心跳資訊(不包含日志複制RPC消息)
2、如果在指定時間内,跟随者沒有結收到上司者的消息,那麼就自薦,發起上司者選舉
3、在一次選舉中,赢得大多數選票的候選人,将晉升為上司者
4、一個任期内,上司者會一直是上司者,直到它自身出現當機等問題。當然如果出現網絡延遲,也會出現重新選舉的情況‘
5、在一次選舉中,每一個伺服器節點最多會對一個任期編号投出一張選票,并且按照“先來先服務”的原則進行投票。
如下圖:
6、日志完整性高的跟随者拒絕投票給日志完整性低的候選人,即如果日志不完整的請求當主節點,如果目前的節點日志比他完整,那麼就會拒絕給他投票
4、随即逾時解決選票瓜分現象
• 跟随者等待上司者心跳資訊逾時的時間間隔,是随機的
• 當沒有候選人赢得過半票數,選舉無效了,這時需要等待一個随機時間間隔,也就是說,等待選舉逾時的時間間隔,是随機的
關于raft的上司者選舉限制和局限
1.讀寫請求和資料轉發壓力落在上司者節點,導緻上司者壓力。
2.大規模跟随者的叢集,上司者需要承擔大量中繼資料維護和心跳通知的成本。
3.上司者單點問題,故障後直到新上司者選舉出來期間叢集不可用。
4.随着候選人規模增長,收集半數以上投票的成本更大。