天天看點

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!

作者:Java小蟲

本系列為SpringCloud微服務系列,上一期分享了 圖解Nginx,系統架構演變 + Nginx反向代理與負載均衡,今天分享ZooKeeper,讀哪吒程式設計,品技術人生。

一、ZooKeeper是什麼?

1、開源的分布式協調服務

使用分布式系統就無法避免對節點管理的問題(需要實時感覺節點的狀态、對節點進行統一管理等等),而由于這些問題處理起來可能相對麻煩和提高了系統的複雜性,ZooKeeper作為一個能夠通用解決這些問題的中間件就應運而生了。

2、從設計模式角度來了解

ZooKeeper是一個基于觀察者模式設計的分布式服務管理架構,它負責存儲和管理大家都關心的資料,一旦這些資料的狀态發生變化,Zookeeper 就将負責通知已經在Zookeeper上注冊的那些觀察者做出相應的反應。

3、實作原理

zookeeper = 檔案系統 + 通知機制。

二、Zookeeper的作用

1、統一配置管理

比如現在有A.yml,B.yml,C.yml配置檔案,裡面有一些公共的配置,但是如果後期對這些公共的配置進行修改,就需要修改每一個檔案,還要重新開機伺服器,比較麻煩。

現在将這些公共配置資訊放到Zookeeper中,修改Zookeeper的資訊,會通知A,B,C配置檔案,很友善。

2、統一命名服務

這個的了解其實跟域名一樣,在某一個節點下放一些ip位址,我現在隻需要通路Zookeeper的一個Znode節點就可以擷取這些ip位址。

3、同一叢集管理

分布式叢集中狀态的監控和管理,使用Zookeeper來存儲。

4、分布式協調

這個是我們最常用的,比如把多個服務提供者的資訊放在某個節點上,服務的消費者就可以通過ZK調用。

服務節點動态上下線

如果提供者當機,就會删除在Zookeeper的節點,然後Zookeeper通知給消費者。

5、軟負載均衡

6、動态選舉Master

Zookeeper會每次選舉最小編号的作為Master,如果Master挂了,自然對應的Znode節點就會删除。然後讓新的最小編号作為Master,這樣就可以實作動态選舉的功能了。

三、Zookeeper檔案系統

ZooKeeper的資料結構,跟Unix檔案系統非常類似,可以看做是一顆樹,每個節點叫做Znode,每一個Znode隻能存1MB資料,資料隻是配置資訊。

每一個節點可以通過路徑來辨別,結構圖如下:

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!

節點主要有4種類型:

1、臨時目錄節點:用戶端與Zookeeper斷開連接配接後,該節點被删除;

2、臨時順序編号目錄節點:基本特性同臨時節點,隻是增加了順序屬性,節點名後邊會追加一個由父節點維護的自增整型數字;

3、持久化目錄節點:用戶端與Zookeeper斷開連接配接後,該節點依舊存在;

4、持久化順序編号目錄節點:基本特性同持久節點,隻是增加了順序屬性,節點名後邊會追加一個由父節點維護的自增整型數字;

四、通知機制 (監聽機制)

Zookeeper可以提供分布式資料的釋出/訂閱功能,依賴的就是Wather監聽機制。

1、具體步如下:

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!

(1)用戶端向服務端注冊Wather監聽;

(2)儲存Wather對象到用戶端本地的WatherManager中;

(3)服務端Wather事件觸發後,用戶端收到服務端通知,從WatherManager(watcher管理器)中取出對應Wather對象執行回調邏輯;

2、主要監聽2方面内容:

(1)監聽Znode節點的資料變化:就是那個節點資訊更新了;

(2)監聽子節點的增減變化:就是增加了一個Znode或者删除了一個Znode;

五、Zookeeper特性

1、一次性:一旦一個Wather觸發之後,Zookeeper就會将它從存儲中移除

2、用戶端串行:用戶端的Wather回調處理是串行同步的過程,不要因為一個Wather的邏輯阻塞整個用戶端

3、輕量:Wather通知的機關是WathedEvent,隻包含通知狀态、事件類型和節點路徑,不包含具體的事件内容,具體的時間内容需要用戶端主動去重新擷取資料

六、Zookeeper叢集

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!
  • Leader:負責寫資料。(寫資料都有事務);
  • Follower:負責讀資料,節點的選舉和過半寫成功。(讀資料沒有事務);
  • Observer:隻負責讀;

從上面的角色種,我們可以總結Zookeeper節點的工作狀态(服務狀态)

  • LOOKING:尋 找 Leader 狀态。當伺服器處于該狀态時,它會認為目前叢集中沒有 Leader,是以需要進入 Leader 選舉狀态;
  • FOLLOWING:跟随者狀态。表明目前伺服器角色是 Follower;
  • LEADING:上司者狀态。表明目前伺服器角色是 Leader;
  • OBSERVING:觀察者狀态。表明目前伺服器角色是 Observer;

zxid:全局事務ID,分為兩部分:

(1)紀元(epoch)部分:epoch代表目前叢集所屬的哪個leader,leader的選舉就類似一個朝代的更替,你前朝的劍不能斬本朝的官,用epoch代表目前指令的有效性。

(2)計數器(counter)部分,是一個全局有序的數字,是一個遞增的數字。

七、寫資料原理

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!
圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!

1、寫給leader,leader再通知其他節點;

2、寫給follower,follower沒有寫的權限,交給leader寫,leader再通知;

3、半數機制:比如上圖,zookeeper在通知其他節點寫的時候,達到半數就通知用戶端寫完成。不需要全部寫完成。是以叢集的數量一般是奇數;

八、Zookeeper怎麼保證資料一緻性?

由于Zookeeper隻有Leader節點可以寫入資料,如果是其他節點收到寫入資料的請求,則會将之轉發給Leader節點。

Zookeeper通過ZAB協定來實作資料的最終順序一緻性,他是一個類似2PC兩階段送出的過程。ZAB有2種模式:消息廣播,崩潰恢複(選舉)。

一般我們正常是消息廣播:

圖解ZooKeeper,注冊中心、負載均衡、通知機制、叢集、寫原理!

第一階段:廣播事務階段

1、Leader收到請求之後,将它轉換為一個proposal提議,并且為每個提議配置設定一個事務ID:zxid;

2、然後把提議放入到一個FIFO的隊列中,按照FIFO的政策發送給所有的Follower;

3、Follower收到提議之後,以事務日志的形式寫入到本地磁盤中,寫入成功後傳回ACK給Leader;

第二階段:廣播送出操作

Leader在收到超過半數的Follower的ACK之後,即可認為資料寫入成功,就會發送commit指令給Follower告訴他們可以送出proposal了。

感謝大家的支援和轉發!

繼續閱讀