zookeeper安裝部署
下載
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
解壓
tar xvf zookeeper-3.4.12.tar.gz
解壓完成后進(jìn)入zookeeper-3.4.12
目錄結(jié)構(gòu)如下:
├── bin
├── build.xml
├── conf
├── contrib
├── dist-maven
├── docs
├── ivysettings.xml
├── ivy.xml
├── lib
├── LICENSE.txt
├── NOTICE.txt
├── README.md
├── README_packaging.txt
├── recipes
├── src
├── zookeeper-3.4.12.jar
├── zookeeper-3.4.12.jar.asc
├── zookeeper-3.4.12.jar.md5
└── zookeeper-3.4.12.jar.sha1
其中:
-
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ī)模式部署
單機(jī)模式的部署較為簡(jiǎn)單,主要用于開(kāi)發(fā)環(huán)境下較為方便的開(kāi)發(fā)和測(cè)試椿疗,生產(chǎn)環(huán)境不可應(yīng)用單擊模式漏峰,無(wú)論穩(wěn)定性和IO效率單機(jī)模式都無(wú)法滿足生產(chǎn)需求。
單機(jī)模式配置
運(yùn)行單擊模式需要更改一下配置文件届榄,zk的本身提供了一個(gè)樣例配置文件,位于conf/zoo_sample.cfg,復(fù)制一份命名為zoo.cfg并根據(jù)需求修改 cp conf/zoo_sample.cfg zoo.cfg
浅乔。
來(lái)看一下zoo.cfg的默認(rèn)配置
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/depdata/zk/dataDir
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
其中:
-
tickTime
- 心跳間隔時(shí)間,以毫秒為單位铝条【肝客戶端與ZK服務(wù)端每2000ms進(jìn)行一次心跳通信,如果ZK服務(wù)端超過(guò)4000ms沒(méi)有收到客戶端的心跳班缰,那么認(rèn)為客戶端會(huì)話超時(shí)
- 更低的tickTime值可以更快的發(fā)現(xiàn)超時(shí)問(wèn)題贤壁,但是也會(huì)因?yàn)樾奶ㄐ鸥l繁而導(dǎo)致更高的網(wǎng)絡(luò)流量和更高的CPU使用
-
dataDir
- ZK存儲(chǔ)內(nèi)存數(shù)據(jù)庫(kù)的位置,目錄位置可以自定義,更改為/depdata/zk/dataDir/
- 注意提前創(chuàng)建/depdata/zk/dataDir/目錄埠忘,并保證讀寫(xiě)權(quán)限
-
clientPort
- ZK服務(wù)進(jìn)程監(jiān)聽(tīng)的TCP端口,客戶端與ZK服務(wù)端連接時(shí)即使用這個(gè)端口號(hào)
單機(jī)模式啟動(dòng)
啟動(dòng)服務(wù)端
后臺(tái)啟動(dòng) /bin/zkServer.sh start
如果想要前臺(tái)啟動(dòng)并查看日志 bin/zkServer.sh start-foreground
可以觀察到日志輸出:
......
2018-06-24 18:01:21,076 [myid:] - INFO [main:Environment@100] - Server environment:user.home=/root
2018-06-24 18:01:21,076 [myid:] - INFO [main:Environment@100] - Server environment:user.dir=/storage/dep/zookeeper-3.4.12
2018-06-24 18:01:21,098 [myid:] - INFO [main:ZooKeeperServer@835] - tickTime set to 2000
2018-06-24 18:01:21,098 [myid:] - INFO [main:ZooKeeperServer@844] - minSessionTimeout set to -1
2018-06-24 18:01:21,098 [myid:] - INFO [main:ZooKeeperServer@853] - maxSessionTimeout set to -1
2018-06-24 18:01:21,141 [myid:] - INFO [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2018-06-24 18:01:21,148 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
觀察日志可知ZK服務(wù)已經(jīng)啟動(dòng)并且綁定了我們?cè)谂渲梦募oo.cfg中指定的端口號(hào)2181
客戶端連接
在同一臺(tái)主機(jī)上可以啟動(dòng)ZK客戶端進(jìn)行連接 bin/zkCli.sh
默認(rèn)客戶端會(huì)連接本機(jī)127.0.0.1 端口號(hào)2181
如果客戶端和服務(wù)端位于不同的機(jī)器脾拆,可以使用-server 來(lái)指定ip和端口,比如bin/zkCli.sh -server 192.168.4.50:2181
客戶端連接成功之后,可以輸出幾個(gè)命令來(lái)測(cè)試客戶端連接,如ls /
輸出:[zookeeper]
創(chuàng)建一個(gè)節(jié)點(diǎn) create /zk_test my_data
,再ls /
得到輸出[zookeeper, zk_test]
,說(shuō)明zk_test節(jié)點(diǎn)創(chuàng)建好了
觀察我們?cè)谂渲梦募付ǖ膁ataDir(ZK存儲(chǔ)內(nèi)存數(shù)據(jù)庫(kù)的位置)ll /depdata/zk/dataDir/
發(fā)現(xiàn)已經(jīng)有ZK創(chuàng)建的文件
關(guān)閉ZK服務(wù)bin/zkServer.sh stop
集群模式部署
雖然單機(jī)模式的zk便于開(kāi)發(fā)與測(cè)試莹妒,但并不適合在生產(chǎn)環(huán)境使用名船。在生產(chǎn)環(huán)境下,我們需要使用集群模式來(lái)對(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服務(wù)可以使用相同的配置文件(是指各個(gè)zk服務(wù)部署在不同的機(jī)器上面),例如如下配置:
tickTime=2000
dataDir=/depdata/zk/dataDir/
clientPort=2181
initLimit=5
syncLimit=2
server.0=192.168.4.50:2888:3888
server.1=vc1:2888:3888
server.2=vc2: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鳍征,說(shuō)明其超時(shí)時(shí)間為 2000ms * 5 = 10秒。
-
server.id=host:port1:port2
- 其中id為一個(gè)數(shù)字面徽,表示zk進(jìn)程的id艳丛,這個(gè)id也是dataDir目錄下myid文件的內(nèi)容。
- 不同的機(jī)器下需要在dataDir下分別生成一個(gè)myid文件趟紊,文件的內(nèi)容就是主機(jī)對(duì)應(yīng)的id號(hào)氮双,比如機(jī)器vc0的
/depdata/zk/dataDir/
下需要有文件myid,內(nèi)容為0
。 - host是該zk服務(wù)所在的IP地址
- port1表示follower和leader交換消息所使用的端口织阳,port2表示選舉leader所使用的端口眶蕉。
將配置文件拷貝到3個(gè)不同的主機(jī)之后,在/depdata/zk/dataDir
下創(chuàng)建文件myid,文件myid的內(nèi)容為0或1或2,取值對(duì)應(yīng)的是server.id的配置值
集群模式啟動(dòng)
分別在3臺(tái)主機(jī)上啟動(dòng)ZK服務(wù)bin/zkServer.sh start-foreground
查看ZK集群的服務(wù)狀態(tài)
分別查看ZK的服務(wù)狀態(tài)bin/zkServer.sh status
三臺(tái)主機(jī)分別返回:
[root@vc1 zookeeper-3.4.12]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: leader
[root@vc0 zookeeper-3.4.12]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower
[root@vc2 zookeeper-3.4.12]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/dep/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower
測(cè)試集群高可用性
停掉集群中的為leader的ZK服務(wù),在名稱為vc1的主機(jī)上執(zhí)行bin/zkServer.sh stop
連接集群
輸入:bin/zkCli.sh -server 192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181
響應(yīng):
2018-06-24 21:16:02,305 [myid:] - INFO [main:ZooKeeper@441] - Initiating client connection, connectString=192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@4b85612c
Welcome to ZooKeeper!
2018-06-24 21:16:02,360 [myid:] - INFO [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@1028] - Opening socket connection to server 192.168.4.18/192.168.4.18:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-06-24 21:16:02,422 [myid:] - INFO [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@878] - Socket connection established to 192.168.4.18/192.168.4.18:2181, initiating session
[zk: 192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181(CONNECTING) 0] 2018-06-24 21:16:02,497 [myid:] - INFO [main-SendThread(192.168.4.18:2181):ClientCnxn$SendThread@1302] - Session establishment complete on server 192.168.4.18/192.168.4.18:2181, sessionid = 0x2000002cb0c0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
從日志輸出可以看到唧躲,客戶端連接的是192.168.4.18:2181進(jìn)程(連接上哪臺(tái)機(jī)器的zk進(jìn)程是隨機(jī)的)造挽,客戶端已成功連接上zk集群。