1. 程式人生 > >zookeeper選主過程(轉)

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) 改變伺服器的狀態。與啟動時過程相同。