zookeeper叢集的選舉機制
Zookeeper預設的演算法是FastLeaderElection, 採用投票數大於半數則勝出的邏輯。
選舉依據:
伺服器ID:
比如有3臺伺服器, 編號分別為 1, 2, 3。
編號越大,在選舉演算法中的權重越大。
選舉狀態:
LOOKING,競選狀態。
FOLLOWING,隨從狀態。同步leader狀態,參與投票。
OBSERVING,觀察狀態,同步leader狀態,不參與任何投票。
LEADING,領導者狀態。
資料ID:
伺服器中存放的最新資料的version,值越大說明資料版本越新,在選舉演算法中的權重越大。
邏輯時鐘:
也可以叫投票的次數,同一輪投票過程中的邏輯時鐘是相同的,每投完一次票這個數值都會增加,
然後與接收到的其他伺服器返回的投票資訊中的數值相比,根據值不同做出不同的判斷。
叢集選舉型別:全新叢集選舉與非全新叢集選舉。
全新叢集選舉:假設現在有5臺伺服器均沒有資料,它們的編號分別是1,2,3,4,5,按編號依次啟動。過程如下:
1. 伺服器 1 啟動,給自己投票,然後發投票資訊給其他伺服器,由於其他伺服器沒有啟動,所以它收不到反饋資訊,但是由於投票還沒有到達半數(伺服器 1 怎麼知道一共有多少臺伺服器參與選舉呢, 那是因為在zk配置檔案中配置了叢集資訊,所有配置了3888埠的伺服器均會參與投票,假設這5臺都參與投票,則超過半數應為至少3臺伺服器參與投票。),所以伺服器 1 的狀態一直處於 LOOKING。
2. 伺服器 2 啟動, 給自己投票,然後與其他服務投票資訊交換結果, 由於伺服器 2 的編號大於伺服器 1, 所以伺服器 2 勝出,但是由於投票仍未到達半數,所以伺服器 2 同樣處於 LOOKING 狀態。
3. 伺服器 3 啟動, 給自己投票,然後與其他服務投票資訊交換結果, 由於伺服器 3 的編號大於伺服器 2,1,所以伺服器 3勝出, 並且此時投票數正好大於半數, 所以選舉結束,伺服器 3 處於LEADING 狀態, 伺服器 1, 伺服器 2 處於 FOLLOWING 狀態。
4. 伺服器 4 啟動, 給自己投票, 同時與之前的伺服器 1 ,2,3交換資訊,儘管伺服器 4 的編號最大,但之前伺服器 3 已經勝出,所以伺服器 4 只能處於 FOLLOWING 狀態。
5. 伺服器 5 啟動, 同上。FOLLOWING狀態。
非全新叢集選舉:對於執行正常的zookeeper叢集,中途有機器down掉,需要重新選舉時,選舉過程就需要加入資料ID、伺服器ID、和邏輯時鐘。
這樣選舉就變成:
1.邏輯時鐘小的選舉結果被忽略,重新投票;(除去選舉次數不完整的伺服器)
2.統一邏輯時鐘後,資料id大的勝出;(選出資料最新的伺服器)
3.資料id相同的情況下,伺服器id大的勝出。(資料相同的情況下, 選擇伺服器id最大,即權重最大的伺服器)