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
解压完成后进入zookeeper-3.4.12
目录结构如下:
├── 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的可执行脚本目录,包括zk服务进程,zk客户端,等脚本。其中,.sh是Linux环境下的脚本,.cmd是Windows环境下的脚本。
-
conf
- 配置文件目录。zoo_sample.cfg为样例配置文件,需要修改为自己的名称,一般为zoo.cfg。log4j.properties为日志配置文件。
-
lib
- zk依赖的包。
-
contrib
- 一些用于操作zk的工具包。
-
recipes
- zk某些用法的代码示例
单机模式部署
单机模式的部署较为简单,主要用于开发环境下较为方便的开发和测试,生产环境不可应用单击模式,无论稳定性和IO效率单机模式都无法满足生产需求。
单机模式配置
运行单击模式需要更改一下配置文件,zk的本身提供了一个样例配置文件,位于conf/zoo_sample.cfg,复制一份命名为zoo.cfg并根据需求修改 cp conf/zoo_sample.cfg zoo.cfg
。
来看一下zoo.cfg的默认配置
# 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
- 心跳间隔时间,以毫秒为单位。客户端与ZK服务端每2000ms进行一次心跳通信,如果ZK服务端超过4000ms没有收到客户端的心跳,那么认为客户端会话超时
- 更低的tickTime值可以更快的发现超时问题,但是也会因为心跳通信更频繁而导致更高的网络流量和更高的CPU使用
-
dataDir
- ZK存储内存数据库的位置,目录位置可以自定义,更改为/depdata/zk/dataDir/
- 注意提前创建/depdata/zk/dataDir/目录,并保证读写权限
-
clientPort
- ZK服务进程监听的TCP端口,客户端与ZK服务端连接时即使用这个端口号
单机模式启动
启动服务端
后台启动 /bin/zkServer.sh start
如果想要前台启动并查看日志 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服务已经启动并且绑定了我们在配置文件zoo.cfg中指定的端口号2181
客户端连接
在同一台主机上可以启动ZK客户端进行连接 bin/zkCli.sh
默认客户端会连接本机127.0.0.1 端口号2181
如果客户端和服务端位于不同的机器,可以使用-server 来指定ip和端口,比如bin/zkCli.sh -server 192.168.4.50:2181
客户端连接成功之后,可以输出几个命令来测试客户端连接,如ls /
输出:[zookeeper]
创建一个节点 create /zk_test my_data
,再ls /
得到输出[zookeeper, zk_test]
,说明zk_test节点创建好了
观察我们在配置文件指定的dataDir(ZK存储内存数据库的位置)ll /depdata/zk/dataDir/
发现已经有ZK创建的文件
关闭ZK服务bin/zkServer.sh stop
集群模式部署
虽然单机模式的zk便于开发与测试,但并不适合在生产环境使用。在生产环境下,我们需要使用集群模式来对zk进行部署。
注意
在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。
集群模式配置
在集群模式下,所有的zk服务可以使用相同的配置文件(是指各个zk服务部署在不同的机器上面),例如如下配置:
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集群模式下包含多个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文件的内容。
- 不同的机器下需要在dataDir下分别生成一个myid文件,文件的内容就是主机对应的id号,比如机器vc0的
/depdata/zk/dataDir/
下需要有文件myid,内容为0
。 - host是该zk服务所在的IP地址
- port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
将配置文件拷贝到3个不同的主机之后,在/depdata/zk/dataDir
下创建文件myid,文件myid的内容为0或1或2,取值对应的是server.id的配置值
集群模式启动
分别在3台主机上启动ZK服务bin/zkServer.sh start-foreground
查看ZK集群的服务状态
分别查看ZK的服务状态bin/zkServer.sh status
三台主机分别返回:
[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
测试集群高可用性
停掉集群中的为leader的ZK服务,在名称为vc1的主机上执行bin/zkServer.sh stop
连接集群
输入:bin/zkCli.sh -server 192.168.4.50:2181,192.168.4.14:2181,192.168.4.18:2181
响应:
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进程(连接上哪台机器的zk进程是随机的),客户端已成功连接上zk集群。