1. 程式人生 > >分布式系統選舉算法剖析

分布式系統選舉算法剖析

技術 prop 發生 其他 語言 客戶端 end 總結 處理

1.概述

  我們在了解分布式選舉算法之前,我們需要這樣一種算法產生的背景。在一個分布式系統中,因為各種意外的因素,有的服務器可能會崩潰或變得不可靠,它就不能和其他服務器達成一致狀態。因而這樣就需要一種Consensus協議,來確保服務器的容錯性,也就是說即使系統中有一兩個服務器節點Crash,也不會影響其處理過程。為了讓容錯方式達成一致,我們不可能要求所有的服務器節點100%都達成Consensus狀態,只要超過半數的大多數服務器節點Consensus即可,假設有N臺服務器節點,(N/2)+1 就超過半數,即可代表大多數了。那麽,今天筆者給大家分享的就是Raft分布式選舉算法。

2.內容

  Raft為了實現Consensus這個目標,這個過程如果選舉一樣,參選者需要說服大多數服務器節點投票給他,一旦選定後就跟隨其操作。在Raft中,任何時候一個服務器節點可以扮演下面角色之一:

  1. Leader:處理所有客戶端交互,日誌復制等操作,一般一次只有一個Leader。
  2. Follower:類似選民,處於被動狀態。
  3. Candidate:類似Proposer,可以被選為一個新的Leader。

  Raft階段分為兩個,首先是選舉過程,然後在選舉出來的Leader帶領下進行相關正常的操作,比如復制等。下面有相關示意圖來展示該過程:

2.1 選舉請求

  任何一個服務器節點都可以成為一個Candidate,它向其他服務器節點Follower發出要求選舉自己的請求,如下圖所示:

技術分享

2.2 應答

  其他服務器應答同意,發出OK。如下圖所示:

技術分享

  需要註意的是,如果在這個過程當中,有一個FollowerCrash掉,沒有收到請求選舉的要求,因此候選者可以自己選舉自己,只要達到 (N/2)+1 的大多數票,候選人還是可以成為Leader的。

2.3 發送指令

  在候選者成為Leader後,它可以向其他Follower節點發送指令,比如進行日誌復制,如下圖所示:

技術分享

2.4 Heartbeats

  之後,通過心跳進行日誌復制等通知,如下所示:

技術分享

2.5 Crash

  在運行的過程當中,一旦該集群的Leader當場Crash了,那麽Follower中有一個成為候選者,發出投票選舉邀請,如下圖所示:

技術分享

2.6 New Leader

  在Follower同意後,其成為Leader,繼續承擔日誌復制等操作動作,如下圖所示:

技術分享

  這裏需要註意的是,在整個選舉過程當中是有一個時間限制的,如下圖所示:

技術分享

  出現在Split Note的情況,是因為如果同時有兩個候選人向其他節點發出投票邀請,這時通過類似的加時賽來解決,兩個候選者在一段Timeout,比如100ms互相不服氣的等待後,因為雙方得到的票數是一樣的,一半對一半,那麽在100ms後,再由這兩個候選者發出投票邀請,這時同時的概率大大降低,那麽首先發出邀請投票的候選者得到大多數同意票後,成為Leader,而另外的一個候選者後來發出投票邀請,那些Follower選民已經投票給了第一個候選者,此時不能再投票給它,它就成為落選者了,最後這個落選者也就成為一名普通的Follower了。

3.日誌復制案例

  下面通過以日誌復制為例子來說明Raft分布式選舉算法,假設這裏Leader已經選出,這時候客戶端發出一個新增的請求,比如日誌內容是"smartloli",如下所圖所示:

技術分享

3.1 Append

  在Leader發送的指令下,Follower需要遵循它的指令,都將這個新的日誌內容追加到他們各自的日誌中:

技術分享

3.2 Commit

  大多數Follower服務器節點日誌寫入磁盤文件後,確認追加成功,發出Commited OK,如下圖所示:

技術分享

  再下一個心跳Heartbeats中,Leader會通知所有的Follower更新Commited。對於每個新的日誌記錄,重復上述操作過程。如果在這個過程當中,發生了網絡通信故障,使得Leader不能訪問大多數Followers了,那麽Leader只能正常更新它能訪問的那些Follower服務器節點,而大多數的服務器Follower因為沒有了Leader,他們重新選擇一個候選者作為Leader,然後這個新的Leader作為代表與外界進行交互,如果外界發送新的請求操作,比如添加新的日誌,這個新的Leader就按照上述步驟通知大多數Followers服務器節點,如果這時網絡故障修復了,那麽原先的Leader就要降級成為Follower,在失聯階段這個老Leader的任何更新都不能算Commit,都要Roll Back,接受新的Leader的新的更新操作。

4.總結

  目前,幾乎所有的語言都已經支持Raft分布式選舉算法的庫了。這裏我們通過對分布式選舉算法的學習與分析,可以對分布式系統底層選舉機制有更好的理解。大家可以去閱讀一下Raft算法作者寫的論文。另外,Raft的作者有將論文進行整理成了大綱,閱讀地址:《Raft論文大綱》

5.結束語

  這篇博客就和大家分享到這裏,如果大家在研究學習的過程當中有什麽問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉。

分布式系統選舉算法剖析