工作中使用到了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的安装和配置过程。

posted on 2019-12-29 11:07  zhaoshizi  阅读(8155)  评论(0编辑  收藏  举报