1. 程式人生 > >ZooKeeper 選舉機制

ZooKeeper 選舉機制

keep owin 正常的 需要 分別是 領導者 反饋 election 數據

ookeeper 默認的算法是 FastLeaderElection,采用投票數大於半數則勝出的邏輯。
6.1 . 概念
服務器 ID
比如有三臺服務器,編號分別是 1,2,3。編號越大在選擇算法中的權重越大。
選舉狀態
LOOKING,競選狀態。
FOLLOWING,隨從狀態,同步 leader 狀態,參與投票。
OBSERVING,觀察狀態,同步 leader 狀態,不參與投票。LEADING,領導者狀態。
數據 ID
服務器中存放的最新數據 version。
值越大說明數據越新,在選舉算法中數據越新權重越大。邏輯時鐘
也叫投票的次數,同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數據就會增加,然後與接收到的其它服務器返回的投票信息中的數值相比, 根據不同的值做出不同的判斷。

6.2 . 全新集群選舉
假設目前有 5 臺服務器,每臺服務器均沒有數據,它們的編號分別是
1,2,3,4,5,按編號依次啟動,它們的選擇舉過程如下:
l 服務器 1 啟動,給自己投票,然後發投票信息,由於其它機器還沒有啟動所以它收不到反饋信息,服務器 1 的狀態一直屬於 Looking。
l 服務器 2 啟動,給自己投票,同時與之前啟動的服務器 1 交換結果,由於服務器 2 的編號大所以服務器 2 勝出,但此時投票數沒有大於半數, 所以兩個服務器的狀態依然是 LOOKING。
l 服務器 3 啟動,給自己投票,同時與之前啟動的服務器 1,2 交換信息, 由於服務器 3 的編號最大所以服務器 3 勝出,此時投票數正好大於半數, 所以服務器 3 成為領導者,服務器 1,2 成為小弟。

l 服務器 4 啟動,給自己投票,同時與之前啟動的服務器 1,2,3 交換信息, 盡管服務器 4 的編號大,但之前服務器 3 已經勝出,所以服務器 4 只能成為小弟。
l 服務器 5 啟動,後面的邏輯同服務器 4 成為小弟。
6.3 . 非全新集群選舉
對於運行正常的 zookeeper 集群,中途有機器 down 掉,需要重新選舉時, 選舉過程就需要加入數據 ID、服務器 ID 和邏輯時鐘。
數據 ID:數據新的 version 就大,數據每次更新都會更新 version。服務器 ID:就是我們配置的 myid 中的值,每個機器一個。
邏輯時鐘:這個值從 0 開始遞增,每次選舉對應一個值。 如果在同一次選舉中,這個值是一致的。
這樣選舉的標準就變成:
1、邏輯時鐘小的選舉結果被忽略,重新投票;
2、統一邏輯時鐘後,數據 id 大的勝出;
3、數據 id 相同的情況下,服務器 id 大的勝出; 根據這個規則選出 leader。

ZooKeeper 選舉機制