在分布式系統中選主最直接或者傳統的方法是直接選定集群的乙個節點為 leader,其它的節點為 follower,這樣引入的乙個問題是如果 leader節點掛掉,整個集群就掛掉了。所以我們需要一種自動選主演算法,如果 leader節點掛掉,則從 follower節點中選出乙個主節點。
選舉階段 leader election
最大 zxid也就是節點本地的最新事務編號,包含 epoch和 計數兩部分。epoch是紀元的意思,相當於 raft演算法選主時候的 term,標識當前 leader週期,每次選舉乙個新的 leader伺服器後,會生成乙個新的 epoch
所有節點處於looking狀態,各自依次發起投票,投票包含自己的伺服器id和最新事務id( zxid)。
如果發現別人的 zxid比自己大,也就是資料比自己新,那麼就重新發起投票,投票給目前已知最大的 zxid所屬節點。
每次投票後,伺服器都會統計投票數量,判斷是否有某個節點得到半數以上的投票。如果存在這樣的節點,該節點將會成為準 leader,狀態變為 leading。其他節點的狀態變為following。
發現階段 discovery
為了防止某些意外情況,比如因網路原因在上一階段產生多個 leader的情況。
leader集思廣益,接收所有 follower發來各自的最新 epoch值。 leader從中選出最大的 epoch,基於此值加1,生成新的 epoch分發給各個 follower。
各個 follower收到全新的 epoch後,返回 ack給 leader,帶上各自最大的 zxid和歷史事務日誌。 leader選出最大的 zxid,並更新自身歷史日誌。
同步階段 synchronization
leader剛才收集得到的最新歷史事務日誌,同步給集群中所有的 follower。只有當半數 follower同步成功,這個準 leader才能成為正式的 leader。
1、serverid:伺服器id
比如有三颱伺服器,編號分別是1,2,3。
編號越大在選擇演算法中的權重越大。
2、zxid:資料id
伺服器中存放的最大資料id.
值越大說明資料越新,在選舉演算法中資料越新權重越大。
3、epoch:邏輯時鐘
或者叫投票的次數,同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加,然後與接收到的其它伺服器返回的投票資訊中的數值相比,根據不同的值做出不同的判斷。
4、server狀態:選舉狀態
在投票完成後,需要將投票資訊傳送給集群中的所有伺服器,它包含如下內容。
zookeeper選舉機制
fastleaderelection演算法通過非同步的通訊方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快leader的選舉程序。每個在zookeeper伺服器啟動先讀取當前儲存在磁碟的資料,zookeeper中的每份資料都有乙個對應的id值,這個值是依次遞增的...
Zookeeper 選舉機制
選舉訊息內容 fastleaderelection 選舉演算法介紹 伺服器id 編號。比如有三颱伺服器,編號分別是1,2,3。編號越大在選擇演算法中的權重越大。資料id。伺服器中存放的最大資料id。值越大說明資料越新,在選舉演算法中資料越新權重越大。邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,...
Zookeeper集群選舉機制
zookeeper預設的演算法是fastleaderelection,採用投票數大於半數則勝出的邏輯。選舉依據 伺服器id 比如有3臺伺服器,編號分別為 1,2,3。編號越大,在選舉演算法中的權重越大。選舉狀態 looking,競選狀態。following,隨從狀態。同步leader狀態,參與投票。...