注意:需要提前安装JDK环境

一、zookeeper单点部署

1、下载zk

下载链接:https://archive.apache.org/dist/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz

2、在elk121节点上解压软件包

[root@elk121 ~]# tar xf apache-zookeeper-3.8.0-bin.tar.gz -C /es/softwares/

3、在elk121节点上创建符号连接

[root@elk121 ~]# cd /es/softwares/ && ln -sv apache-zookeeper-3.8.0-bin zk

4、在elk121节点上声明zk的环境变量

[root@elk121 softwares]# cat > /etc/profile.d/kafka.sh <<'EOF'
#!/bin/bash
export ZK_HOME=/es/softwares/zk
export PATH=$PATH:$ZK_HOME/bin
EOF
[root@elk121 softwares]# source /etc/profile.d/kafka.sh

5、在elk121节点上创建zk的配置文件

[root@elk121 ~]# cp /es/softwares/zk/conf/{zoo_sample.cfg,zoo.cfg}

6、在elk121节点上启动zk节点

[root@elk121 ~]# zkServer.sh start

其他操作

(1) 查看zk服务的状态信息

[root@elk121 ~]# zkServer.sh status

(2) 关闭zk服务

[root@elk121 ~]# zkServer.sh stop

(3) 关闭zk服务

[root@elk121 ~]# zkServer.sh restart

7、在elk121节点上连接ZK节点

[root@elk121 ~]# zkCli.sh

二、zookeeper集群部署

1、在elk121节点上创建zk的数据目录

[root@elk121 ~]# install -d /es/data/zk

2、在elk121节点上修改单点zk的配置文件

[root@elk121 ~]# cat /es/softwares/zk/conf/zoo.cfg
# 定义最小单元的时间范围tick。
tickTime=2000
# 启动时最长等待tick数量。
initLimit=5
# 数据同步时最长等待的tick时间进行响应ACK
syncLimit=2
# 指定数据目录
dataDir=/es/data/zk
# 监听端口
clientPort=2181
# 开启四字命令允许所有的节点访问。
4lw.commands.whitelist=*
# server.ID=A:B:C[:D]
# ID:
# zk的唯一编号。
# A:
# zk的主机地址。
# B:
# leader的选举端口,是谁leader角色,就会监听该端口。
# C:
# 数据通信端口。
# D:
# 可选配置,指定角色。
server.121=192.168.1.121:2888:3888
server.122=192.168.1.122:2888:3888
server.123=192.168.1.123:2888:3888

3、在elk121节点上编写同步脚本data_rsync.sh

在elk121节点上编写同步脚本

[root@elk121 ~]# cat > /usr/local/sbin/data_rsync.sh <<'EOF'
#!/bin/bash
# Auther: zq
if [ $# -ne 1 ];then
echo "Usage: $0 /path/to/file(绝对路径)"
exit
fi
# 判断文件是否存在
if [ ! -e $1 ];then
echo "[ $1 ] dir or file not find!"
exit
fi
# 获取父路径
fullpath=`dirname $1`
# 获取子路径
basename=`basename $1`
# 进入到父路径
cd $fullpath
for ((host_id=122;host_id<=123;host_id++))
do
# 使得终端输出变为绿色
tput setaf 2
echo ===== rsyncing elk${host_id}: $basename =====
# 使得终端恢复原来的颜色
tput setaf 7
# 将数据同步到其他两个节点
rsync -apz $basename `whoami`@elk${host_id}:$fullpath
if [ $? -eq 0 ];then
echo "命令执行成功!"
fi
done
EOF

在elk121节点上给脚本授权

[root@elk121 ~]# chmod +x /usr/local/sbin/data_rsync.sh

4、在elk121节点上同步数据

[root@elk121 ~]# data_rsync.sh /es/softwares/zk/
[root@elk121 ~]# data_rsync.sh /es/softwares/apache-zookeeper-3.8.0-bin/
[root@elk121 ~]# data_rsync.sh /es/data/zk/
[root@elk121 ~]# data_rsync.sh /etc/profile.d/kafka.sh

5、在elk121节点上创建myid文件

[root@elk121 ~]# for ((host_id=121;host_id\<=123;host_id++)) do ssh 192.168.1.\${host_id} "echo \${host_id} > /es/data/zk/myid";done

6、所有节点启动zk服务

说明:elk122节点和elk123节点重新生效环境变量

[root@elk122 ~]# source /etc/profile.d/kafka.sh
[root@elk123 ~]# source /etc/profile.d/kafka.sh

说明:elk121节点需要杀掉zk进程重新启动

[root@elk121 ~]# jps | grep QuorumPeerMain
6095 QuorumPeerMain
[root@elk121 ~]# kill 6095

所有节点启动服务

[root@elk121 ~]# zkServer.sh start
[root@elk122 ~]# zkServer.sh start
[root@elk123 ~]# zkServer.sh start

7、在所有节点上查看zk的角色状态,观察到elk123节点为leader

[root@elk121 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /es/softwares/zk/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@elk122 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /es/softwares/zk/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@elk123 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /es/softwares/zk/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

注意:因为三个节点的事务ID一样,会比较myid值,值越大,就是leader

8、在elk121节点上编写zk的集群管理脚本,更容易管理集群

[root@elk121 ~]# vim /usr/local/sbin/zkManager.sh
#!/bin/bash
#判断用户是否传参
if [ $# -ne 1 ];then
echo "无效参数,用法为: $0 {start|stop|restart|status}"
exit
fi
#获取用户输入的命令
cmd=$1
#定义函数功能
function zookeeperManger(){
case $cmd in
start)
echo "启动服务"
remoteExecution start
;;
stop)
echo "停止服务"
remoteExecution stop
;;
restart)
echo "重启服务"
remoteExecution restart
;;
status)
echo "查看状态"
remoteExecution status
;;
*)
echo "无效参数,用法为: $0 {start|stop|restart|status}"
;;
esac
}
#定义执行的命令
function remoteExecution(){
for (( i=121 ; i<=123 ; i++ )) ; do
tput setaf 2
echo ========== 192.168.1.${i} zkServer.sh $1 ================
tput setaf 9
ssh 192.168.1.${i} "source /etc/profile.d/kafka.sh; zkServer.sh $1 2>/dev/null"
done
}
#调用函数
zookeeperManger

脚本赋权

[root@elk121 ~]# chmod +x /usr/local/sbin/zkManager.sh

9、在elk121节点上进行集群管理

(1)停止zk集群

[root@elk121 ~]# zkManager.sh stop
停止服务
========== 192.168.1.121 zkServer.sh stop ================
Stopping zookeeper ... STOPPED
========== 192.168.1.122 zkServer.sh stop ================
Stopping zookeeper ... STOPPED
========== 192.168.1.123 zkServer.sh stop ================
Stopping zookeeper ... STOPPED

(2)启动zk集群

[root@elk121 ~]# zkManager.sh start
启动服务
========== 192.168.1.121 zkServer.sh start ================
Starting zookeeper ... STARTED
========== 192.168.1.122 zkServer.sh start ================
Starting zookeeper ... STARTED
========== 192.168.1.123 zkServer.sh start ================
Starting zookeeper ... STARTED

(3)查看zk集群

[root@elk121 ~]# zkManager.sh status
查看状态
========== 192.168.1.121 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
========== 192.168.1.122 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
========== 192.168.1.123 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

10、在elk121节点测试连接zk集群

[root@elk121 ~]# zkCli.sh -server 192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181
[zk: 192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181(CONNECTED) 0] ls /
[zookeeper]

三、命令行管理

3.1 创建znode

1、在elk121节点的根路径下创建一个名为"oldboyedu-linux85"的"znode"

[root@elk121 ~]# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] create /oldboyedu-linux85

2、在elk121节点的"/oldboyedu-linux85/"znode下创建一个名为"jiaoshi07"的子znode,并指定该znode数据为"123"

[zk: localhost:2181(CONNECTED) 1] create /oldboyedu-linux85/jiaoshi07 123

3、在elk121节点创建一个前缀为"/oldboyedu-linux85/jiaoshi07/liwenxuan"有序编号的znode,数据为88888

[zk: localhost:2181(CONNECTED) 2] create -s /oldboyedu-linux85/jiaoshi07/liwenxuan 88888

相关参数说明:

  • -s:代表随机生成序号

4、在elk121节点创建一个名为"/oldboyedu-linux85/test"的临时znode。当前会话结束,临时znode会自动删除。

[zk: localhost:2181(CONNECTED) 5] create -s -e /oldboyedu-linux85/test

相关参数说明:

  • -s:代表随机生成序号

  • -e:代表是临时znode

查看是否是临时节点

[zk: localhost:2181(CONNECTED) 7] stat /oldboyedu-linux85/test0000000001
cZxid = 0x6
ctime = Tue Jan 16 16:00:27 CST 2024
mZxid = 0x6
mtime = Tue Jan 16 16:00:27 CST 2024
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x10000f274470000
dataLength = 0
numChildren = 0

说明:如果ephemeralOwner为0代表是znode就是持久节点;否则就是临时节点

3.2 查看znode

1、在elk121节点查看根(/)下有多少子zookeeper node,简称"znode"

[zk: localhost:2181(CONNECTED) 9] ls /
[oldboyedu-linux85, zookeeper]

2、在elk121节点查看"/oldboyedu-linux85/jiaoshi07"的数据

[zk: localhost:2181(CONNECTED) 10] get /oldboyedu-linux85/jiaoshi07
123

3.3 修改znode

1、在elk121节点将"/oldboyedu-linux85/jiaoshi07 "的znode数据修改为456.

[zk: localhost:2181(CONNECTED) 11] set /oldboyedu-linux85/jiaoshi07 456
[zk: localhost:2181(CONNECTED) 12] get /oldboyedu-linux85/jiaoshi07
456

3.4 删除znode

1、在elk121节点删除名为"/oldboyedu-linux85/jiaoshi07/liwenxuan0000000000"的znode,但该znode不能有子znode。即必须为空。

[zk: localhost:2181(CONNECTED) 15] delete /oldboyedu-linux85/jiaoshi07/liwenxuan0000000000
[zk: localhost:2181(CONNECTED) 16] ls /oldboyedu-linux85/jiaoshi07
[]

2、在elk121节点递归删除"/oldboyedu-linux85"下的所有znode,包括/oldboyedu-linux85

[zk: localhost:2181(CONNECTED) 19] deleteall /oldboyedu-linux85
[zk: localhost:2181(CONNECTED) 21] ls /
[zookeeper]

四、zookeeper集群优化

4.1 修改zookeeper的堆内存大小

温馨提示:修改zookeeper的堆内存大小,一般情况下,生产环境给到2G足以,如果规模较大可以适当调大到4G。

1、在elk121节点上查看zk默认的堆内存大小为1GB。

2、在elk121节点上配置ZK的堆内存为2G

[root@elk121 ~]# cat > /es/softwares/zk/conf/java.env << 'EOF'
export JAVA_HOME=/es/softwares/jdk1.8.0_291
export JVMFLAGS="-Xms2g -Xmx2g $JVMFLAGS"
EOF

3、在elk121节点上将配置文件同步到集群的其他zk节点上

[root@elk121 ~]# data_rsync.sh /es/softwares/zk/conf/java.env

4、在elk121节点上重启ZK集群

[root@elk121 ~]# zkManager.sh restart

5、在elk121节点上验证堆内存

五、使用zkWeb管理zookeeper集群

1、下载zkWeb-v1.2.1.jar

下载地址:https://github.com/zhitom/zkweb/releases/download/zkWeb-v1.2.1/zkWeb-v1.2.1.jar

2、在elk121节点上启动

[root@elk121 ~]# nohup java -jar zkWeb-v1.2.1.jar &

3、打开浏览器输入http://192.168.1.121:8099/进行访问

4、测试常规操作

(1)连接集群

(2)添加znode

右键【/】选择【添加】

输入节点名称【znode01】

(3)给新创建的znode01写入1111

登录集群进行验证

[root@elk121 ~]# zkCli.sh -server 192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181
[zk: 192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181(CONNECTED) 1] get /znode01
1111