天天看點

ZooKeeper 簡介和使用場景

一、前言

ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實作,是Hadoop和Hbase的重要元件。它是一個為分布式應用提供一緻性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等(來源于百度百科)。

二、使用場景

  • 分布式配置中心(disconf)

    Distributed Configuration Management Platform(分布式配置管理平台) ,它是專注于各種分布式系統配置管理 的通用元件/通用平台, 提供統一的配置管理服務,是一套完整的基于zookeeper的分布式配置統一解決方案。

    流程如下圖所示

    ZooKeeper 簡介和使用場景

    啟動事件A: 以下按順序發生。

    A3:掃描靜态注解類資料,并注入到配置倉庫裡。

    A4+A2:根據倉庫裡的配置檔案、配置項,去 disconf-web 平台裡下載下傳配置資料。這裡會有主備競争

    A5:将下載下傳得到的配置資料值注入到倉庫裡。

    A6:根據倉庫裡的配置檔案、配置項,去ZK上監控節點。

    A7+A2:根據XML配置定義,到 disconf-web 平台裡下載下傳配置檔案,放在倉庫裡,并監控ZK節點。這裡會有主備競争。

    A8:A1-A6均是處理靜态類資料。A7是處理動态類資料,包括:執行個體化配置的回調函數類;将配置的值注入到配置實體裡。

    更新配置事件B: 以下按順序發生。

    B1:管理者在 Disconf-web 平台上更新配置。

    B2:Disconf-web 平台發送配置更新消息給ZK指定的節點。

    B3:ZK通知 Disconf-cient 子產品。

    B4:與A4一樣。

    B5:與A5一樣。

    B6:基本與A4一樣,唯一的差別是,這裡還會将配置的新值注入到配置實體裡。

    主備機切換事件C: 以下按順序發生。

    C1:發生主機挂機事件。

    C2:ZK通知所有被影響到的備機。

    C4:與A2一樣。

    C5:與A4一樣。

    C6:與A5一樣。

    C7:與A6一樣。

    由以上流程可知,zookeeper在disconf中的主要作用是,存儲資料和提供資料變更通知(watch機制)及挂機通知(臨時節點特性)。

  • 服務注冊與發現(dubbo)

    Dubbo是阿裡巴巴公司開源的一個高性能優秀的服務架構,使得應用可通過高性能的 RPC 實作服務的輸出和輸入功能,可以和Spring架構無縫內建。

    ZooKeeper 簡介和使用場景

    Provider 暴露服務的服務提供方

    Consumer 調用遠端服務的服務消費方

    Registry 服務注冊與發現的注冊中心

    Monitor 統計服務的調用次數和調用時間的監控中心

    Container 服務運作容器

    Dubbo目前支援4種注冊中心,(multicast zookeeper redis simple)推薦使用Zookeeper注冊中心。

    zookeeper在dubbo中的作用主要是服務注冊和發現,Consumer在啟動時向Registry訂閱需要的服務擷取Provider清單,根據配置的服務調用政策選擇合适的Provider通路。同時,如果Provider掉線,臨時節點被删除,Registry會通知Consumer更新服務清單。這裡用的是zookeeper的臨時節點特性和watch機制。

  • 服務協調(kafka)

    Kafka是由Apache軟體基金會開發的一個開源流處理平台,由Scala和Java編寫。Kafka是一種高吞吐量的分布式釋出訂閱消息系統,它可以處理消費者在網站中的所有動作流資料。

    Kafka 叢集中有一個 broker 會被選舉為 Controller,負責管理叢集 broker 的上下線,所有 topic 的分區副本配置設定和 leader 選舉等工作。Controller 的管理工作都是依賴于 Zookeeper 的。

Zookeeper在Kafka叢集中主要用于協調管理,主要作用:

  1. Kafka将中繼資料資訊(broker,topic,partition)儲存在Zookeeper中
  2. 通過Zookeeper的協調管理來實作整個kafka叢集的動态擴充
  3. 實作整個叢集的負載均衡
  4. Producer通過 Zookeeper 感覺 partition 的Leader
  5. 儲存Consumer消費的狀态資訊
  6. 通過 Zookeeper管理叢集配置,選舉 Kafka Leader,以及在 Consumer Group 發生變化時進行 Rebalance

同樣也是用了臨時節點特性、watch機制還有選舉

  • 分布式鎖

    什麼是分布式鎖?

    應用分布式部署,不同程序的線程對同一資源改變,需要保證先後順序。在同一個程序中,我們可以通過ReentrantLock和synchronized鎖住資源,在不同程序中,線程級的鎖已經失效。

分布式鎖需要保證公平可重入,Zookeeper的臨時順序節點,是實作分布式鎖的好苗子。原因如下:

  • ZooKeeper的每一個節點,都是一個天然的順序發号器。
  • ZooKeeper節點的遞增有序性,可以確定鎖的公平
  • ZooKeeper的節點監聽機制,可以保障占有鎖的傳遞有序而且高效
  • ZooKeeper的節點監聽機制,能避免羊群效應

    如下圖所示

    ZooKeeper 簡介和使用場景

也是用了臨時順序節點特性、watch機制

後續

本篇介紹了zookeeper的基本使用場景,後續文章将着重分析下zookeeper的源碼、各種節點的原理和watch機制的實作。

繼續閱讀