工作中使用到了ZooKeeper做集群的管理工具,把ZooKeeper的安装和配置简单记录一下。
首先是下载ZooKeeper,本来没什么好说的,只是自己疏忽犯了个低级错误,应该下载可执行文件的压缩包apache-zookeeper-x.x.x-bin.tar.gz,我下载成了源码的apache-zookeeper-x.x.x.tar.gz,结果导致启动时报错,找到不主类。
下载完成压缩之后就可以进行配置了。也可以先建个软链接,如果以后ZooKeeper版本有变化,只要修改软链接即可。
使用%ZK_HOME%来代表ZooKeeper的安装目录。
tar -xzvf apache-zookeeper-3.5.6-bin.tar.gz
ZooKeeper有两种运行模式,一个是集群模式,一个是单机模式。分别配置如下。
1. 集群模式
假设用三台机器来搭建ZooKeeper集群,IP地址为IP1,IP2,IP3
(1) 配置zoo.cfg文件
初次使用ZooKeeper,需要将%ZOO_HOME%/conf目录下的zoo_sample.cfg文件重命名为zoo.cfg,并且按照如下代码进行简单配置:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/zs/zookeeper/zookeeper1/data dataLogDir=/home/zs/zookeeper/zookeeper1/log clientPort=2181 server.1=IP1:2888:3888 server.2=IP2:2888:3888 server.3=IP3:2888:3888
配置参数解释如下:
a). tickTime:该参数单位是毫秒ms,用于配置ZooKeeper中最小时间单元的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。
b). initLimit:该参数要配置一个正整数N,表示tickTime的N倍。用于配置Leader服务器等待Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己对外提供服务的起始状态。Leader服务器允许Follower在initLimit时间内完成这个工作。
c). syncLimit:该参数要配置一个正整数N,表示tickTime的N倍。用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。
d). dataDir:用于配置ZooKeeper服务器存储快照文件的目录。默认情况下,如果没有配置参数dataLogDir,那么事务日志也会存储在这个目录中。考虑到事务日志的写性能直接影响ZooKeeper整体的服务能力,因此建议同时通过参数dataLogDir来配置ZooKeeper的事务日志的存储目录。
e). dataLogDir:用于配置ZooKeeper服务器存储事务日志文件的目录。dataDir和dataLogDir都要确保有读写权限。
f). clientPort:用于配置当前服务器对外的服务端口,客户端会通过该端口和ZooKeeper服务器创建连接。
g). server.id=host:port:port:该参数用于配置组成ZooKeeper集群的机器列表,其中id即为ServerID,与每台服务器myid文件中的数字相对应。同时,在该参数中,会配置两个端口:第一个端口用于指定Follower服务器与Leader进行运行时通信和数据同步时所使用的端口,第二个端口则专门用于进行Leader选举过程中的投票通信。在ZooKeeper服务器启动的时候,其会根据myid文件中配置的ServerID来确定自己是哪台服务器,并使用对应配置的端口来时行启动。如果在实际使用过程中,需要在同一台服务器上部署多个ZooKeeper实例来构成伪集群的话,那么这些端口都需要配置成不同。
(2) 创建myid文件
在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,即ServerID,和zoo.cfg中当前机器的编号对应上。例如,server.1的myid文件内容就是“1”。要确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中的server.id=host:port:port的id值一致。id的范围是1~255。
(3) 重复(1)和(2)步,为所有机器配置zoo.cfg和myid文件。
(4) 启动ZooKeeper。
bin/zkServer.sh start
有时虽然执行完启动命令后,显示STARTED,但ZooKeeper并没有真正运行,可以对应状态进行检测。在执行启动命令的目录下会生成Logs目录,记录启动的日志,若未成功启动,可在Logs目录查找原因。
(5) 验证服务器
要验证服务器有没有启动成功,可以telnet到ZooKeeper的端口,然后发送stat命令来验证
如果出现以下输出信息,服务器就启动成功了。
还可以使用zkServer.sh status 命令,查看ZooKeeper服务器的状态,如下图所示,说明该服务器是个follower。
验证服务器时可能出现的问题如下:
a). 如果使用telnet加stat命令验证,出现“stat is not executed because it is not in the whitelist.”报错,可以修改一下启动脚本,把ZooKeeper的指使添加到白名单。
打开zkServer.sh脚本,在 if [ "x$SERVER_JVMFLAGS" != "x" ] 语句上方添加一条语句,把ZooKeeper的指使添加到白名单。
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"
b). 如果使用telnet加stat命令验证,出现“This ZooKeeper instance is not currently serving requests”报错,其原因就是集群没有选出来leader,当集群里的结点只剩下一台,或者不足半数时,就会出现这个错误提示。 可以把配置集群里其他ZooKeeper服务器启动,或者查看各服务器之间网络是否不通。
c). 如果使用zkServer.sh status命令,出现It is probably not running. 有可能是集群中其他服务器没有开启。要整个集群都开启再执行status命令,只开启一台服务器并验证会报错。也有可能是服务器真没启来,看查看一下输出日志。
(6) 关闭服务器
bin/zkServer.sh stop
2. 伪集群模式
ZooKeeper支持在一台服务器上启动多个ZooKeeper的实例,相互组成一个集群。不需要拷贝多个ZooKeeper的目录,就是同一个程序目录下,配置多个zoo.cfg文件即可。
(1) 配置文件
可以在conf目录下,创建三个配置文件,分别命名为zoo1.cfg、zoo2.cfg、zoo3.cfg,内容分别如下。注意,dataDir和dataLogDir配置不同的目录,IP地址均为本机的IP地址,但端口各不相同。
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/zs/zookeeper/zookeeper1/data dataLogDir=/home/zs/zookeeper/zookeeper1/log clientPort=2181 server.1=IP1:2887:3887 server.2=IP1:2888:3888 server.3=IP1:2889:3889
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/zs/zookeeper/zookeeper2/data dataLogDir=/home/zs/zookeeper/zookeeper2/log clientPort=2182 server.1=IP1:2887:3887 server.2=IP1:2888:3888 server.3=IP1:2889:3889
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/zs/zookeeper/zookeeper3/data dataLogDir=/home/zs/zookeeper/zookeeper3/log clientPort=2183 server.1=IP1:2887:3887 server.2=IP1:2888:3888 server.3=IP1:2889:3889
(2) 创建myid文件
在每个dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,即ServerID,和zoo1.cfg、zoo2.cfg、zoo3.cfg中当前机器的编号对应上。
(3) 启动服务器
因为只有一个ZooKeeper程序目录,在启动不同的实例时,要指定各自的配置文件,启动命令如下所示
bin/zkServer.sh start conf/zoo1.cfg bin/zkServer.sh start conf/zoo2.cfg bin/zkServer.sh start conf/zoo3.cfg
(4) 验证服务器
bin/zkServer.sh status conf/zoo1.cfg bin/zkServer.sh status conf/zoo2.cfg bin/zkServer.sh status conf/zoo3.cfg
(5) 关闭服务器
bin/zkServer.sh stop conf/zoo1.cfg bin/zkServer.sh stop conf/zoo2.cfg bin/zkServer.sh stop conf/zoo3.cfg
3. 单机模式
ZooKeeper也支持单机部署,单机模式可以看做一种特殊的集群模式,整体配置流程与集群部署一致,不同的地方在于,zoo.cfg配置文件中,只需要配置一个server地址,而且不需要在dataDir目录下配置myid文件。
(1) 配置cfg文件
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/zs/zookeeper/zookeeper/data dataLogDir=/home/zs/zookeeper/zookeeper/log clientPort=2181 server.1=IP1:2888:3888
(2) 启动服务器
bin/zkServer.sh start
(3) 验证服务器
可以使用telnet 加stat命令验证,也可以使用zkServer.sh status 命令验证
使用telnet 加stat命令验证,可以看到单机模式下服务器的Mode为standalone,集群模式下是Leader和Follower。
使用zkServer.sh status 命令验证
(4) 关闭服务器
bin/zkServer.sh stop
以上就是ZooKeeper的安装和配置过程。