我們做過solr集羣 也做過服務的分佈式部署。那麼肯定會接觸過zookeeper這個詞。乍一看我們好像知道它是什麼,但是仔細一回憶又好像什麼都不清楚。今天,我們來一起聊一下zookeeper。如果對你有幫助,可以點個關注,遇到代碼的bug,或者想要學習資料可以添加我的qq 1184905186
一、 ZooKeeper 簡介
顧名思義 zookeeper 就是動物園管理員,他是用來管 hadoop(大象)、Hive(蜜蜂)、pig(小 豬)的管理員, Apache Hbase 和 Apache Solr 的分佈式集羣都用到了 zookeeper;Zookeeper: 是一個分佈式的、開源的程序協調服務,是 hadoop 項目下的一個子項目。他提供的主要功 能包括:配置管理、名字服務、分佈式鎖、集羣管理。
二、 ZooKeeper 的作用
- 配置管理
在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都 是使用配置文件的方式,在代碼中引入這些配置文件。當我們只有一種配置,只有一臺服務 器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多, 有很多服務器都需要這個配置,這時使用配置文件就不是個好主意了。這個時候往往需要尋 找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的 都可以獲得變更。Zookeeper 就是這種服務,它使用 Zab 這種一致性協議來提供一致性。現 在有很多開源項目使用 Zookeeper 來維護配置,比如在 HBase 中,客戶端就是連接一個 Zookeeper,獲得必要的 HBase 集羣的配置信息,然後纔可以進一步操作。還有在開源的消 息隊列 Kafka 中,也使用 Zookeeper來維護broker的信息。在 Alibaba開源的 SOA 框架Dubbo 中也廣泛的使用 Zookeeper 管理一些配置來實現服務治理。
- 命名服務
命名服務是指通過指定的名字來獲取資源或者服務的地址,利用zk創建一個全局的路徑,即是唯一的路徑,這個路徑就可以作爲一個名字,指向集羣中的集羣,提供的服務的地址,或者一個遠程的對象等等。。
- 分佈式鎖
Zookeeper 是一個分佈式協調服務。我們就可以利 用 Zookeeper 來協調多個分佈式進程之間的活動。比如在一個分佈式環境中,爲了提高可靠 性,我們的集羣的每臺服務器上都部署着同樣的服務。但是,一件事情如果集羣中的每個服 務器都進行的話,那相互之間就要協調,編程起來將非常複雜。而如果我們只讓一個服務進 行操作,那又存在單點。通常還有一種做法就是使用分佈式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,立即 fail over 到另外的服務。這在很多分佈式系統 中都是這麼做,這種設計有一個更好聽的名字叫 Leader Election(leader 選舉)。比如 HBase 的 Master 就是採用這種機制。但要注意的是分佈式鎖跟同一個進程的鎖還是有區別的,所 以使用的時候要比同一個進程裏的鎖更謹慎的使用。
- 集羣管理
在分佈式的集羣中,經常會由於各種原因,比如硬件故障,軟件故障,網絡問題,有些 節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。這個時候,集羣中其他機 器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分佈式存儲系 統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集羣目 前的狀態來分配存儲節點。這個時候我們就需要動態感知到集羣目前的狀態。還有,比如一 個分佈式的 SOA 架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就需要採用 某種機制發現現在有哪些節點可以提供該服務(這也稱之爲服務發現,比如 Alibaba 開源的 SOA 框架 Dubbo 就採用了 Zookeeper 作爲服務發現的底層機制)。還有開源的 Kafka 隊列就 採用了 Zookeeper 作爲 Cosnumer 的上下線管理。
三、 Zookeeper 的存儲結構
- Znode
在 Zookeeper 中,znode 是一個跟 Unix 文件系統路徑相似的節點,可以往這個節點存儲 或獲取數據。 Zookeeper 底層是一套數據結構。這個存儲結構是一個樹形結構,其上的每一個節點, 我們稱之爲“znode” zookeeper 中的數據是按照“樹”結構進行存儲的。而且 znode 節點還分爲 4 中不同的類 型。 每一個 znode 默認能夠存儲 1MB 的數據(對於記錄狀態性質的數據來說,夠了) 可以使用 zkCli 命令,登錄到 zookeeper 上,並通過 ls、create、delete、get、set 等命令 操作這些 znode 節點
- Znode 節點類型
-
PERSISTENT 持久化節點: 所謂持久節點,是指在節點創建後,就一直存在,直到 有刪除操作來主動清除這個節點。否則不會因爲創建該節點的客戶端會話失效而消失。
-
PERSISTENT_SEQUENTIAL 持久順序節點:這類節點的基本特性和上面的節點類 型是一致的。額外的特性是,在 ZK 中,每個父節點會爲他的第一級子節點維護一份時序, 會記錄每個子節點創建的先後順序。基於這個特性,在創建子節點的時候,可以設置這個屬 性,那麼在創建節點過程中,ZK 會自動爲給定節點名加上一個數字後綴,作爲新的節點名。 這個數字後綴的範圍是整型的最大值。 在創建節點的時候只需要傳入節點 “/test_”,這樣 之後,zookeeper 自動會給”test_”後面補充數字。
-
EPHEMERAL 臨時節點:和持久節點不同的是,臨時節點的生命週期和客戶端會 話綁定。也就是說,如果客戶端會話失效,那麼這個節點就會自動被清除掉。注意,這裏提 到的是會話失效,而非連接斷開。另外,在臨時節點下面不能創建子節點。 這裏還要注意一件事,就是當你客戶端會話失效後,所產生的節點也不是一下子就消失 了,也要過一段時間,大概是 10 秒以內,可以試一下,本機操作生成節點,在服務器端用 命令來查看當前的節點數目,你會發現客戶端已經 stop,但是產生的節點還在。
-
EPHEMERAL_SEQUENTIAL 臨時自動編號節點:此節點是屬於臨時節點,不過帶 有順序,客戶端會話結束節點就消失。
四.Zookeeper工作原理
Zookeeper 的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和 leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。
五.zookeeper是如何保證事務的順序一致性的?
zookeeper採用了遞增的事務Id來標識,所有的proposal(提議)都在被提出的時候加上了zxid,zxid實際上是一個64位的數字,高32位是epoch(時期; 紀元; 世; 新時代)用來標識leader是否發生改變,如果有新的leader產生出來,epoch會自增,低32位用來遞增計數。當新產生proposal(提議)的時候,會依據數據庫的兩階段過程,首先會向其他的server發出事務執行請求,如果超過半數的機器都能執行並且能夠成功,那麼就會開始執行。
六.zookeeper是如何選取主leader的?
當leader崩潰或者leader失去大多數的follower,這時zk進入恢復模式,恢復模式需要重新選舉出一個新的leader,讓所有的Server都恢復到一個正確的狀態。Zk的選舉算法有兩種:一種是基於basic paxos實現的,另外一種是基於fast paxos算法實現的。系統默認的選舉算法爲fast paxos。
1、Zookeeper選主流程(basic paxos)
-
選舉線程由當前Server發起選舉的線程擔任,其主要功能是對投票結果進行統計,並選出推薦的Server;
-
選舉線程首先向所有Server發起一次詢問(包括自己);
-
選舉線程收到回覆後,驗證是否是自己發起的詢問(驗證zxid是否一致),然後獲取對方的id(myid),並存儲到當前詢問對象列表中,最後獲取對方提議的leader相關信息(id,zxid),並將這些信息存儲到當次選舉的投票記錄表中;
-
收到所有Server回覆以後,就計算出zxid最大的那個Server,並將這個Server相關信息設置成下一次要投票的Server;
-
線程將當前zxid最大的Server設置爲當前Server要推薦的Leader,如果此時獲勝的Server獲得n/2 + 1的Server票數,設置當前推薦的leader爲獲勝的Server,將根據獲勝的Server相關信息設置自己的狀態,否則,繼續這個過程,直到leader被選舉出來。通過流程分析我們可以得出:要使Leader獲得多數Server的支持,則Server總數必須是奇數2n+1,且存活的Server的數目不得少於n+1. 每個Server啓動後都會重複以上流程。在恢復模式下,如果是剛從崩潰狀態恢復的或者剛啓動的server還會從磁盤快照中恢復數據和會話信息,zk會記錄事務日誌並定期進行快照,方便在恢復時進行狀態恢復。
2、Zookeeper選主流程(basic paxos)
fast paxos流程是在選舉過程中,某Server首先向所有Server提議自己要成爲leader,當其它Server收到提議以後,解決epoch和 zxid的衝突,並接受對方的提議,然後向對方發送接受提議完成的消息,重複這個流程,最後一定能選舉出Leader。
歡迎點贊,關注。我的 qq是 : 1184905186