zookeeper選主過程(轉)
大致為:
假如一共五臺機器
A B C D E分別的id為
1 2 3 4 5
啟動了A時,A投給自己一票。A總票數1,未滿足一半以上,機器狀態looking
又啟動了C時, A投給C一票,C投給自己一票。A票數為0,C票數為2,未滿足一半以上,機器狀態looking
又啟動了D,A投給D一票,C投給D一票,D投給自己一票。A票數為0,C票數為0,D票數為3,,滿足一半以上,D為leader,A、C為follower
又啟動了E,由於已經產生了leader,所以E自動為follower
已大致瞭解,作用不大,以下內容未看
轉自:https://blog.csdn.net/chengyuqiang/article/details/79190061
Leader選舉是保證分散式資料一致性的關鍵所在。Leader選舉分為Zookeeper叢集初始化啟動時選舉和Zookeeper叢集執行期間Leader重新選舉兩種情況。在講解Leader選舉前先了解一下Zookeeper節點4種可能狀態和事務ID概念。
1、Zookeeper節點狀態
LOOKING:尋找Leader狀態,處於該狀態需要進入選舉流程
LEADING:領導者狀態,處於該狀態的節點說明是角色已經是Leader
FOLLOWING:跟隨者狀態,表示Leader已經選舉出來,當前節點角色是follower
OBSERVER:觀察者狀態,表明當前節點角色是observer
角色:
leader:領導者負責投票的發起和決議,更新系統狀態
learner:
follower:用於接受客戶端請求並向客戶返回結果,在軒主過程中參與投票
observer:可以接受客戶端的連線,將寫請求轉發給leader節點。但observer不參與投票過程,值同步leader的狀態。observer的目的是為了擴充套件系統,提高讀寫速度
client:請求發起者
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) 改變伺服器的狀態。與啟動時過程相同。