Zookeeper小解

       我們做過solr集羣 也做過服務的分佈式部署。那麼肯定會接觸過zookeeper這個詞。乍一看我們好像知道它是什麼,但是仔細一回憶又好像什麼都不清楚。今天,我們來一起聊一下zookeeper。如果對你有幫助,可以點個關注,遇到代碼的bug,或者想要學習資料可以添加我的qq 1184905186

一、 ZooKeeper 簡介

顧名思義 zookeeper 就是動物園管理員,他是用來管 hadoop(大象)、Hive(蜜蜂)、pig(小 豬)的管理員, Apache Hbase 和 Apache Solr 的分佈式集羣都用到了 zookeeper;Zookeeper: 是一個分佈式的、開源的程序協調服務,是 hadoop 項目下的一個子項目。他提供的主要功 能包括:配置管理、名字服務、分佈式鎖、集羣管理。

二、 ZooKeeper 的作用
  1. 配置管理

       在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都 是使用配置文件的方式,在代碼中引入這些配置文件。當我們只有一種配置,只有一臺服務 器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多, 有很多服務器都需要這個配置,這時使用配置文件就不是個好主意了。這個時候往往需要尋 找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的 都可以獲得變更。Zookeeper 就是這種服務,它使用 Zab 這種一致性協議來提供一致性。現 在有很多開源項目使用 Zookeeper 來維護配置,比如在 HBase 中,客戶端就是連接一個 Zookeeper,獲得必要的 HBase 集羣的配置信息,然後纔可以進一步操作。還有在開源的消 息隊列 Kafka 中,也使用 Zookeeper來維護broker的信息。在 Alibaba開源的 SOA 框架Dubbo 中也廣泛的使用 Zookeeper 管理一些配置來實現服務治理。

  1. 命名服務

       命名服務是指通過指定的名字來獲取資源或者服務的地址,利用zk創建一個全局的路徑,即是唯一的路徑,這個路徑就可以作爲一個名字,指向集羣中的集羣,提供的服務的地址,或者一個遠程的對象等等。。

  1. 分佈式鎖

       Zookeeper 是一個分佈式協調服務。我們就可以利 用 Zookeeper 來協調多個分佈式進程之間的活動。比如在一個分佈式環境中,爲了提高可靠 性,我們的集羣的每臺服務器上都部署着同樣的服務。但是,一件事情如果集羣中的每個服 務器都進行的話,那相互之間就要協調,編程起來將非常複雜。而如果我們只讓一個服務進 行操作,那又存在單點。通常還有一種做法就是使用分佈式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,立即 fail over 到另外的服務。這在很多分佈式系統 中都是這麼做,這種設計有一個更好聽的名字叫 Leader Election(leader 選舉)。比如 HBase 的 Master 就是採用這種機制。但要注意的是分佈式鎖跟同一個進程的鎖還是有區別的,所 以使用的時候要比同一個進程裏的鎖更謹慎的使用。

  1. 集羣管理

       在分佈式的集羣中,經常會由於各種原因,比如硬件故障,軟件故障,網絡問題,有些 節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。這個時候,集羣中其他機 器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分佈式存儲系 統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集羣目 前的狀態來分配存儲節點。這個時候我們就需要動態感知到集羣目前的狀態。還有,比如一 個分佈式的 SOA 架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就需要採用 某種機制發現現在有哪些節點可以提供該服務(這也稱之爲服務發現,比如 Alibaba 開源的 SOA 框架 Dubbo 就採用了 Zookeeper 作爲服務發現的底層機制)。還有開源的 Kafka 隊列就 採用了 Zookeeper 作爲 Cosnumer 的上下線管理。

在這裏插入圖片描述

三、 Zookeeper 的存儲結構

在這裏插入圖片描述

  1. Znode

       在 Zookeeper 中,znode 是一個跟 Unix 文件系統路徑相似的節點,可以往這個節點存儲 或獲取數據。 Zookeeper 底層是一套數據結構。這個存儲結構是一個樹形結構,其上的每一個節點, 我們稱之爲“znode” zookeeper 中的數據是按照“樹”結構進行存儲的。而且 znode 節點還分爲 4 中不同的類 型。 每一個 znode 默認能夠存儲 1MB 的數據(對於記錄狀態性質的數據來說,夠了) 可以使用 zkCli 命令,登錄到 zookeeper 上,並通過 ls、create、delete、get、set 等命令 操作這些 znode 節點

  1. 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)
  1. 選舉線程由當前Server發起選舉的線程擔任,其主要功能是對投票結果進行統計,並選出推薦的Server;

  2. 選舉線程首先向所有Server發起一次詢問(包括自己);

  3. 選舉線程收到回覆後,驗證是否是自己發起的詢問(驗證zxid是否一致),然後獲取對方的id(myid),並存儲到當前詢問對象列表中,最後獲取對方提議的leader相關信息(id,zxid),並將這些信息存儲到當次選舉的投票記錄表中;

  4. 收到所有Server回覆以後,就計算出zxid最大的那個Server,並將這個Server相關信息設置成下一次要投票的Server;

  5. 線程將當前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
在這裏插入圖片描述

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