一芹彬、系統(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包含以下的文件和目錄:
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)的需求围小。
上面提到,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ǔ)在此目錄骄崩。
在Windows環(huán)境下,直接雙擊zkServer.cmd即可朱躺。在Linux環(huán)境下刁赖,進(jìn)入bin目錄,執(zhí)行命令
./zkServer.shstart
這個(gè)命令使得zk服務(wù)進(jìn)程在后臺(tái)進(jìn)行长搀。如果想在前臺(tái)中運(yùn)行以便查看服務(wù)器進(jìn)程的輸出日志,可以通過以下命令運(yùn)行:
./zkServer.shstart-foreground
執(zhí)行此命令鸡典,可以看到大量詳細(xì)信息的輸出荒揣,以便允許查看服務(wù)器發(fā)生了什么晰绎。
使用文本編輯器打開zkServer.cmd或者zkServer.sh文件,可以看到其會(huì)調(diào)用zkEnv.cmd或者zkEnv.sh腳本。zkEnv腳本的作用是設(shè)置zk運(yùn)行的一些環(huán)境變量沸毁,例如配置文件的位置和名稱等。
如果是連接同一臺(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
五皮胡、集群模式
單機(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)程不可用的可能性還大冤吨。
在集群模式下,所有的zk進(jìn)程可以使用相同的配置文件(是指各個(gè)zk進(jìn)程部署在不同的機(jī)器上面)饶套,例如如下配置:
tickTime=2000dataDir=/home/myname/zookeeperclientPort=2181initLimit=5syncLimit=2server.1=192.168.229.160:2888:3888server.2=192.168.229.161:2888:3888server.3=192.168.229.162:2888:3888
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仲智。
注意
如果僅為了測(cè)試部署集群模式而在同一臺(tái)機(jī)器上部署zk進(jìn)程,server.id=host:port1:port2配置中的port參數(shù)必須不同姻氨。但是钓辆,為了減少機(jī)器宕機(jī)的風(fēng)險(xiǎn),強(qiáng)烈建議在部署集群模式時(shí)肴焊,將zk進(jìn)程部署不同的物理機(jī)器上面前联。
假如我們打算在三臺(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 配置:
tickTime=2000dataDir=/home/myname/zookeeperclientPort=2181initLimit=5syncLimit=2server.1=192.168.229.160:2888:3888server.2=192.168.229.161:2888:3888server.3=192.168.229.162:2888:3888
在三臺(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)了起來。
可以使用以下命令來連接一個(gè)zk集群:
bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181
成功連接后每聪,可以看到如下輸出:
2016-06-2819:29:18,074[myid:] -INFO[main:ZooKeeper@438] -Initiatingclient connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181sessionTimeout=30000watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4WelcometoZooKeeper!2016-06-2819:29:18,146[myid:] -INFO[main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] -Openingsocket connection to server192.168.229.162/192.168.229.162:2181.Willnotattempt to authenticate usingSASL(unknown error)JLinesupport is enabled2016-06-2819:29:18,161[myid:] -INFO[main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] -Socketconnection established to192.168.229.162/192.168.229.162:2181, initiating session2016-06-2819:29:18,199[myid:] -INFO[main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] -Sessionestablishment complete on server192.168.229.162/192.168.229.162:2181, sessionid =0x3557c39d2810029, negotiated timeout =30000WATCHER::WatchedEventstate:SyncConnectedtype:Nonepath:null[zk:192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED)0]
想學(xué)習(xí)大數(shù)據(jù)或者想學(xué)習(xí)大數(shù)據(jù)的朋友旦棉,我整理了一套大數(shù)據(jù)的學(xué)習(xí)視頻免費(fèi)分享給大家,從入門到實(shí)戰(zhàn)都有药薯,大家可以加微信:Lxiao_28獲取绑洛,還可以入微信群交流!(備注領(lǐng)取資料童本,真實(shí)有效哦)真屯。