【Zookeeper】Zookeeper的Leader選舉流程

一、Zookeeper集羣

Zookeeper可以配置多個實例共同構成一個集羣對外提供服務以達到水平擴展的目的,每個服務器上的數據都是相同的,每一個服務器均可以對外提供讀和寫的服務,這點和Redis是相同的,即對客戶端來說每個服務器都是平等的。

在集羣中,需要一個Leader來完成處理事務,協調Zookeeper中的其他節點等工作,接下來就來介紹Zookeeper集羣是如何選擇出一個Leader節點的。

1. ZK集羣中服務器的狀態

Zookeeper集羣中服務器被劃分爲以下四種狀態

  • LOOKING:尋找Leader狀態。處於該狀態的服務器會認爲集羣中沒有Leader,需要進行Leader選舉;

  • FOLLOWING:跟隨着狀態,說明當前服務器角色爲Follower;

  • LEADING:領導者狀態,表明當前服務器角色爲Leader;

  • OBSERVING:觀察者狀態,表明當前服務器角色爲Observer。

2. 選票信息

每個選票中包含四個最基本的信息,服務器的ID,數據ID,邏輯時鐘以及選舉狀態:

  • 服務器ID:即myId,服務器的唯一標識,編號越大在選擇算法中的權重越大;
  • 數據ID:服務器中存放的最大數據ID,值越大說明數據越新,在選舉算法中數據新權重越大;
  • 邏輯時鐘:Epoch,邏輯時鐘,或者叫投票次數,同一輪投票過程時鐘值是相同的,每投完一次票這個數據就會增加,然後與接收到的其他服務器返回的投票信息中的數值相比,根據不同的值做出不同的判斷;
  • 選舉狀態:即上文提到的四種狀態。

3. Leader選舉的觸發時機

  • 集羣啓動,這個時候需要選舉出新的Leader;
  • Leader服務器宕機;
  • Follow服務器宕機後,Leader服務器發現自己已經沒有過半的Follow跟隨自己了,不能對外提供服務(領導者選舉)。

二、Leader的選舉流程

1. 服務器啓動時期的Leader選舉

假設想在的有三臺機器搭建集羣,在集羣初始化階段,當只有一個服務器(Server1)啓動時,無法完成Leader的選舉;當第二臺服務器(Server2)啓動後,兩臺機器開始互相通信,每臺機器都會嘗試去選舉Leader,於是進入了Leader選舉過程,這個過程大概如下:

  1. 每個Server發出一個投票投給自己。在初始情況下,Server1和Server2都會將自己作爲Leader,將票投給自己。每次投票會包含所推舉的服務器的myid和ZXID,使用(myid,ZXID)來表示,此時Server1的投票爲(1, 0),Server2的投票爲(2, 0),然後各自將這個投票發給集羣中的其他機器;

  2. 接受來自各個服務器的投票。集羣的每個服務器收到投票後,首先判斷該投票是否有效,如檢查是否是本輪投票、是否來自LOOKING狀態的服務器;

  3. 處理投票。針對每一個投票,服務器都需要將別人的投票和自己的投票進行PK,PK的規則如下:

    1. 優先檢查ZXID。ZXID比較大的服務器優先作爲Leader;
    2. 如果ZXID相同,那麼就比較myid。myid較大的服務器作爲Leader服務器。

    對於Server1而言,它的投票是(1, 0),接收Server2的投票爲(2, 0),首先會比較兩者的ZXID,均爲0,再比較myid,此時Server2的myid最大,於是更新自己的投票爲(2, 0),然後重新投票,對於Server2而言,其無須更新自己的投票,只是再次向集羣中所有機器發出上一次投票信息即可。

  4. 統計投票。每次投票後,服務器都會統計投票信息,判斷是否已經過半機器接收到相同的投票信息,對於Server1、Server2而言,都統計出集羣中已經有兩臺機器接受了(2, 0)的投票信息,此時便認爲已經選出了Leader。

  5. 改變服務器狀態。一旦確定了Leader,每個服務器都會更新自己的狀態,如果是Follower,那麼就變更爲FOLLOWING,如果是Leader,就變更爲LEADING。

2. 服務器運行期間的 Leader 選舉

在Zookeeper運行期間,即便有新服務器加入,也不會影響到Leader,新加入的服務器會將原有的Leader服務器視爲Leader,進行同步。但是一旦Leader宕機了,那麼整個集羣就將暫停對外服務,進行新一輪Leader的選舉,其過程和啓動時期的Leader選舉過程基本一致。假設正在運行的有Server1、Server2、Server3三臺服務器,當前Leader是Server2,若某一時刻Leader掛了,此時便開始Leader選舉。選舉過程如下:

  1. 變更狀態。Leader宕機後,餘下的非Observer服務器都會將自己的服務器狀態變更爲LOOKING,然後開始進行Leader選舉流程;
  2. 每個Server會發出一個投票。在這個過程中,需要生成投票信息(myid,ZXID)每個服務器上的ZXID可能不同,我們假定Server1的ZXID爲123,而Server3的ZXID爲122;在第一輪投票中,Server1和Server3都會投自己,產生投票(1, 123),(3, 122),然後各自將投票發送給集羣中所有機器;
  3. 接收來自各個服務器的投票。與啓動時過程相同;
  4. 處理投票;
  5. 統計投票;
  6. 改變服務器的狀態。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章