Leader選舉是保證分布式數據一致性的關鍵所在。Leader選舉分為Zookeeper集群初始化啟動時選舉和Zookeeper集群運行期間Leader重新選舉兩種情況。在講解Leader選舉前先了解一下Zookeeper節點4種可能狀態和事務ID概念。
1、Zookeeper節點狀態
- LOOKING:尋找Leader狀態,處於該狀態需要進入選舉流程
- LEADING:領導者狀態,處於該狀態的節點說明是角色已經是Leader
- FOLLOWING:跟隨者狀態,表示Leader已經選舉出來,當前節點角色是follower
- OBSERVER:觀察者狀態,表明當前節點角色是observer
2、事務ID
ZooKeeper狀態的每次變化都接收一個ZXID(ZooKeeper事務id)形式的標記。ZXID是一個64位的數字,由Leader統一分配,全局唯一,不斷遞增。
ZXID展示了所有的ZooKeeper的變更順序。每次變更會有一個唯一的zxid,如果zxid1小於zxid2說明zxid1在zxid2之前發生。
3、Zookeeper集群初始化啟動時Leader選舉
若進行Leader選舉,則至少需要兩台機器,這里選取3台機器組成的服務器集群為例。
初始化啟動期間Leader選舉流程如下圖所示。
在集群初始化階段,當有一台服務器ZK1啟動時,其單獨無法進行和完成Leader選舉,當第二台服務器ZK2啟動時,此時兩台機器可以相互通信,每台機器都試圖找到Leader,於是進入Leader選舉過程。選舉過程開始,過程如下:
(1) 每個Server發出一個投票。由於是初始情況,ZK1和ZK2都會將自己作為Leader服務器來進行投票,每次投票會包含所推舉的服務器的myid和ZXID,使用(myid, ZXID)來表示,此時ZK1的投票為(1, 0),ZK2的投票為(2, 0),然后各自將這個投票發給集群中其他機器。
(2) 接受來自各個服務器的投票。集群的每個服務器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態的服務器。
(3) 處理投票。針對每一個投票,服務器都需要將別人的投票和自己的投票進行比較,規則如下
· 優先檢查ZXID。ZXID比較大的服務器優先作為Leader。
· 如果ZXID相同,那么就比較myid。myid較大的服務器作為Leader服務器。
對於ZK1而言,它的投票是(1, 0),接收ZK2的投票為(2, 0),首先會比較兩者的ZXID,均為0,再比較myid,此時ZK2的myid最大,於是ZK2勝。ZK1更新自己的投票為(2, 0),並將投票重新發送給ZK2。
(4) 統計投票。每次投票后,服務器都會統計投票信息,判斷是否已經有過半機器接受到相同的投票信息,對於ZK1、ZK2而言,都統計出集群中已經有兩台機器接受了(2, 0)的投票信息,此時便認為已經選出ZK2作為Leader。
(5) 改變服務器狀態。一旦確定了Leader,每個服務器就會更新自己的狀態,如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為LEADING。當新的Zookeeper節點ZK3啟動時,發現已經有Leader了,不再選舉,直接將直接的狀態從LOOKING改為FOLLOWING。
4、Zookeeper集群運行期間Leader重新選
在Zookeeper運行期間,如果Leader節點掛了,那么整個Zookeeper集群將暫停對外服務,進入新一輪Leader選舉。
假設正在運行的有ZK1、ZK2、ZK3三台服務器,當前Leader是ZK2,若某一時刻Leader掛了,此時便開始Leader選舉。選舉過程如下圖所示。
(1) 變更狀態。Leader掛后,余下的非Observer服務器都會講自己的服務器狀態變更為LOOKING,然后開始進入Leader選舉過程。
(2) 每個Server會發出一個投票。在運行期間,每個服務器上的ZXID可能不同,此時假定ZK1的ZXID為124,ZK3的ZXID為123;在第一輪投票中,ZK1和ZK3都會投自己,產生投票(1, 124),(3, 123),然后各自將投票發送給集群中所有機器。
(3) 接收來自各個服務器的投票。與啟動時過程相同。
(4) 處理投票。與啟動時過程相同,由於ZK1事務ID大,ZK1將會成為Leader。
(5) 統計投票。與啟動時過程相同。
(6) 改變服務器的狀態。與啟動時過程相同。
轉自
簡單理解Zookeeper的Leader選舉 - CSDN博客 https://blog.csdn.net/chengyuqiang/article/details/79190061
參考
理解zookeeper選舉機制 - min.jiang - 博客園 https://www.cnblogs.com/ASPNET2008/p/6421571.html