Zookeeper 3.8.4 安装部署帮助手册_zk3.8.4版本漏洞修复方法
Zookeeper 3.8.4 安装部署帮助手册
Zookeeper3.4.6+升级至3.5.5以上的升级方案
文章目录
- Zookeeper 3.8.4 安装部署帮助手册
若没有特殊标注,命令使用root
执行。
安装包
安装本软件,涉及的软件包为:
jdk1.8.0_161.tgz
apache-zookeeper-3.8.4-bin.tar.gz
系统准备
### 端口检查
确认如下端口不被占用
-
2181 :对客户端提供服务
-
2888 :内部通讯端口
-
3888 :选举leader端口
执行命令:
netstat -apn | grep 2181; netstat -apn | grep 2888; netstat -apn | grep 3888;
安装步骤
创建用户
命令如下:
groupadd zookeeper -g 800 && useradd -g zookeeper -u 800 zookeeper;
创建目录
命令如下:
mkdir -p /data/zookeeper/{zkdata,logs,software};chown -R zookeeper:zookeeper /data/zookeeper;ln -snf /data/zookeeper/zkdata /home/zookeeper/zkdata;ln -snf /data/zookeeper/logs /home/zookeeper/logs;ln -snf /data/zookeeper/software /home/zookeeper/software;chown -R zookeeper:zookeeper /home/zookeeper;
解压软件包
解压JDK
和zookeeper
安装包至/home/zookeeper/software
下,并创建相应的软链接。命令如下:
tar -zxf /data/install_package/jdk1.8.0_161.tgz -C /home/zookeeper/software/;tar -zxf /data/install_package/apache-zookeeper-3.8.4-bin.tar.gz -C /home/zookeeper/software/;cd /home/zookeeper/software;ln -snf jdk1.8.0_161 java;ln -snf apache-zookeeper-3.8.4-bin zookeeper;chown -R zookeeper:zookeeper /home/zookeeper/software/;
此时/home/zookeeper/software
目录有关zookeeper的如下:
lrwxrwxrwx 1 zookeeper zookeeper 12 Jul 19 19:07 java -> jdk1.8.0_161drwxr-xr-x 8 zookeeper zookeeper 4096 Dec 20 2017 jdk1.8.0_161lrwxrwxrwx 1 zookeeper zookeeper 15 Jul 19 19:07 zookeeper -> zookeeper-3.4.9drwxr-xr-x 10 zookeeper zookeeper 4096 Aug 23 2016 zookeeper-3.4.9
配置zookeeper环境变量
配置zookeeper用户的java
和zookeeper
的环境变量。
切换到zookeeper用户,本文档zookeeper安装的后续操作均使用zookeeper用户。
su - zookeeper
编辑/home/zookeeper/.bashrc
,设置java
和zookeeper
的环境变量
文件追加内容末尾添加
#Java configexport JAVA_HOME=/home/zookeeper/software/java#ZooKeeper configexport ZOOKEEPER_HOME=/home/zookeeper/software/zookeeperexport PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/tools:$PATH
立即生效,执行命令:
source /home/zookeeper/.bashrc
配置文件
配置zoo.cfg
生成/home/zookeeper/software/zookeeper/conf/zoo.cfg
文件,命令如下:
cp /home/zookeeper/software/zookeeper/conf/zoo_sample.cfg /home/zookeeper/software/zookeeper/conf/zoo.cfg
编辑zoo.cfg
文件内容,命令如下:
vim /home/zookeeper/software/zookeeper/conf/zoo.cfg
zoo.cfg
需要修改的内容说明
# tick时间单位长度,单位毫秒tickTime=2000# follower初始连接leader超时,其值代表tickTime的倍数initLimit=10# follower同步超时,其值代表tickTime的倍数syncLimit=5# 客户端连接端口clientPort=2181# ZooKeeper存储内存数据库快照的位置dataDir=/home/zookeeper/zkdata/# ZooKeeper存储数据库更新事务日志的位置dataLogDir=/home/zookeeper/logs/# 启用后,ZooKeeper 自动清除功能会在 dataDir 和 dataLogDir 中分别保留 autopurge.snapRetainCount 值相同个数的最新快照和相应的事务日志,并删除其余部分。默认为 3。最小值为 3。autopurge.snapRetainCount=5# 触发清除任务的时间间隔(小时)。设置为正整数(1 及以上)可启用自动清除。默认为 0。autopurge.purgeInterval=1# 关闭 AdminServer(Jetty服务)admin.enableServer=false# 四字快捷命令白名单4lw.commands.whitelist=*# 配置ZK集群服务器地址与开放端口信息server.1=hadoop1-outer1.test.com:2888:3888server.2=hadoop1-outer2.test.com:2888:3888server.3=hadoop1-outer3.test.com:2888:3888
配置zookeeper集群服务器地址说明:
server.1=hadoop1-outer1.test.com:2888:3888server.2=hadoop1-outer2.test.com:2888:3888server.3=hadoop1-outer3.test.com:2888:3888
每个zk服务器都在配置文件中用一个server.
行表示,后跟服务器的唯一标识符(这里用从1开始递增的数字),然后是服务器的主机名(例如hadoop1.test.com
):内部通讯端口:选举leader端口
配置myid文件
根据zoo.cfg
中zookeeper集群服务器配置,每个节点都创建各自的myid
文件,每个节点文件内容不相同。
文件内容是:在zoo.cfg
文件中,当前主机名对应的server.
开头的行,server.
后的唯一标识符。
例如:当前是hadoop1-outer1
节点,则服务器的唯一标识符为1,执行如下命令:
echo 1 >/home/zookeeper/zkdata/myid
查看下创建成功,执行cat命令:
cat /home/zookeeper/zkdata/myid
显示如下
[root@hadoop1 software]# cat /home/zookeeper/zkdata/myid1
#### 配置zookeeper服务的内存
(需要调整么,怎么验证呢?垃圾回收器是否要用G1GC?)
新增java.env
文件,增加关于JAVA的启动参数配置JVMFLAGS
,编辑命令如下:
vim /home/zookeeper/software/zookeeper/conf/java.env
文件内容如下:
export JVMFLAGS=\"-server -Xmx2g -Xms2g -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../dumps $JVMFLAGS\"
其中可以可以根据情况,调整如下2项的内容:
-Xmx
: JVM最大允许分配的堆内存-Xms
:JVM初始化分配的堆内存
配置logback日志
配置运行日志与审计日志
vim /home/zookeeper/software/zookeeper/conf/logback.xml
节点运行日志输出到日志文件,解开ROLLINGFILE
的appender节点注释,并调整其内容
<appender name=\"ROLLINGFILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\"> <File>${zookeeper.log.dir}/${zookeeper.log.file}</File> <encoder> <pattern>%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n</pattern> </encoder> <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\"> <level>${zookeeper.log.threshold}</level> </filter> <rollingPolicy class=\"ch.qos.logback.core.rolling.FixedWindowRollingPolicy\"> <maxIndex>${zookeeper.log.maxbackupindex}</maxIndex> <FileNamePattern>${zookeeper.log.dir}/${zookeeper.log.file}.%i</FileNamePattern> </rollingPolicy> <triggeringPolicy class=\"ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy\"> <MaxFileSize>${zookeeper.log.maxfilesize}</MaxFileSize> </triggeringPolicy> </appender> <root level=\"INFO\"> <appender-ref ref=\"CONSOLE\" /> <appender-ref ref=\"ROLLINGFILE\" /> </root>
rollingPolicy
节点代表设置日志滚动策略。其下支持参数:
maxIndex
:代表最多保留的日志文件个数的上限minIndex
:代表最多保留的日志文件个数的下限(基本不用配置)fileNamePattern
:代表指定文件滚动文件的命名模式,.%i
用于处理当单个文件达到maxFileSize
时的情况,.%i
会递增数字以创建新的文件。
triggeringPolicy
节点代表设置日志文件触发滚动条件。其下支持参数:
MaxFileSize
:设置为当单个日志文件大小达到某个值时触发滚动。
使用别的策略
<appender name=\"ROLLINGFILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\"> <file>${zookeeper.log.dir}/${zookeeper.log.file}</file> <encoder> <pattern>%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n</pattern> </encoder> <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\"> <level>${zookeeper.log.threshold}</level> </filter> <rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\"> <fileNamePattern>${zookeeper.log.dir}/${zookeeper.log.file}-%d{yyyy-MM-dd_HH}.%i</fileNamePattern> <maxFileSize>20GB</maxFileSize> <maxHistory>48</maxHistory> <totalSizeCap>50GB</totalSizeCap> </rollingPolicy> </appender>
rollingPolicy
节点代表设置日志滚动策略,使用SizeAndTimeBasedRollingPolicy
,其下支持参数:
-
maxFileSize
:设置为当单个日志文件大小达到某个值时触发滚动。 -
maxHistory
:代表最多保留的日志文件上限,与fileNamePattern
配合使用,若fileNamePattern
中使用的是%d{yyyy-MM-dd}
,代表保留近多少天的日志文件,若%d{yyyy-MM-dd_HH}
,则代表保留近多少小时的日志文件 -
fileNamePattern
:代表指定文件滚动文件的命名模式,.%i
用于处理当单个文件达到maxFileSize
时的情况,.%i
会递增数字以创建新的文件。当日志文件超过maxFileSize
的,也会发生日志翻滚,则i
就会递增。 -
totalSizeCap
:总大小上限,totalSizeCap
属性要求同时设置maxHistory
属性。此外,maxHistory
限制会先生效应用,而totalSizeCap
限制则在其后生效应用。是顺序应用。默认情况下,totalSizeCap
设置为零,即没有总大小上限。
启停ZooKeeper
本节内容均使用zookeeper用户
su - zookeeper
启动
所有zookeeper节点分别执行以下命令:
cd /home/zookeeper;zkServer.sh start
结果显示如下
[zookeeper@hadoop1 ~]$ zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /home/zookeeper/software/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
检查
状态检查
ZooKeeper机器分别执行以下命令
zkServer.sh status
显示结果,仅有1台机器Mode显示为leader ,其他都为follower
[zookeeper@hadoop1 ~]$ zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/zookeeper/software/zookeeper/bin/../conf/zoo.cfgMode: follower
命令行执行检查
任意选择一台节点,进入ZooKeeper的命令行,连接地址为ZooKeeper所有机器和配置文件zoo.cfg的clientPort,格式为 host1:port,host2:port,host3:port
zkCli.sh -server hadoop1-outer1.test.com:2181,hadoop2-outer1.test.com:2181,hadoop3-outer1.test.com:2181
结果显示,正常状态下进入CONNECTED
[zookeeper@hadoop1-outer1 ~]$ zkCli.sh -server hadoop1-outer1.test.com:2181,hadoop2-outer1.test.com:2181,hadoop3-outer1.test.com:2181Connecting to hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181.........2025-06-11 17:34:50,078 [myid:] - INFO [main:o.a.z.ZooKeeper@637] - Initiating client connection, connectString=hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@6a41eaa22025-06-11 17:34:50,086 [myid:] - INFO [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation2025-06-11 17:34:50,095 [myid:] - INFO [main:o.a.z.ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes2025-06-11 17:34:50,108 [myid:] - INFO [main:o.a.z.ClientCnxn@1747] - zookeeper.request.timeout value is 0. feature enabled=falseWelcome to ZooKeeper!2025-06-11 17:34:50,122 [myid:hadoop1-outer1.test.com:2181] - INFO [main-SendThread(hadoop1-outer1.test.com:2181):o.a.z.ClientCnxn$SendThread@1177] - Opening socket connection to server hadoop1-outer1.test.com/10.237.195.42:2181.2025-06-11 17:34:50,122 [myid:hadoop1-outer1.test.com:2181] - INFO [main-SendThread(hadoop1-outer1.test.com:2181):o.a.z.ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)JLine support is enabled2025-06-11 17:34:50,133 [myid:hadoop1-outer1.test.com:2181] - INFO [main-SendThread(hadoop1-outer1.test.com:2181):o.a.z.ClientCnxn$SendThread@1013] - Socket connection established, initiating session, client: /10.237.195.42:40616, server: hadoop1-outer1.test.com/10.237.195.42:21812025-06-11 17:34:50,155 [myid:hadoop1-outer1.test.com:2181] - INFO [main-SendThread(hadoop1-outer1.test.com:2181):o.a.z.ClientCnxn$SendThread@1453] - Session establishment complete on server hadoop1-outer1.test.com/10.237.195.42:2181, session id = 0x10df9f7f0320005, negotiated timeout = 30000WATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181,hadoop1-outer1.test.com:2181(CONNECTED) 0]
zkCli模式下创建znode操作命令:
create /test \'1\'
正常的显示信息
Created /test
zkCli模式下查看znode信息操作命令:
get -s /test
正常的显示信息
1cZxid = 0x100000032ctime = Wed Jun 11 17:37:06 CST 2025mZxid = 0x100000032mtime = Wed Jun 11 17:37:06 CST 2025pZxid = 0x100000032cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 1numChildren = 0
zkCli模式下删除znode操作命令:
delete /test
退出zkCli模式的命令:
quit
停止
所有ZooKeeper节点分别执行
zkServer.sh stop