瞭解一下Zookeeper的Leader選舉

一、Leader選舉概述

Leader選舉是ZooKeeper中最重要的技術之一,也是保證分佈式數據一致性的關鍵所在。

二、Leader選舉

2.1 服務器啓動時期的Leader選舉

2.1.1 什麼時候進行Leader選舉

需要注意的一點是,隱式條件便是ZooKeeper的集羣規模至少是2臺機器,這裏我們以3臺機器組成的服務器集羣爲例。在服務器集羣初始化階段,當有一臺服務器(我們假設這臺機器的myid爲1,因此稱其爲Server1)啓動的時候,它是無法完成Leader選舉的,是無法進行Leader選舉的。當第二臺機器(同樣,我們假設這臺服務器的myid爲2,稱其爲Server2)也啓動後,此時這兩臺機器已經能夠進行互相通信,每臺機器都試圖找到一個Leader,於是便進入了Leader選舉流程。

2.1.2 Leader選舉過程

  1. 每個Server會發出一個投票。由於是初始情況,因此對於Server1和Server2來說,都會將自己作爲Leader服務
    器來進行投票,每次投票包含的最基本的元素包括:所推舉的服務器的myid 和ZXID,我們以(myid, ZXID)的形式來表示。因爲是初始化階段,因此無論是Serverl還是Server2,都會投給自己,即Serverl的投票爲(1, 0),Server2 的投
    票爲(2,0),然後各自將這個投票發給集羣中其他所有機器。.
  2. 接收來自各個服務器的投票。每個服務器都會接收來自其他服務器的投票。集羣中的每個服務器在接收到投票
    後,首先會判斷該投票的有效性,包括檢查是否是本輪投票、是否來自LOOKING狀態的服務器。
  3. 處理投票。
    在接收到來自其他服務器的投票後,針對每一個投票,服務器都需要將別人的投票和自己的投票進行PK,PK的規則如下。
    優先檢查ZXID。ZXID比較大的服務器優先作爲Leader。
    如果ZXID相同的話,那麼就比較myid。myid比較大的服務器作爲Leader服務器。

    現在我們來看Server1和Server2實際是如何進行投票處理的。對於Server1來說,它自己的投票是(1, 0),而接收到的投票爲(2,0)。首先會對比兩者的ZXID,因爲都是0,所以無法決定誰是Leader。接下來會對比兩者的myid,很顯然,Server1
    發現接收到的投票中的myid是2,大於自己,於是就會更新自己的投票爲(2, 0),然後重新將投票發出去。而對於Server2來說,不需要更新自己的投票信息,只是再一次向集羣中所有機器發出上一次投票信息即可。
  4. 統計投票。
    每次投票後,服務器都會統計所有投票,判斷是否已經有過半的機器接收到相同的投票信息。對於Server1和Server2服務器來說,都統計出集羣中已經有兩臺機器接受了(2, 0)這個投票信息。這裏我們需要對“過半”的概念做一個簡單的
    介紹。所謂“過半”就是指大於集羣機器數量的一半,即大於或等於(n/2+1)。對於這裏由3臺機器構成的集羣,大於等於2臺即爲達到“過半”要求。
    那麼,當Server1和Server2都收到相同的投票信息(2,0)的時候,即認爲已經選出了Leader。
  5. 改變服務器狀態。
    一旦確定了Leader, 每個服務器就會更新自己的狀態:如果是Follower, 那麼就變更爲FOLLOWING,如果是Leader,那麼就變更爲LEADING。

2.2 服務器運行期間的Leader選舉

在ZooKeeper集羣正常運行過程中,一旦選出一個Leader,那麼所有服務器的集羣角色一般不會再發生變化,也就是說,Leader服務器將一直作爲集羣的Leader, 即使集羣中有非Leader集羣掛了或是有新機器加入集羣也不會影響Leader。但是一旦Leader所在的機器掛了,那麼整個集羣將暫時無法對外服務,而是進入新一輪的Leader選舉。服務器運行期間的Leader選舉和啓動時期的Leader選舉基本過程是一致的。
我們假設當前正在運行的ZooKeeper服務器由3臺機器組成,分別是Server1、Server2和Server3,當前的Leader是Server2。假設在某一個瞬間,Leader 掛了,這個時候便開始了Leader選舉。

  1. 變更狀態。
    當Leader掛了之後,餘下的非Observer服務器都會將自己的服務器狀態變更爲LOOKING,然後開始進人Leader選舉流程。
  2. 每個Server會發出一個投票。
    在這個過程中,需要生成投票信息(myid, ZXID)。 因爲是運行期間,因此每個服務器上的ZXID可能不同,我們假定Server的ZXID爲123,而Server3的ZXID爲122。在第一輪投票中,Serverl 和Server3都會投自己,即分別產生投票(1,123)和(3,122),然後各自將這個投票發給集羣中所有機器。
  3. 接收來自各個服務器的投票。
  4. 處理投票。
    對於投票的處理,和上面提到的服務器啓動期間的處理規則是一致的。在這個例子裏面,由於Server1的ZXID爲123, Server3的ZXID爲122, 那麼顯然, Server1會成爲Leader.
  5. 統計投票。
  6. 改變服務器狀態。
發佈了68 篇原創文章 · 獲贊 12 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章