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最大,即權重最大的伺服器)
zookeeper選舉機制
fastleaderelection演算法通過非同步的通訊方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快leader的選舉程序。每個在zookeeper伺服器啟動先讀取當前儲存在磁碟的資料,zookeeper中的每份資料都有乙個對應的id值,這個值是依次遞增的...
Zookeeper 選舉機制
選舉訊息內容 fastleaderelection 選舉演算法介紹 伺服器id 編號。比如有三颱伺服器,編號分別是1,2,3。編號越大在選擇演算法中的權重越大。資料id。伺服器中存放的最大資料id。值越大說明資料越新,在選舉演算法中資料越新權重越大。邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,...
zookeeper選舉機制
在分布式系統中選主最直接或者傳統的方法是直接選定集群的乙個節點為 leader,其它的節點為 follower,這樣引入的乙個問題是如果 leader節點掛掉,整個集群就掛掉了。所以我們需要一種自動選主演算法,如果 leader節點掛掉,則從 follower節點中選出乙個主節點。選舉階段 lead...