zookeeper簡介

目錄

 

zookeeper是什麼?

集羣角色

Leader

Follower

Observer

集羣組成

ZAB協議

Leader選舉


  • zookeeper是什麼?

zookeeper 是一個開源的分佈式協調服務,由雅虎公司創建,是google chubby 的開源實現。

zookeeper 是一個經典的分佈式數據一致性解決方案,致力於爲分佈式應用提供一個高性能、高可用,且具有嚴格順序訪問控制能力的分佈式協調服務。

分佈式應用程序可以基於zookeeper實現數據發佈與訂閱、負載均衡、命名服務、分佈式協調與通知、集羣管理、Leader選舉、分佈式鎖、分佈式隊列等功能。

  • 集羣角色

  • Leader

Leader 服務器是整個zookeeper 集羣的核心,它的主要工作有兩項:

1. 事物請求的唯一調度和處理者,保證集羣事物處理的順序性;

2. 集羣內部各服務器的調度者。

  • Follower

Follower角色的主要職責:

1. 處理客戶端非事物請求,轉發事務請求給leader服務器。

2. 參與事務請求Proposal (提案)的投票(需要半數以上服務器通過才能通知leader commit 數據,Proposal由Leader發起,Follower參與投票) 。

3. 參與Leader選舉的投票。

  • Observer

Observer充當觀察者角色,工作原理和Follower基本是一致的,和Follower唯一的區別是Observer不參與任何形式的投票,它只提供非事務讀請求服務,所以Observer可以在不影響寫性能的情況下提升集羣的讀性能。

  • 集羣組成

通常zookeeper是由2n+1臺server組成,每個server都知道彼此的存在。對於2n+1臺server,只要有n+1臺(大多數)可用,那麼整個系統保持可用。基於這個特性,如果搭建一個允許n臺機器down掉的集羣,需要部署2n+1臺機器的集羣。之所以要滿足這樣一個等式,是因爲在Leader選舉投票,以及事務請求投票的過程中,需要有超過半數(n+1)的投票支持。

  • ZAB協議

ZAB(Zookeeper Atomic Broadcast)是爲分佈式協調服務zookeeper專門設計的一種支持崩潰恢復的原子廣播協議。zookeeper主要依賴ZAB協議實現了分佈式數據的一致性。

ZAB協議包含兩種基本模式:

一. 恢復模式:

當整個集羣剛啓動時,或當leader節點掛掉時,ZK集羣會進入恢復模式並選舉新的leader。當leader選出後,且集羣中有超過半數的機器和該leader節點完成數據同步後,ZK集羣纔會退出恢復模式同時進入廣播模式。

二. 廣播模式:

ZK集羣在廣播模式下,當leader接收到事務型消息請求後,會實現以下過程:

1. leader會將消息賦予一個全局唯一的64位自增id : zxid,通過zxid的大小實現全局有序。

2. leader會爲每個follower準備一個FIFO隊列,將帶有zxid的消息作爲一個proposal(提案)分發給所有follower。

3. follower接收到proposal後,先把proposal寫到磁盤,寫入成功後會回覆leader一個ack。

4. 當leader接收到超過半數的ack之後,leader會向這些follower發送commit命令,同時在本地執行此消息。

5. follower接收到commit命令後,會提交該消息。

  • Leader選舉

Leader選舉分爲兩種:集羣啓動時選舉leader, leader崩潰時選舉新leader。

一. 集羣啓動時選舉

以三臺機器組成的集羣爲例,每個節點啓動時狀態都是LOOKING觀望狀態,當只有一臺機器server1 啓動時是無法進行leader選舉的,當第二臺機器server2 啓動後,兩臺機器可以互相通信,選舉投票需要參考三個參數:

myid:每臺機器配置的唯一id;

zxid:事務消息id(遞增);

epoch:如果將leader比喻爲皇帝,那epoch就代表朝代,每次選舉leader就要改朝換代,epoch+1。

選舉過程如下:

1. 每個server發出一個投票,每次投票會包含所推舉的服務器的myid、zxid、epoch,初始情況server都會將自己視爲leader。此時server1的投票(1,0),server2的投票(2,0)。

2. 檢查投票。集羣的每個server都會收到其他server的投票,收到投票後,首先檢查投票的有效性,例如檢查是否來自LOOKING狀態的server,檢查是否是本輪投票epoch。

3. 處理投票。優先檢查zxid(zxid最大的一般爲擁有最新消息的),zxid較大的優先作爲leader,如果zxid相同,比較myid,較大的作爲leader。此時server1會將自己的投票更新爲(1,0)。

4. 統計投票。看是否有超過半數的相同投票信息,本次投票中,server2被選舉爲leader。

5. 改變服務器狀態。leader更新爲leading,follower更新爲following。

二. 運行過程中的選舉

當集羣運行中leader掛掉,將進行新一輪leader選舉:

1. 更新服務器狀態,leader掛掉後,follower會更新爲LOOKING狀態。

2. 後面的過程與啓動時相同。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章