1. 程式人生 > >Zookeeper之Leader選舉過程

Zookeeper之Leader選舉過程

Leader在叢集中是一個非常重要的角色,負責了整個事務的處理和排程,保證分散式資料一致性的關鍵所在。既然Leader在ZooKeeper叢集中這麼重要所以一定要保證叢集在任何時候都有且僅有一個Leader存在。

概念

Zookeeper Server三種角色:Leader,Follower,Observer。

Leader是Zookeeper 叢集工作機制的核心,主要工作:

  • a.排程者:叢集內部各個服務節點的排程者
  • b.事務請求:事務請求的唯一排程和處理者,保證叢集事務處理的順序性

Follower主要職責:

  • a.非事務請求:Follower 直接處理非事務請求,對於事務請求,轉發給 Leader
  • b.Proposal 投票:Leader 上執行事務時,需要 Follower 投票,Leader 才真正執行
  • c.Leader 選舉投票

Observer主要職責:

  • a.非事務請求:Follower 直接處理非事務請求,對於事務請求,轉發給 Leader

Observer 跟 Follower的區別:

  • a.Follower 參與投票:Leader 選舉、Proposal 提議投票(事務執行確認)
  • b.Observer 不參與投票:只用於提供非事務請求的處理

Zookeeper Server的狀態

  • LOOKING:尋找Leader
  • LEADING:Leader狀態,對應的節點為Leader。
  • FOLLOWING:Follower狀態,對應的節點為Follower。
  • OBSERVING:Observer狀態,對應節點為Observer,該節點不參與Leader選舉。

其它概念

  • ZXID(zookeeper transaction id):每個改變Zookeeper狀態的操作都會形成一個對應的zxid,並記錄到transaction log中。 這個值越大,表示更新越新
  • myid:伺服器SID,一個數字,通過配置檔案配置,唯一
  • SID:伺服器的唯一標識
  • 成為Leader的必要條件: Leader要具有最高的zxid;當叢集的規模是n時,叢集中大多數的機器(至少n/2+1)得到響應並follow選出的Leader。
  • 心跳機制:Leader與Follower利用PING來感知對方的是否存活,當Leader無法相應PING時,將重新發起Leader選舉。

選舉有兩種情況,一是伺服器啟動的投票,二是執行期間的投票。

伺服器啟動時期的Leader選舉

1.每個伺服器傳送一個投票(SID,ZXID)

其中sid是自己的myid,初始階段都將自己投為Leader。

2.接收來自其他伺服器的投票。

叢集的每個伺服器收到投票後,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態的伺服器。

3.處理投票

針對每個投票都按以下規則與自己的投票PK,PK後依據情況是否更新投票,再發送給其他機器。

  • a.優先檢查ZXID,ZXID較大者優先為Leader
  • b.如果ZXID相同,檢查SID,SID較大者優先為Leader

5.統計投票

每次投票後,伺服器統計所有投票,判斷是否有過半的機器收到相同的投票,如果某個投票達到一半的要求,則認為該投票提出者可以成為Leader。

6.改變伺服器狀態

一旦確定了Leader,每個伺服器都更新自己的狀態,Leader變更為Leading,Follower變更為Following
正常情況下一旦選出一個Leader則一直會保持,除非Leader伺服器宕掉,則再進行重新選舉。

伺服器執行時期的Leader選舉

1.變更狀態

當Leader宕機後,餘下的所非Observer的伺服器都會將自己的狀態變更為Looking,然後開啟新的Leader選舉流程。

2.每個伺服器發出一個投票。

生成(SID,ZXID)資訊,注意執行期間的ZXID可能是不同的,但是在投票時都會將自己投為Leader,然後傳送給其他的伺服器。

3.接收來自各個伺服器的投票

與啟動時過程相同

4.處理投票

與啟動時過程相同

5.統計投票

與啟動時過程相同

6.改變伺服器狀態

與啟動時過程相同

資料

  • Java問題收集
  • ZooKeeper 技術內幕:Leader 選舉