ZooKeeper | 安裝部署、應用場景、開發對接API

當設計一個分佈式系統或微服務架構系統時,通常須要設計和開發一些協調服務。Apache ZooKeeper是一個分佈式、開源的分佈式應用協調服務,也可理解成一個爲分佈式應用提供一致性服務的應用程序,主要做用可簡化分佈式系統搭建及縮短開發週期。ZooKeeper是目前經常使用的開源解決方案之一。html


本文主要針對ZooKeeper的安裝部署、應用場景、開發對接API等,做簡單入門級整理介紹,方便開發人員後續深刻研究。node


ZooKeeper是什麼?


ZooKeeper 做爲一個分佈式的服務框架,主要用來解決分佈式集羣中應用系統的一致性問題。提供基於相似於文件系統的目錄節點樹方式的數據存儲,ZooKeeper的做用主要是用來維護和監控存儲的數據的狀態變化。經過監控這些數據狀態的變化,從而能夠達到基於數據的集羣管理。git


  • ZooKeeper 雖然是一個針對分佈式系統的協調服務,但它自己也是一個分佈式應用程序。ZooKeeper 遵循一個簡單的客戶端-服務器模型。github

1.png

▲ ZooKeeper 的客戶端-服務器架構apache


  • ZooKeeper 有一個相似於文件系統的數據模型,由 znodes 組成。設計模式

  • 每一個 ZooKeeper 服務器還在磁盤上維護了一個事務日誌,記錄全部的寫入請求。服務器

  • 在啓動 ZooKeeper 服務時,集合體中的某個節點被選舉爲領導者;節點數量應該是奇數。session


Zookeeper 從設計模式角度來看,是一個基於觀察者模式設計的分佈式服務管理框架,它負責存儲和管理分佈式應用系統關心的數據,而後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經註冊的那些觀察者作出相應的反應,從而實現集羣中相似 Master/Slave 管理模式。架構


常見應用場景


ZooKeeper 是一個面向分佈式系統的構建模塊,下面是當設計一個分佈式系統時,典型的業務應用場景。框架


01 統一命名服務(Name Service)


命名服務是將一個名稱映射到與該命名有關聯的一些信息的服務。Name Service 已是 Zookeeper 內置的功能,只要調用 Zookeeper 的 API 就能實現。如調用 create 接口就能夠很容易建立一個目錄節點。


02 配置管理(Configuration Management)


配置的管理在分佈式應用環境中很常見,可使用 ZooKeeper 集中存儲和管理分佈式系統的配置。同時還容許經過其中一個 ZooKeeper 客戶端更改集中式配置,集中地更改分佈式系統的狀態。


2.png


03 集羣管理(Group Membership)

Zookeeper 可以很容易的實現集羣管理的功能,若有多臺 Server 組成一個服務集羣,那麼必需要一個「領導者」知道當前集羣中每臺機器的服務狀態,一旦有機器不能提供服務,集羣中其它集羣必須知道,從而作出調整從新分配服務策略。

3.png


04 共享鎖(Locks)

爲了容許在分佈式系統中對共享資源進行有序的訪問,可能須要實現分佈式互斥。ZooKeeper 提供一種簡單的方式來實現它們。

4.png

05 隊列管理或同步


針對同步訪問共享資源的需求,不管是實現一個生產者-消費者隊列,仍是實現一個障礙,ZooKeeper 都提供一個簡單的接口來實現該操做。Zookeeper 能夠處理兩種類型的隊列:


  • 當一個隊列的成員都聚齊時,這個隊列纔可用,不然一直等待全部成員到達,這種是同步隊列。

  • 隊列按照 FIFO 方式進行入隊和出隊操做,例如實現生產者和消費者模型。


安裝配置


01 前提條件


ZooKeeper能夠運行在多種系統平臺上面,如下是支持的系統平臺以及在該平臺上是否支持開發環境或者生產環境。

5.png


  • 在部署ZooKeeper的機器上須要安裝Java運行環境。爲了正常運行ZooKeeper,咱們須要JRE1.6或者以上的版本。 


  • 對於集羣模式下的ZooKeeper部署,3個ZooKeeper服務進程是建議的最小進程數量,並且不一樣的服務進程建議部署在不一樣的物理機器上面,以減小機器宕機帶來的風險,以實現ZooKeeper集羣的高可用。 



02 安裝包說明


ZooKeeper下載地址


下載並解壓ZooKeeper軟件壓縮包後,能夠看到ZooKeeper包含如下的文件和目錄:

6.png


bin目錄:

ZooKeeper的可執行腳本目錄,包括ZooKeeper服務進程,zk客戶端,等腳本。


conf目錄:

配置文件目錄。zoo_sample.cfg爲樣例配置文件,須要修改成本身的名稱,通常爲zoo.cfg。log4j.properties爲日誌配置文件。


lib :

ZooKeeper依賴的包。


contrib目錄:

一些用於操做ZooKeeper的工具包。


recipes目錄:

ZooKeeper某些用法的代碼示例。


03 集羣模式


單機模式的zk進程雖然便於開發與測試,但並不適合在生產環境使用。在生產環境下,咱們須要使用集羣模式來對ZooKeeper進行部署。


注意!!!

在集羣模式下,建議至少部署3個zk進程,或者部署奇數個ZooKeeper進程。若是隻部署2個ZooKeeper進程,當其中一個ZooKeeper進程掛掉後,剩下的一個進程並不能構成一個Quorum的大多數。所以,部署2個進程甚至比單機模式更不可靠,由於2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。



運行配置

在集羣模式下,全部的ZooKeeper進程可使用相同的配置文件(指各個ZooKeeper進程部署在不一樣的機器上面),例如如下配置:


tickTime=2000

dataDir=/home/myname/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=192.168.229.160:2888:3888

server.2=192.168.229.161:2888:3888

server.3=192.168.229.162:2888:3888


initLimit :

ZooKeeper集羣模式下包含多個zk進程,其中一個進程爲leader,餘下的進程爲follower。initLimit配置follower與leader之間創建鏈接後進行同步的最長時間。


syncLimit : 

配置follower和leader之間發送消息,請求和應答的最大時間長度。


tickTime : 

tickTime則是上述兩個超時配置的基本單位。


server.id=host:port1:port2:

其中id爲一個數字,表示zk進程的id,這個id也是dataDir目錄下myid文件的內容。host是該ZooKeeper進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。


注意!!!

若是僅爲了測試部署集羣模式而在同一臺機器上部署ZooKeeper進程,server.id=host:port1:port2配置中的port參數必須不一樣。可是,爲了減小機器宕機的風險,強烈建議在部署集羣模式時,將ZooKeeper進程部署不一樣的物理機器上面。


 啓動

假如咱們打算在三臺不一樣的機器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一個ZooKeeper進程,以構成一個ZooKeeper集羣。三個ZooKeeper進程均使用相同的 zoo.cfg 配置:


tickTime=2000

dataDir=/home/myname/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=192.168.229.160:2888:3888

server.2=192.168.229.161:2888:3888

server.3=192.168.229.162:2888:3888


在三臺機器dataDir目錄( /home/myname/zookeeper 目錄)下,分別生成一個myid文件,其內容分別爲1,2,3。而後分別在這三臺機器上啓動ZooKeeper進程,這樣咱們便將ZooKeeper集羣啓動了起來。


鏈接

可使用如下命令來鏈接一個ZooKeeper集羣:

bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181


對接API說明


客戶端(以Java爲例)要鏈接 Zookeeper 服務器能夠經過建立 org.apache.zookeeper.ZooKeeper 的一個實例對象,而後調用這個類提供的接口來和服務器交互。接口以下所示:


String create(String path, byte[] data, List<ACL> acl,CreateMode createMode)

建立一個給定目錄節點 path, 並給它設置數據,CreateMode 標識有四種形式的目錄節點,分別是:


  • PERSISTENT:持久化目錄節點,這個目錄節點存儲的數據不會丟失。

  • PERSISTENT_SEQUENTIAL:順序自動編號的目錄節點,這種目錄節點會根據當前已存在的節點數自動加 1,而後返回給客戶端已經成功建立的目錄節點名。

  • EPHEMERAL:臨時目錄節點,一旦建立這個節點的客戶端與服務器端口也就是 session 超時,這種節點會被自動刪除。

  • EPHEMERAL_SEQUENTIAL:臨時自動編號節點。


Stat exists(String path, boolean watch)

判斷某個 path 是否存在,並設置是否監控這個目錄節點,這裏的 watcher 是在建立 ZooKeeper 實例時指定的 watcher,exists方法還有一個重載方法,能夠指定特定的watcher。


Stat exists(String path,Watcher watcher)

重載方法,這裏給某個目錄節點設置特定的 watcher,Watcher 在 ZooKeeper 是一個核心功能,Watcher 能夠監控目錄節點的數據變化以及子目錄的變化,一旦這些狀態發生變化,服務器就會通知全部設置在這個目錄節點上的 Watcher,從而每一個客戶端都很快知道它所關注的目錄節點的狀態發生變化,而作出相應的反應。


void delete(String path, int version)

刪除 path 對應的目錄節點,version 爲 -1 能夠匹配任何版本,也就刪除了這個目錄節點全部數據。


List<String>getChildren(String path, boolean watch)

獲取指定 path 下的全部子目錄節點,一樣 getChildren方法也有一個重載方法能夠設置特定的 watcher 監控子節點的狀態。


Stat setData(String path, byte[] data, int version)

給 path 設置數據,能夠指定這個數據的版本號,若是 version 爲 -1 怎麼能夠匹配任何版本。


byte[] getData(String path, boolean watch, Stat stat)

獲取這個 path 對應的目錄節點存儲的數據,數據的版本等信息能夠經過 stat 來指定,同時還能夠設置是否監控這個目錄節點數據的狀態。


voidaddAuthInfo(String scheme, byte[] auth)

客戶端將本身的受權信息提交給服務器,服務器將根據這個受權信息驗證客戶端的訪問權限。


Stat setACL(String path,List<ACL> acl, int version)

給某個目錄節點從新設置訪問權限,須要注意的是 Zookeeper 中的目錄節點權限不具備傳遞性,父目錄節點的權限不能傳遞給子目錄節點。目錄節點 ACL 由兩部分組成:perms 和 id。


perms:有 ALL、READ、WRITE、CREATE、DELETE、ADMIN 幾種 。

id : 標識了訪問目錄節點的身份列表,默認狀況下有如下兩種:


  • ANYONE_ID_UNSAFE = new Id("world", "anyone")

  • AUTH_IDS = new Id("auth", "")


分別表示任何人均可以訪問和建立者擁有訪問權限。


List<ACL>getACL(String path,Stat stat)

獲取某個目錄節點的訪問權限列表


除了以上這些上表中列出的方法以外還有一些重載方法,如都提供了一個回調類的重載方法以及能夠設置特定 Watcher 的重載方法,具體的方法能夠參考官方org.apache.zookeeper.ZooKeeper 類的 API 說明。


Java對接ZooKeeper樣例


下面給出基本的操做 ZooKeeper 的示例代碼,這樣你就能對 ZooKeeper 有直觀的認識了。下面的清單包括了建立與 ZooKeeper 服務器的鏈接以及最基本的數據操做:


ZooKeeper 基本的操做示例

第1頁.png

與ZooKeeper集羣的鏈接

第2頁.png

建議用開源的zkClient簡化代碼。

官方地址


總結


本文主要針對ZooKeeper的一些使用、應用場景、安裝部署過程要點、開發對接API等進行簡單入門級介紹,做爲開發人員入門瞭解。後續如需詳細瞭解ZooKeeper部署、開發、命令等請在官網參考官方文檔資料等。


參考資料:Apache ZooKeeper官方文檔及相關網上資料。

做者:陳楚相


其餘優質文章


【銀行運維】落地平臺化管理,大步邁向銀行4.0

彈性(Flex)佈局的使用

運維轉型 | 運維人再也不只是「救火英雄」

嘉爲科技榮獲ITSS【2019中國卓越智能運維服務商】

企業上雲如何優化性能?

相關文章
相關標籤/搜索