Zookeeper 選舉機制

Zookeeper 選舉機制

zookeeper 三種選擇策略

  • LeaderElection (即將廢棄)
  • AuthFastLeaderElection (即將廢棄)
  • FastLeaderElection (默認)

選擇機制中的概念

Serverid

服務器ID/編號。比如有三臺服務器,編號分別是1,2,3。編號越大在選擇算法中的權重越大。

Zxid:

數據ID。服務器中存放的最大數據ID。值越大說明數據越新,在選舉算法中數據越新權重越大。

Epoch:

邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,該值在服務端是一個自增序列,每次進入新一輪的投票後,都會對該值進行加1操作。

Server狀態:選舉狀態

  • Looking 選舉中狀態(集羣剛啓動或leader宕機時,查找leader的狀態)
  • Leading 領導者狀態(若節點爲leader,那麼它就是leading狀態)
  • Following 隨從者狀態(若節點爲follower,它就會同步leader數據,成爲following狀態)
  • Observing 觀察者狀態(若節點爲observer,它就會同步leader數據,成爲observing狀態)

選舉消息內容

在投票完成後,需要將投票信息發送給集羣中的所有服務器,它包含如下內容。

  • 服務器ID
  • 數據ID
  • 邏輯時鐘
  • 選舉狀態

FastLeaderElection 選舉算法介紹

FastLeaderElection是標準的fast paxos算法的實現

判斷是否已經勝出

默認是採用投票數大於半數則勝出的邏輯。

啓動時的選舉流程簡述

目前有5臺服務器,每臺服務器均沒有數據,它們的編號分別是1,2,3,4,5,按編號依次啓動,它們的選擇舉過程如下:

  • 服務器1啓動,給自己投票,然後發投票信息,由於其它機器還沒有啓動所以它收不到反饋信息,服務器1的狀態一直屬於Looking(選舉狀態)。
  • 服務器2啓動,給自己投票,同時與之前啓動的服務器1交換結果,由於服務器2的編號大所以服務器2勝出,但此時投票數沒有大於半數,所以兩個服務器的狀態依然是LOOKING。
  • 服務器3啓動,給自己投票,同時與之前啓動的服務器1,2交換信息,由於服務器3的編號最大所以服務器3勝出,此時投票數正好大於半數,所以服務器3成爲領導者,服務器1,2成爲小弟。
  • 服務器4啓動,給自己投票,同時與之前啓動的服務器1,2,3交換信息,儘管服務器4的編號大,但之前服務器3已經勝出,所以服務器4只能成爲小弟。
  • 服務器5啓動,後面的邏輯同服務器4成爲小弟。

選舉流程詳述

一、 首先開始選舉階段,每個Server讀取自身的zxid。
二、 發送投票信息

  1. 首先,每個Server第一輪都會投票給自己。
  2. 投票信息包含 :所選舉leader的Serverid,Zxid,Epoch。Epoch會隨着選舉輪數的增加而遞增。

三、 接收投票信息

  1. 如果服務器B接收到服務器A的數據(服務器A處於選舉狀態(LOOKING 狀態)
    1. 首先,判斷邏輯時鐘值:
      1. 如果發送過來的邏輯時鐘Epoch大於目前的邏輯時鐘。首先,更新本邏輯時鐘Epoch,同時清空本輪邏輯時鐘收集到的來自其他server的選舉數據。然後,判斷是否需要更新當前自己的選舉leader Serverid。判斷規則:保存的zxid最大值和leader Serverid來進行判斷的。先看數據zxid,數據zxid大者勝出;其次再判斷leader Serverid,leader Serverid大者勝出;然後再將自身最新的選舉結果(也就是上面提到的三種數據(leader Serverid,Zxid,Epoch)廣播給其他server)
      2. 如果發送過來的邏輯時鐘Epoch小於目前的邏輯時鐘。說明對方server在一個相對較早的Epoch中,這裏只需要將本機的三種數據(leader Serverid,Zxid,Epoch)發送過去就行。
      3. 如果發送過來的邏輯時鐘Epoch等於目前的邏輯時鐘。再根據上述判斷規則來選舉leader ,然後再將自身最新的選舉結果(也就是上面提到的三種數據(leader Serverid,Zxid,Epoch)廣播給其他server)。
    2. 其次,判斷服務器是不是已經收集到了所有服務器的選舉狀態:若是,根據選舉結果設置自己的角色(FOLLOWING還是LEADER),退出選舉過程就是了。
    3. 最後,若沒有收到沒有收集到所有服務器的選舉狀態:也可以判斷一下根據以上過程之後最新的選舉leader是不是得到了超過半數以上服務器的支持,如果是,那麼嘗試在200ms內接收一下數據,如果沒有新的數據到來,說明大家都已經默認了這個結果,同樣也設置角色退出選舉過程。
  2. 如果所接收服務器A處在其它狀態(FOLLOWING或者LEADING)。
    1. 邏輯時鐘Epoch等於目前的邏輯時鐘,將該數據保存到recvset。此時Server已經處於LEADING狀態,說明此時這個server已經投票選出結果。若此時這個接收服務器宣稱自己是leader, 那麼將判斷是不是有半數以上的服務器選舉它,如果是則設置選舉狀態退出選舉過程。
    2. 否則這是一條與當前邏輯時鐘不符合的消息,那麼說明在另一個選舉過程中已經有了選舉結果,於是將該選舉結果加入到outofelection集合中,再根據outofelection來判斷是否可以結束選舉,如果可以也是保存邏輯時鐘,設置選舉狀態,退出選舉過程。

參考文章:
https://blog.csdn.net/u010039929/article/details/70171672
https://www.cnblogs.com/ASPNET2008/p/6421571.html
https://blog.csdn.net/cnh294141800/article/details/52959028/
https://www.cnblogs.com/felixzh/p/5869212.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章