ZooKeeper的安装与部署
本文講述如何安裝和部署ZooKeeper。
一、系統(tǒng)要求
ZooKeeper可以運(yùn)行在多種系統(tǒng)平臺(tái)上面,表1展示了zk支持的系統(tǒng)平臺(tái),以及在該平臺(tái)上是否支持開發(fā)環(huán)境或者生產(chǎn)環(huán)境。
表1:ZooKeeper支持的運(yùn)行平臺(tái)
| 系統(tǒng) | 開發(fā)環(huán)境 | 生產(chǎn)環(huán)境|
| Linux| 支持 | 支持|
| Solaris| 支持| 支持|
| FreeBSD| 支持 | 支持|
| Windows| 支持 | 不支持|
| MacOS | 支持| 不支持|
ZooKeeper是用Java編寫的,運(yùn)行在Java環(huán)境上,因此,在部署zk的機(jī)器上需要安裝Java運(yùn)行環(huán)境。為了正常運(yùn)行zk,我們需要JRE1.6或者以上的版本。
對(duì)于集群模式下的ZooKeeper部署,3個(gè)ZooKeeper服務(wù)進(jìn)程是建議的最小進(jìn)程數(shù)量,而且不同的服務(wù)進(jìn)程建議部署在不同的物理機(jī)器上面,以減少機(jī)器宕機(jī)帶來的風(fēng)險(xiǎn),以實(shí)現(xiàn)ZooKeeper集群的高可用。
ZooKeeper對(duì)于機(jī)器的硬件配置沒有太大的要求。例如,在Yahoo!內(nèi)部,ZooKeeper部署的機(jī)器其配置通常如下:雙核處理器,2GB內(nèi)存,80GB硬盤。
二、下載
可以從 https://zookeeper.apache.org/releases.html 下載ZooKeeper,目前最新的穩(wěn)定版本為 3.4.8 版本,用戶可以自行選擇一個(gè)速度較快的鏡像來下載即可。
三、目錄
下載并解壓ZooKeeper軟件壓縮包后,可以看到zk包含以下的文件和目錄:
圖1:ZooKeeper軟件的文件和目錄
bin目錄
zk的可執(zhí)行腳本目錄,包括zk服務(wù)進(jìn)程,zk客戶端,等腳本。其中,.sh是Linux環(huán)境下的腳本,.cmd是Windows環(huán)境下的腳本。
conf目錄
配置文件目錄。zoo_sample.cfg為樣例配置文件,需要修改為自己的名稱,一般為zoo.cfg。log4j.properties為日志配置文件。
lib
zk依賴的包。
contrib目錄
一些用于操作zk的工具包。
recipes目錄
zk某些用法的代碼示例
四、單機(jī)模式
ZooKeeper的安裝包括單機(jī)模式安裝,以及集群模式安裝。
單機(jī)模式較簡(jiǎn)單,是指只部署一個(gè)zk進(jìn)程,客戶端直接與該zk進(jìn)程進(jìn)行通信。
在開發(fā)測(cè)試環(huán)境下,通過來說沒有較多的物理資源,因此我們常使用單機(jī)模式。當(dāng)然在單臺(tái)物理機(jī)上也可以部署集群模式,但這會(huì)增加單臺(tái)物理機(jī)的資源消耗。故在開發(fā)環(huán)境中,我們一般使用單機(jī)模式。
但是要注意,生產(chǎn)環(huán)境下不可用單機(jī)模式,這是由于無論從系統(tǒng)可靠性還是讀寫性能,單機(jī)模式都不能滿足生產(chǎn)的需求。
4.1 運(yùn)行配置
上面提到,conf目錄下提供了配置的樣例zoo_sample.cfg,要將zk運(yùn)行起來,需要將其名稱修改為zoo.cfg。
打開zoo.cfg,可以看到默認(rèn)的一些配置。
tickTime
時(shí)長(zhǎng)單位為毫秒,為zk使用的基本時(shí)間度量單位。例如,1 * tickTime是客戶端與zk服務(wù)端的心跳時(shí)間,2 * tickTime是客戶端會(huì)話的超時(shí)時(shí)間。
tickTime的默認(rèn)值為2000毫秒,更低的tickTime值可以更快地發(fā)現(xiàn)超時(shí)問題,但也會(huì)導(dǎo)致更高的網(wǎng)絡(luò)流量(心跳消息)和更高的CPU使用率(會(huì)話的跟蹤處理)。
clientPort
zk服務(wù)進(jìn)程監(jiān)聽的TCP端口,默認(rèn)情況下,服務(wù)端會(huì)監(jiān)聽2181端口。
dataDir
無默認(rèn)配置,必須配置,用于配置存儲(chǔ)快照文件的目錄。如果沒有配置dataLogDir,那么事務(wù)日志也會(huì)存儲(chǔ)在此目錄。
4.2 啟動(dòng)
在Windows環(huán)境下,直接雙擊zkServer.cmd即可。在Linux環(huán)境下,進(jìn)入bin目錄,執(zhí)行命令
./zkServer.sh start
1
這個(gè)命令使得zk服務(wù)進(jìn)程在后臺(tái)進(jìn)行。如果想在前臺(tái)中運(yùn)行以便查看服務(wù)器進(jìn)程的輸出日志,可以通過以下命令運(yùn)行:
./zkServer.sh start-foreground
1
執(zhí)行此命令,可以看到大量詳細(xì)信息的輸出,以便允許查看服務(wù)器發(fā)生了什么。
使用文本編輯器打開zkServer.cmd或者zkServer.sh文件,可以看到其會(huì)調(diào)用zkEnv.cmd或者zkEnv.sh腳本。zkEnv腳本的作用是設(shè)置zk運(yùn)行的一些環(huán)境變量,例如配置文件的位置和名稱等。
4.3 連接
如果是連接同一臺(tái)主機(jī)上的zk進(jìn)程,那么直接運(yùn)行bin/目錄下的zkCli.cmd(Windows環(huán)境下)或者zkCli.sh(Linux環(huán)境下),即可連接上zk。
直接執(zhí)行zkCli.cmd或者zkCli.sh命令默認(rèn)以主機(jī)號(hào) 127.0.0.1,端口號(hào) 2181 來連接zk,如果要連接不同機(jī)器上的zk,可以使用 -server 參數(shù),例如:
bin/zkCli.sh -server 192.168.0.1:2181
1
五、集群模式
單機(jī)模式的zk進(jìn)程雖然便于開發(fā)與測(cè)試,但并不適合在生產(chǎn)環(huán)境使用。在生產(chǎn)環(huán)境下,我們需要使用集群模式來對(duì)zk進(jìn)行部署。
**注意** 在集群模式下,建議至少部署3個(gè)zk進(jìn)程,或者部署奇數(shù)個(gè)zk進(jìn)程。如果只部署2個(gè)zk進(jìn)程,當(dāng)其中一個(gè)zk進(jìn)程掛掉后,剩下的一個(gè)進(jìn)程并不能構(gòu)成一個(gè)quorum的大多數(shù)。因此,部署2個(gè)進(jìn)程甚至比單機(jī)模式更不可靠,因?yàn)?個(gè)進(jìn)程其中一個(gè)不可用的可能性比一個(gè)進(jìn)程不可用的可能性還大。5. 1 運(yùn)行配置
在集群模式下,所有的zk進(jìn)程可以使用相同的配置文件(是指各個(gè)zk進(jìn)程部署在不同的機(jī)器上面),例如如下配置:
initLimit
ZooKeeper集群模式下包含多個(gè)zk進(jìn)程,其中一個(gè)進(jìn)程為leader,余下的進(jìn)程為follower。
當(dāng)follower最初與leader建立連接時(shí),它們之間會(huì)傳輸相當(dāng)多的數(shù)據(jù),尤其是follower的數(shù)據(jù)落后leader很多。initLimit配置follower與leader之間建立連接后進(jìn)行同步的最長(zhǎng)時(shí)間。
syncLimit
配置follower和leader之間發(fā)送消息,請(qǐng)求和應(yīng)答的最大時(shí)間長(zhǎng)度。
tickTime
tickTime則是上述兩個(gè)超時(shí)配置的基本單位,例如對(duì)于initLimit,其配置值為5,說明其超時(shí)時(shí)間為 2000ms * 5 = 10秒。
server.id=host:port1:port2
其中id為一個(gè)數(shù)字,表示zk進(jìn)程的id,這個(gè)id也是dataDir目錄下myid文件的內(nèi)容。
host是該zk進(jìn)程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。
dataDir
其配置的含義跟單機(jī)模式下的含義類似,不同的是集群模式下還有一個(gè)myid文件。myid文件的內(nèi)容只有一行,且內(nèi)容只能為1 - 255之間的數(shù)字,這個(gè)數(shù)字亦即上面介紹server.id中的id,表示zk進(jìn)程的id。
5.2 啟動(dòng)
假如我們打算在三臺(tái)不同的機(jī)器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一個(gè)zk進(jìn)程,以構(gòu)成一個(gè)zk集群。
三個(gè)zk進(jìn)程均使用相同的 zoo.cfg 配置:
在三臺(tái)機(jī)器dataDir目錄( /home/myname/zookeeper 目錄)下,分別生成一個(gè)myid文件,其內(nèi)容分別為1,2,3。然后分別在這三臺(tái)機(jī)器上啟動(dòng)zk進(jìn)程,這樣我們便將zk集群?jiǎn)?dòng)了起來。
5.3 連接
可以使用以下命令來連接一個(gè)zk集群:
成功連接后,可以看到如下輸出:
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 = 30000WATCHER::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進(jìn)程(連接上哪臺(tái)機(jī)器的zk進(jìn)程是隨機(jī)的),客戶端已成功連接上zk集群。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的ZooKeeper的安装与部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《代码整洁之道姐妹篇》
- 下一篇: Zookeeper 使用