3.2 部署JDK
本次选择在三节点部署jdk1.8.0_321版本。
-- root用户,三节点都需操作,此处以其中一节点为例
[root@prod-ck-zk-01 ~]# cd /home/
[root@prod-ck-zk-01 home]# tar -zxf jdk1.8.0_321.tar.gz
-- 编辑环境变量
[root@prod-ck-zk-01 ~]# cat << EOF | sudo tee -a /etc/profile
export JAVA_HOME=/home/jdk1.8.0_321
export PATH=\$JAVA_HOME/bin:\$PATH
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
EOF
-- 生效环境变量
[root@prod-ck-zk-01 ~]# source /etc/profile
-- 查看java版本
[root@prod-ck-zk-01 ~]# java -version
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)
3.3 部署ZooKeeper
登录ZooKeeper官网下载地址 Index of /dist/zookeeper,下载对应的ZooKeeper版本,本次我选择下载zookeeper-3.8.3/ 这个版本,这个版本是 2023-10-09发布的。
将下载的apache-zookeeper-3.8.3-bin.tar.gz安装包分别上传到三台服务器某个目录下,比如/home目录,保持目录统一。接下来按照如下方式一步步采用二进制方式部署apache-zookeeper-3.8.3。
1)解压tar包
-- root用户,三节点都需操作,此处以其中一节点为例
[root@prod-ck-zk-01 ~]# cd /home
[root@prod-ck-zk-01 home]# tar -zxf apache-zookeeper-3.8.3-bin.tar.gz
-- 创建目录
[root@prod-ck-zk-01 home]# mkdir -p /data/zookeeper
2)修改配置文件
-- root用户,三节点都需操作,此处以其中一节点为例
[root@prod-ck-zk-01 home]# cd apache-zookeeper-3.8.3-bin/conf/
[root@prod-ck-zk-01 conf]# cp -p zoo_sample.cfg zoo.cfg
-- 编辑后的zoo.cfg文件内容如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
admin.enableServer=true
admin.serverPort=8080
server.1=10.110.5.132:2888:3888
server.2=10.110.5.133:2888:3888
server.3=10.110.5.134:2888:3888
autopurge.purgeInterval=1
autopurge.snapRetainCount=5
-- 以上参数具体含义如下
各个参数的含义如下:
- `tickTime=2000`: ZooKeeper使用的基本时间单位,单位是毫秒。这个值用于心跳和超时等。
- `initLimit=10`: 这是follower初始化与leader之间的连接时能容忍的最多心跳次数(tickTime的数量)。
- `syncLimit=5`: 这是leader和follower之间发送消息,请求和应答时间长度,单位是tickTime。
- `dataDir=/data/zookeeper`: ZooKeeper存储数据的目录。
- `clientPort=2181`: 客户端连接ZooKeeper服务器的端口号。
- `metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider`: ZooKeeper的度量提供者类名,这里配置的是PrometheusMetricsProvider,表示使用Prometheus进行监控。
- `metricsProvider.httpPort=7000`: Prometheus的HTTP服务端口。
- `metricsProvider.exportJvmInfo=true`: 是否导出JVM的相关信息给Prometheus。
- `admin.enableServer=true`: 是否启用ZooKeeper的admin server。
- `admin.serverPort=8080`: ZooKeeper admin server的端口号。
- `server.X=ip:port:port`: ZooKeeper集群中的服务器配置,X代表服务器的编号,ip是服务器的IP地址,第一个端口是服务器之间通信的端口,第二个端口是leader选举使用的端口。
- `autopurge.purgeInterval=1`: 自动清理的间隔(单位是小时),这里配置的是1小时清理一次。
- `autopurge.snapRetainCount=5`: 保留的快照文件数量,超过这个数量的旧文件会被清理。
3)添加java.env配置文件
-- root用户,三节点都需操作,此处以其中一节点为例
-- 通过如下命令在/home/apache-zookeeper-3.8.3-bin/conf目录下新增 java.env 配置文件,命令及配置文件内容如下:
cat << 'EOF' | tee -a /home/apache-zookeeper-3.8.3-bin/conf/java.env
#!/bin/sh
export JVMFLAGS="-Xms128m \
-Xmx6g \
-Xloggc:/var/log/zookeeper/zookeeper-gc.log \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=16 \
-XX:GCLogFileSize=16M \
-verbose:gc \
-XX:+PrintGCTimeStamps \
-XX:+PrintGCDateStamps \
-XX:+PrintGCDetails \
-XX:+PrintTenuringDistribution \
-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintGCApplicationConcurrentTime \
-XX:+PrintSafepointStatistics \
-XX:+UseG1GC \
-Djute.maxbuffer=8388608 \
-XX:MaxGCPauseMillis=50 $JVMFLAGS"
EOF
-- 以上各参数解释如下
这些是JVM启动参数,用于调整内存、垃圾收集和日志:
- `-Xms128m`: 初始堆内存128MB。
- `-Xmx6g`: 最大堆内存6GB。
- `-Xloggc`: 垃圾收集日志路径。
- `-XX:+UseGCLogFileRotation`: 启动日志轮转。
- `-XX:NumberOfGCLogFiles=16`: 日志文件数16个。
- `-XX:GCLogFileSize=16M`: 日志文件大小16MB。
- `-verbose:gc`: 输出垃圾收集信息。
- `-XX:+PrintGCTimeStamps`: 添加GC时间戳。
- `-XX:+PrintGCDateStamps`: 添加GC日期戳。
- `-XX:+PrintGCDetails`: 输出GC详细信息。
- `-XX:+PrintTenuringDistribution`: 新生代年龄分布信息。
- `-XX:+PrintGCApplicationStoppedTime`: 应用暂停时间。
- `-XX:+PrintGCApplicationConcurrentTime`: 应用运行时间。
- `-XX:+PrintSafepointStatistics`: 安全点统计信息。
- `-XX:+UseG1GC`: 使用G1垃圾收集器。
- `-Djute.maxbuffer=8388608`: ZooKeeper序列化缓冲区大小8MB。
- `-XX:MaxGCPauseMillis=50`: 期望最大GC暂停时间50毫秒。
`$JVMFLAGS`: 累加已有的JVMFLAGS参数。
4)增加myid文件
-- root用户,三节点都需操作
-- 在ZooKeeper集群各数据目录/data/zookeeper,增加myid文件,标识当前节点,用于ZooKeeper集群选举【注意,各节点myid值不同】
-- 节点一 prod-ck-zk-01
[root@prod-ck-zk-01 ~]# echo 1 >> /data/zookeeper/myid
-- 节点二 prod-ck-zk-02
[root@prod-ck-zk-02 ~]# echo 2 >> /data/zookeeper/myid
-- 节点二 prod-ck-zk-03
[root@prod-ck-zk-03 ~]# echo 3 >> /data/zookeeper/myid
5)启动Zookeeper集群
-- root用户操作
-- 在ZooKeeper节点一/home/目录创建start_zk_cluster.sh集群启动脚本,脚本内容如下所示:
cat << 'EOF' | sudo tee /home/start_zk_cluster.sh > /dev/null
#!/bin/bash
# 定义服务器列表
SERVERS=("10.110.5.132" "10.110.5.133" "10.110.5.134")
# Zookeeper启动脚本的路径
ZK_START_SCRIPT="/home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh start"
# root密码
PASSWORD="root"
# 遍历服务器列表并通过ssh启动Zookeeper
for SERVER in "${SERVERS[@]}"; do
echo "Starting Zookeeper on ${SERVER}..."
sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no root@$SERVER $ZK_START_SCRIPT
done
echo "Zookeeper cluster startup initiated on all servers."
EOF
-- 然后执行start_zk_cluster.sh脚本
[root@prod-ck-zk-01 home]# sh start_zk_cluster.sh
-- 输出结果如下
Starting Zookeeper on 10.110.5.132...
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Starting Zookeeper on 10.110.5.133...
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Starting Zookeeper on 10.110.5.134...
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Zookeeper cluster startup initiated on all servers.
-- 注意:若报 sshpass: command not found,需各服务器安装 sshpass,通过如下方式安装sshpass
sudo yum install sshpass
3.4 查看Zookeeper集群状态
-- 节点一查看ZK当前状态
[root@prod-ck-zk-01 ~]# /home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower ## 显示当前状态为follower
-- 节点二查看ZK当前状态
[root@prod-ck-zk-02 ~]# /home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader ## 显示当前状态为leader
-- 节点三查看ZK当前状态
[root@prod-ck-zk-03 ~]# /home/apache-zookeeper-3.8.3-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower ## 显示当前状态为follower
3.5 ZooKeeper验证
3.5.1 查看四字命令是否有效
分别使用浏览器打开 http://xxx.xxx.xxx.xxx:8080/commands/mntr 验证四字命令是否有效,若输入如下内容表示有效。
{
"version": "3.8.3-6ad6d364c7c0bcf0de452d54ebefa3058098ab56, built on 2023-10-05 10:34 UTC",
"server_state": "leader",
"peer_state": "leading - broadcast",
"write_batch_time_in_commit_processor{quantile=\"0.5\"}": "NaN",
"write_batch_time_in_commit_processor_count": 0,
"write_batch_time_in_commit_processor_sum": 0,
---此处省略部分内容
......
"prep_process_time_count": 0,
"prep_process_time_sum": 0,
"reads_after_write_in_session_queue{quantile=\"0.5\"}": "NaN",
"reads_after_write_in_session_queue_count": 0,
"reads_after_write_in_session_queue_sum": 0,
"learner_commit_received_count": 0,
"command": "monitor",
"error": null
}
注:四字命令含义详细解释如下:
在Zookeeper中,`mntr` 是一种四字命令(four-letter word command),可以用于获取Zookeeper服务的详细运行时状态信息。这些命令通常用于监控和诊断。当你访问 `http://xxx.xxx.xxx.xxx:8080/commands/mntr`,你实际上是通过HTTP接口发送了一个 `mntr` 命令到Zookeeper服务器。
Zookeeper的HTTP接口是一个额外的服务,可能是由某个Zookeeper监控或管理工具提供的。如果Zookeeper服务配置了HTTP服务器并且启用了`mntr`命令的HTTP接口,那么你可以通过这种方式获取Zookeeper的状态信息。
`mntr` 命令返回的信息通常包含以下内容:
- `zk_version`: Zookeeper的版本
- `zk_avg_latency`: 平均延迟时间
- `zk_max_latency`: 最大延迟时间
- `zk_min_latency`: 最小延迟时间
- `zk_packets_received`: 接收到的数据包数量
- `zk_packets_sent`: 发送的数据包数量
- `zk_num_alive_connections`: 存活的连接数
- `zk_outstanding_requests`: 未完成请求的数量
- `zk_server_state`: 服务器的状态(leader/follower/standalone)
- `zk_znode_count`: Znode节点的数量
- `zk_watch_count`: watch的数量
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/02d6e87792e043bc5889255054c0f9ed.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/e31b41b381f9f17a0e6aa48c8d37cd86.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
子书资料:
[外链图片转存中...(img-y1Znh7sy-1714543554567)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**