一、Zookeeper節點狀態
LOOKING:尋找Leader狀態,處於該狀態須要進入選舉流程
LEADING:領導者狀態,處於該狀態的節點說明是角色已是Leader
FOLLOWING:跟隨者狀態,表示Leader已經選舉出來,當前節點角色是follower
OBSERVER:觀察者狀態,代表當前節點角色是observer(不參與投票)面試
二、事務ID
ZooKeeper狀態的每次變化都接收一個ZXID(ZooKeeper事務id)形式的標記。ZXID是一個64位的數字,由Leader統一分配,全局惟一,不斷遞增。 ZXID展現了全部的ZooKeeper的變動順序。每次變動會有一個惟一的zxid,若是zxid1小於zxid2說明zxid1在zxid2以前發生。服務器
三、Zookeeper集羣初始化啓動時Leader選舉若進行Leader選舉,則至少須要兩臺機器,這裏選取3臺機器組成的服務器集羣爲例。 初始化啓動期間Leader選舉流程以下圖所示。spa
在集羣初始化階段,當有一臺服務器ZK1啓動時,其單獨沒法進行和完成Leader選舉,當第二臺服務器ZK2啓動時,此時兩臺機器能夠相互通訊,每臺機器都試圖找到Leader,因而進入Leader選舉過程。選舉過程開始,過程以下:3d
(1) 每一個Server發出一個投票。因爲是初始狀況,ZK1和ZK2都會將本身做爲Leader服務器來進行投票,每次投票會包含所推舉的服務器的myid和ZXID,使用(myid, ZXID)來表示,此時ZK1的投票爲(1, 0),ZK2的投票爲(2, 0),而後各自將這個投票發給集羣中其餘機器。 server
(2) 接受來自各個服務器的投票。集羣的每一個服務器收到投票後,首先判斷該投票的有效性,如檢查是不是本輪投票、是否來自LOOKING狀態的服務器。 blog
(3) 處理投票。針對每個投票,服務器都須要將別人的投票和本身的投票進行比較,規則以下 事務
· 優先檢查ZXID。ZXID比較大的服務器優先做爲Leader。 class
· 若是ZXID相同,那麼就比較myid。myid較大的服務器做爲Leader服務器。 集羣
對於ZK1而言,它的投票是(1, 0),接收ZK2的投票爲(2, 0),首先會比較二者的ZXID,均爲0,再比較myid,此時ZK2的myid最大,因而ZK2勝。ZK1更新本身的投票爲(2, 0),並將投票從新發送給ZK2。 zookeeper
(4) 統計投票。每次投票後,服務器都會統計投票信息,判斷是否已經有過半機器接受到相同的投票信息,對於ZK一、ZK2而言,都統計出集羣中已經有兩臺機器接受了(2, 0)的投票信息,此時便認爲已經選出ZK2做爲Leader。
(5) 改變服務器狀態。一旦肯定了Leader,每一個服務器就會更新本身的狀態,若是是Follower,那麼就變動爲FOLLOWING,若是是Leader,就變動爲LEADING。當新的Zookeeper節點ZK3啓動時,發現已經有Leader了,再也不選舉,直接將直接的狀態從LOOKING改成FOLLOWING。
四、Zookeeper集羣運行期間Leader從新選在Zookeeper運行期間,若是Leader節點掛了,那麼整個Zookeeper集羣將暫停對外服務,進入新一輪Leader選舉。 假設正在運行的有ZK一、ZK二、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) 改變服務器的狀態。與啓動時過程相同。
華爲面試題:
舉例,初始狀況下5臺機器,sid分別爲一、二、三、四、5,邏輯時鐘都是0。依次啓動後,開始選舉,全部的機器邏輯時鐘自增爲1。通過屢次投票,假設第三臺機器爲leader,其餘4臺機器爲follower,此時5臺機器的邏輯時鐘都爲1。
通常狀況下,邏輯時鐘應該都是相同的。可是,因爲一些機器崩潰的問題,是可能出現邏輯時鐘不一致的狀況的。例如,上例中,sid=3的機器爲leader。以後某一刻,sid爲一、3的機器崩潰,zookeeper仍然能夠正常對外提供服務。但須要從新選主,剩下的二、四、5從新投票選主,假設sid=5成爲新的leader,邏輯時鐘自增,由1變成2。以後某一刻,sid爲5的機器奔潰,sid爲1的機器復活,仍然有3臺機器運行,zookeeper能夠對外提供服務,但須要從新選主。從新選主,邏輯時鐘自增,這時sid爲二、4的機器的邏輯時鐘是由2自增爲3,而sid爲1的機器的邏輯時鐘是由1自增爲2。這種狀況下,就出現了邏輯時鐘不一致的狀況。這時,須要清除sid爲1的機器內部的投票數據,由於這些投票數據都是過期的數據。