目錄
-
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. 後面的過程與啓動時相同。