> 技术文档 > Zookeeper 3.8.4 安装部署帮助手册_zk3.8.4版本漏洞修复方法

Zookeeper 3.8.4 安装部署帮助手册_zk3.8.4版本漏洞修复方法


Zookeeper 3.8.4 安装部署帮助手册

Zookeeper3.4.6+升级至3.5.5以上的升级方案

文章目录

  • Zookeeper 3.8.4 安装部署帮助手册
    • 安装包
    • 系统准备
    • 安装步骤
      • 创建用户
      • 创建目录
      • 解压软件包
      • 配置zookeeper环境变量
      • 配置文件
        • 配置zoo.cfg
        • 配置myid文件
        • 配置logback日志
    • 启停ZooKeeper
      • 启动
      • 检查
        • 状态检查
        • 命令行执行检查
      • 停止

若没有特殊标注,命令使用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;

解压软件包

解压JDKzookeeper安装包至/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用户的javazookeeper的环境变量。

切换到zookeeper用户,本文档zookeeper安装的后续操作均使用zookeeper用户。

su - zookeeper

编辑/home/zookeeper/.bashrc,设置javazookeeper的环境变量

文件追加内容末尾添加

#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