ZooKeeper的安裝與部署


本文講述如何安裝和部署ZooKeeper。

一、系統要求

ZooKeeper可以運行在多種系統平台上面,表1展示了zk支持的系統平台,以及在該平台上是否支持開發環境或者生產環境。

表1:ZooKeeper支持的運行平台

系統 開發環境 生產環境
Linux 支持 支持
Solaris 支持 支持
FreeBSD 支持 支持
Windows 支持 不支持
MacOS 支持 不支持

ZooKeeper是用Java編寫的,運行在Java環境上,因此,在部署zk的機器上需要安裝Java運行環境。為了正常運行zk,我們需要JRE1.6或者以上的版本。
對於集群模式下的ZooKeeper部署,3個ZooKeeper服務進程是建議的最小進程數量,而且不同的服務進程建議部署在不同的物理機器上面,以減少機器宕機帶來的風險,以實現ZooKeeper集群的高可用。
ZooKeeper對於機器的硬件配置沒有太大的要求。例如,在Yahoo!內部,ZooKeeper部署的機器其配置通常如下:雙核處理器,2GB內存,80GB硬盤。

二、下載

可以從 https://zookeeper.apache.org/releases.html 下載ZooKeeper,目前最新的穩定版本為 3.4.8 版本,用戶可以自行選擇一個速度較快的鏡像來下載即可。

三、目錄

下載並解壓ZooKeeper軟件壓縮包后,可以看到zk包含以下的文件和目錄:

這里寫圖片描述
圖1:ZooKeeper軟件的文件和目錄

  • bin目錄
    zk的可執行腳本目錄,包括zk服務進程,zk客戶端,等腳本。其中,.sh是Linux環境下的腳本,.cmd是Windows環境下的腳本。
  • conf目錄
    配置文件目錄。zoo_sample.cfg為樣例配置文件,需要修改為自己的名稱,一般為zoo.cfg。log4j.properties為日志配置文件。
  • lib
    zk依賴的包。
  • contrib目錄
    一些用於操作zk的工具包。
  • recipes目錄
    zk某些用法的代碼示例

四、單機模式

ZooKeeper的安裝包括單機模式安裝,以及集群模式安裝。

單機模式較簡單,是指只部署一個zk進程,客戶端直接與該zk進程進行通信。
在開發測試環境下,通過來說沒有較多的物理資源,因此我們常使用單機模式。當然在單台物理機上也可以部署集群模式,但這會增加單台物理機的資源消耗。故在開發環境中,我們一般使用單機模式。
但是要注意,生產環境下不可用單機模式,這是由於無論從系統可靠性還是讀寫性能,單機模式都不能滿足生產的需求。

4.1 運行配置

上面提到,conf目錄下提供了配置的樣例zoo_sample.cfg,要將zk運行起來,需要將其名稱修改為zoo.cfg。
打開zoo.cfg,可以看到默認的一些配置。

  • tickTime
    時長單位為毫秒,為zk使用的基本時間度量單位。例如,1 * tickTime是客戶端與zk服務端的心跳時間,2 * tickTime是客戶端會話的超時時間。
    tickTime的默認值為2000毫秒,更低的tickTime值可以更快地發現超時問題,但也會導致更高的網絡流量(心跳消息)和更高的CPU使用率(會話的跟蹤處理)。
  • clientPort
    zk服務進程監聽的TCP端口,默認情況下,服務端會監聽2181端口。
  • dataDir
    無默認配置,必須配置,用於配置存儲快照文件的目錄。如果沒有配置dataLogDir,那么事務日志也會存儲在此目錄。

4.2 啟動

在Windows環境下,直接雙擊zkServer.cmd即可。在Linux環境下,進入bin目錄,執行命令

./zkServer.sh start

這個命令使得zk服務進程在后台進行。如果想在前台中運行以便查看服務器進程的輸出日志,可以通過以下命令運行:

./zkServer.sh start-foreground

執行此命令,可以看到大量詳細信息的輸出,以便允許查看服務器發生了什么。

使用文本編輯器打開zkServer.cmd或者zkServer.sh文件,可以看到其會調用zkEnv.cmd或者zkEnv.sh腳本。zkEnv腳本的作用是設置zk運行的一些環境變量,例如配置文件的位置和名稱等。

4.3 連接

如果是連接同一台主機上的zk進程,那么直接運行bin/目錄下的zkCli.cmd(Windows環境下)或者zkCli.sh(Linux環境下),即可連接上zk。
直接執行zkCli.cmd或者zkCli.sh命令默認以主機號 127.0.0.1,端口號 2181 來連接zk,如果要連接不同機器上的zk,可以使用 -server 參數,例如:

bin/zkCli.sh -server 192.168.0.1:2181

五、集群模式

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

注意
在集群模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。如果只部署2個zk進程,當其中一個zk進程掛掉后,剩下的一個進程並不能構成一個quorum的大多數。因此,部署2個進程甚至比單機模式更不可靠,因為2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。

5. 1 運行配置

在集群模式下,所有的zk進程可以使用相同的配置文件(是指各個zk進程部署在不同的機器上面),例如如下配置:

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。
    當follower最初與leader建立連接時,它們之間會傳輸相當多的數據,尤其是follower的數據落后leader很多。initLimit配置follower與leader之間建立連接后進行同步的最長時間。
  • syncLimit
    配置follower和leader之間發送消息,請求和應答的最大時間長度。
  • tickTime
    tickTime則是上述兩個超時配置的基本單位,例如對於initLimit,其配置值為5,說明其超時時間為 2000ms * 5 = 10秒。
  • server.id=host:port1:port2
    其中id為一個數字,表示zk進程的id,這個id也是dataDir目錄下myid文件的內容。
    host是該zk進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。
  • dataDir
    其配置的含義跟單機模式下的含義類似,不同的是集群模式下還有一個myid文件。myid文件的內容只有一行,且內容只能為1 - 255之間的數字,這個數字亦即上面介紹server.id中的id,表示zk進程的id。

注意
如果僅為了測試部署集群模式而在同一台機器上部署zk進程,server.id=host:port1:port2配置中的port參數必須不同。但是,為了減少機器宕機的風險,強烈建議在部署集群模式時,將zk進程部署不同的物理機器上面。

5.2 啟動

假如我們打算在三台不同的機器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一個zk進程,以構成一個zk集群。
三個zk進程均使用相同的 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。然后分別在這三台機器上啟動zk進程,這樣我們便將zk集群啟動了起來。

5.3 連接

可以使用以下命令來連接一個zk集群:

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

成功連接后,可以看到如下輸出:

2016-06-28 19:29:18,074 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4 Welcome to ZooKeeper! 2016-06-28 19:29:18,146 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error) JLine support is enabled 2016-06-28 19:29:18,161 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session 2016-06-28 19:29:18,199 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0] 

圖2:客戶端連接zk集群的輸出日志

從日志輸出可以看到,客戶端連接的是192.168.229.162:2181進程(連接上哪台機器的zk進程是隨機的),客戶端已成功連接上zk集群。

參考資料

  1. http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
  2. http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html
  3. 《ZooKeeper分布式系統開發實戰》課程,主講人:璽感
  4. 《ZooKeeper分布式過程協同技術詳解》,Flavio Junqueira等著,謝超等譯
  5. 百度百科有關quorum的解釋,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta
  6. 《Zookeeper 安裝和配置》,http://coolxing.iteye.com/blog/1871009

ZooKeeper的客戶端包括Java版本和C語言版本。使用Java版本連接zk的命令以下:

bin/zkCli.sh -server ip:port

執行此命令,客戶端成功連接上zk,會有類似以下的輸出,其中,包括“Welcome to ZooKeeper!”的歡迎語,以及其他一些連接的信息等。

lihaodeMacBook-Pro:bin lihao$ ./zkCli.sh -server 127.0.0.1:2182 Connecting to 127.0.0.1:2182 2016-06-29 07:51:39,679 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT 2016-06-29 07:51:39,682 [myid:] - INFO [main:Environment@100] - Client environment:host.name=192.168.31.107 2016-06-29 07:51:39,682 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_77 2016-06-29 07:51:39,684 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation …… 2016-06-29 07:51:39,686 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2182 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@531d72ca Welcome to ZooKeeper! 2016-06-29 07:51:39,715 [myid:] - INFO [main-SendThread(127.0.0.1:2182):ClientCnxn$SendThread@1032] - Opening socket connection to server 127.0.0.1/127.0.0.1:2182. Will not attempt to authenticate using SASL (unknown error) JLine support is enabled 2016-06-29 07:51:39,797 [myid:] - INFO [main-SendThread(127.0.0.1:2182):ClientCnxn$SendThread@876] - Socket connection established to 127.0.0.1/127.0.0.1:2182, initiating session [zk: 127.0.0.1:2182(CONNECTING) 0] 2016-06-29 07:51:39,830 [myid:] - INFO [main-SendThread(127.0.0.1:2182):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2182, sessionid = 0x155996605050000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null

連接成功后,便可以使用命令與zk服務進行交互。

help

help命令會輸出zk支持的所有命令。

[zk: 127.0.0.1:2182(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo cmdno printwatches on|off delete path [version] sync path listquota path rmr path get path [watch] create [-s] [-e] path data acl addauth scheme auth quit getAcl path close connect host:port

ls

查看指定路徑下包含的節點

[zk: localhost:2181(CONNECTED) 2] ls / [zookeeper]

create

創建一個節點,例如:

[zk: localhost:2181(CONNECTED) 3] create /zk mydata Created /zk

以上命令創建一個/zk節點,且其內容為 “myData”

get

顯示指定路徑下節點的信息,例如,我們檢查一下上面的/zk節點最否創建成功

[zk: localhost:2181(CONNECTED) 4] get /zk
mydata
cZxid = 0xb59 ctime = Thu Jun 30 11:13:24 CST 2016 mZxid = 0xb59 mtime = Thu Jun 30 11:13:24 CST 2016 pZxid = 0xb59 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0

可以看到/zk節點的內容為”myData”,且輸出包含了znode的其他信息。有關各個字段的具體含義,請參見了本博客對znode的介紹。

set

設置節點的內容,例如:

[zk: localhost:2181(CONNECTED) 6] set /zk "anotherData" …… [zk: localhost:2181(CONNECTED) 7] get /zk "anotherData" ……

delete

刪除一個節點,例如:

[zk: localhost:2181(CONNECTED) 8] delete /zk [zk: localhost:2181(CONNECTED) 9] get /zk Node does not exist: /zk

以上就是zk客戶端最常用的幾個命令,從這幾個命令我們也可以看到zk提供的API設計的簡單。

四字母命令

ZooKeeper提供了多個由4個字母構成的命令,可以使用nc或者telnet來使用這些命令。例如:

telnet 127.0.0.1 2181

成功連接zk后,輸入conf
會看到以下輸出

clientPort=2181
dataDir=D:\Soft\zookeeper-3.4.6\data\version-2 dataLogDir=D:\Soft\zookeeper-3.4.6\data\version-2 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=0

或者使用nc來向zk發送4字母命令,例如:

echo conf | nc 192.168.229.161 2181
  • 1

其他常用的四字母命令如下表格所示:

表格:ZooKeeper提供的四字母命令

命令 描述
conf zk服務配置的詳細信息
stat 客戶端與zk連接的簡要信息
srvr zk服務的詳細信息
cons 客戶端與zk連接的詳細信息
mntr zk服務目前的性能狀況
wchs watch的簡要信息
wchc watch的詳細信息,客戶端 -> watch的映射,線上環境要小心使用
wchp watch的詳細信息, znode -> 客戶端的映射,線上環境要小心使用

例如,mntr 命令的輸出:

echo mntr | nc 192.168.229.161 2181 zk_version 3.4.6-1569965, built on 02/20/2014 09:09 GMT zk_avg_latency 0 zk_max_latency 565 zk_min_latency 0 zk_packets_received 95353 zk_packets_sent 95713 zk_num_alive_connections 3 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 20 zk_watch_count 12 zk_ephemerals_count 9 zk_approximate_data_size 1465 zk_open_file_descriptor_count 37 zk_max_file_descriptor_count 65535 zk_followers 2 - 只有leader進程才有此項輸出 zk_synced_followers 2 - 只有leader進程才有此項輸出 zk_pending_syncs 0 - 只有leader進程才有此項輸出

參考資料

  1. http://www.programering.com/a/MTOxUjMwATI.html
  2. https://zookeeper.apache.org/doc/r3.4.8/zookeeperStarted.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM