由于zookeeper是使用java语言编写,所以在搭建zookeeper服务之前,服务器必须具备java环境(若已具备该环境,可直接跳过)
官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
tar -xvzf jdk-8u231-linux-x64.tar.gz
mv jdk1.8.0_231 /usr/local/
向/etc/profile文件末尾中添加如下配置后,并执行source /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_231
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
JVMFLAGS="-Xmx3550m -Xms3550m -Xmn2g -Xss128k"
$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
$ javac
Usage: javac <options> <source files>
...
本文安装zookeeper使用版本3.4.14版本进行搭建,安装包从官网进行下载,Zookeeper机器间不需要设置免密码登录。本文使用三台服务器进行zookeeper集群的搭建,ip分别为:
官网下载地址:https://archive.apache.org/dist/zookeeper/。
特别注意,从版本3.5.5开始,需要下载带有bin名称的包,带有bin名称的包中有编译之后的的二进制包。而之前普通的tar.gz中只有源码无法直接使用。使用不带bin的包直接启动会报错:
Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain
在zookeeper3.5.0之前,zookeeper集群的全体成员以及它的配置参数都是在启动时静态加载的,并且在运行时不可变。因此当zookeeper集群需要扩缩容的时候,我们只能通过手动修改配置文件然后滚动重启的方式来完成zk集群的扩容或缩容。当集群中机器较多的时候,可以会因为人工导致误操作的概率加大。
在zookeeper3.5.0版本之后,zookeeper集群开始支持动态修改集群中的服务器配置,而修改的方式只需要通过zk提供的客户端命令reconfig进行操作。可以通过rename命令对集群中的服务器进行增加、删除,还可以改变服务器的端口配置以及服务器在集群中的角色,participant/observer。
而实现zookeeper进行动态配置的一个很重要的前提就是它将zookeeper的动态配置与静态配置进行了分离,动态配置文件通过静态配置文件中的dynamicConfigFile关键词与动态配置文件进行链接。同样的,zookeeper3.5之后的版本兼容旧版本的集群配置,使用旧版本配置,zookeeper服务器会将静态文件中的动态部分自动分离出来。
此处安装创建软连接的目的是为了方便我们在使用的时候不需要带版本号方便,又能方便的知道当前zookeeper是那一版本的。
tar -xvzf ./apache-zookeeper-3.5.6-bin.tar.gz
mv /data/apache-zookeeper-3.5.6-bin /data/zookeeper-3.5.6
ln -s /data/zookeeper-3.5.6/ /data/zookeeper
myid是zookeeper集群中每台服务器的唯一标识,因此每台机器不能重复,建议从1开始进行递增。myid放在dataDir文件夹下,文件中只有一个id来标识这台机器。
此处约定:
IP | 标识数值 |
---|---|
9.134.128.1 | 1 |
9.134.128.2 | 2 |
9.134.128.3 | 3 |
分别在三台机器上添加myid文件
echo 1 > /data/zookeeper/data/myid
echo 2 > /data/zookeeper/data/myid
echo 3 > /data/zookeeper/data/myid
zookeeper服务启动时默认寻找conf文件夹下的zoo.cfg,故在conf下创建文件zoo.cfg。
touch /data/zookeeper/conf/zoo.cfg
zoo.cfg内填入以下配置:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/datalog
autopurge.purgeInterval=1
autopurge.snapRetainCount=10
extendedTypesEnabled=true
reconfigEnabled=true
standaloneEnabled=false
dynamicConfigFile=/data/zookeeper/conf/zoo.cfg.dynamic
特别注意:
从3.5.0开始clientPort和clientPortAddress配置参数不应该被使用,这些配置应该放在动态配置中进行配置。
配置说明:
zookeeper选填的配置项较多,其他配置项无需填写直接默认即可,只需要配置上述选项。
首先创建上述静态配置中链接的动态配置文件
touch /data/zookeeper/conf/zoo.cfg.dynamic
然后在动态配置文件中填入以下配置:
server.1=9.134.147.78:2888:3888:participant;2181
server.2=9.134.75.254:2888:3888:participant;2181
server.3=9.134.118.145:2888:3888:participant;2181
配置文件说明:
server. = ::[:role];[:]
zookeeper的系统运行日志默认打印在zookeeper.out文件中,由于zookeeper.out文件不会滚动和自动清理,会导致文件越来越大,所以此处需要修改zkEnv.sh配置,使其系统日志强制输出到日志文件中并支持滚动。
# 设置系统日志存放目录,将下面命令直接放在zkEnv.sh的最后
export ZOO_LOG_DIR=/data/zookeeper/datalog
# 设置日志输出方式,在zkEnv.sh中寻找ZOO_LOG4J_PROP,将该值修改为:
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
设置每个日志文件大小为100M,滚动10个文件
log4j.appender.ROLLINGFILE.MaxFileSize=100MB
log4j.appender.ROLLINGFILE.MaxBackupIndex=10
zookeeper集群启动部分先后顺序,可选择任意顺序启动,不过先启动的服务可能会连不上其他服务器,所以在启动之前会有错误日志,这个是正常情况。
# 启动zookeeper服务
cd /data/zookeeper/bin && ./zkServer.sh start
# 重启zookeeper服务
cd /data/zookeeper/bin && ./zkServer.sh restart
# 停止zookeeper服务
cd /data/zookeeper/bin && ./zkServer.sh stop
服务安装完毕后,需要验证zookeeper服务是否搭建成功,直接运行./zkServer.sh status即可。
# 对于leader命令返回值为:
$ ./zkServer.sh status
/usr/local/jdk1.8.0_231/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
# 对于folllower 命令返回值为:
$ ./zkServer.sh status
/usr/local/jdk1.8.0_231/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
# 若出现一下错误,可能是zookeeper服务还没完全起来,稍后在进行验证
[hadoop@DEVNET-154-77 ~/zookeeper/bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.
注意当使用老的zoo.cfg配置进行升级为新的配置的时候,旧配置文件中的clientPort一定要保留。若不保留,会导致集群起来之后dynamic文件恢复为最新的集群配置,最新集群配置中没有端口,新的zoo.cfg中也没有clientPort,导致出问题。
参考链接:
1、ZooKeeper-3.4.6分布式安装指南
2、 ZooKeeper的配置文件优化性能(转)
3、zookeeper集群管理配置优化总结
4、分布式服务框架 Zookeeper — 管理分布式环境中的数据
5、ZooKeeper动态配置(十四)
6、ZooKeeper动态重新配置