Zookeeper集群学习笔记
一、zookeeper单点部署
1.什么是zookeeper
-
zookeeper是apache基金会开源的一个顶级项目,其主要的应用场景就是多用于分布式集群起到'协调'服务的作用。
-
zookeeper的应用场景主要有:配置中心,注册中心,服务发现等。
-
官网地址:
-
根据官网图示,设置三个节点的zookeeper集群最为合适

export JAVA_HOME=/usr/share/elasticsearch/jdk
export PATH=$PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin
2.下载zookeeper软件包
root@elk91:~# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
3.解压软件包
[root@elk91 ~]# tar xf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local/
4.创建符号链接
[root@elk91 ~]# ln -svf /usr/local/apache-zookeeper-3.8.4-bin /usr/local/zookeeper
5.添加环境变量
[root@elk91 ~]# cat /etc/profile.d/zk.sh
#!/bin/bash
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
[root@elk91 ~]# source /etc/profile.d/zk.sh
6.准备配置文件
[root@elk91 ~]# cp /usr/local/zookeeper/conf/zoo{_sample,}.cfg
7.启动zookeeper服务
[root@elk91 ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@elk91 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
#停止服务
[root@elk91 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
8.连接zookeeper服务
[root@elk91 ~]# zkCli.sh
Connecting to localhost:2181
...
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
二、zookeeper集群部署
1.停止zookeeper的单点模式
[root@elk91 ~]# zkServer.sh stop
2.修改配置文件
[root@elk91 ~]# cat > /usr/local/zookeeper/conf/zoo.cfg <<EOF
# 定义最小单元的时间范围tick。
tickTime=2000
# 启动时最长等待tick数量。
initLimit=5
# 数据同步时最长等待的tick时间进行响应ACK
syncLimit=2
# 指定数据目录
dataDir=/dezyan/data/zk
# 监听端口
clientPort=2181
# 开启四字命令允许所有的节点访问。
4lw.commands.whitelist=*
# server.ID=A:B:C[:D]
# ID:
# zk的唯一编号。
# A:
# zk的主机地址。
# B:
# leader的选举端口,是谁leader角色,就会监听该端口。
# C:
# 数据通信端口。
# D:
# 可选配置,指定角色。
server.91=10.0.0.91:2888:3888
server.92=10.0.0.92:2888:3888
server.93=10.0.0.93:2888:3888
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
EOF
3.拷贝软件包到集群的其他节点
[root@elk91 ~]# cat /etc/profile.d/zk.sh
#!/bin/bash
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
[root@elk91 ~]# scp -r /usr/local/zookeeper 10.0.0.92:/usr/local/
[root@elk91 ~]# scp -r /usr/local/zookeeper 10.0.0.93:/usr/local/
[root@elk91 ~]# scp /etc/profile.d/zk.sh 10.0.0.92:/etc/profile.d/
[root@elk91 ~]# scp /etc/profile.d/zk.sh 10.0.0.93:/etc/profile.d/
4.elk91节点配置免密登录
[root@elk91 ~]# apt -y install expect
[root@elk91 ~]# cat > password_free_login.sh <<'EOF'
#!/bin/bash
# auther: dezyan ding
# 创建密钥对
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
# 声明你服务器密码,建议所有节点的密码均一致,否则该脚本需要再次进行优化
export mypasswd=1
# 定义主机列表
elk_list=(10.0.0.91 10.0.0.92 10.0.0.93)
# 配置免密登录,利用expect工具免交互输入
for i in ${elk_list[@]};do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$mypasswd\r\"; exp_continue}
}"
done
EOF
[root@elk91 ~]# bash password_free_login.sh
5.准备myid文件
[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "install -d /dezyan/data/zk && echo $i > /dezyan/data/zk/myid";done
6.启动zookeeper集群
#执行环境变量脚本,启动各个节点的zk服务
[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "source /etc/profile.d/zk.sh && zkServer.sh start";done
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#查看各个节点的状态
[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "zkServer.sh status";done
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
7.连接集群测试
[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
Connecting to 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
...
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
[zookeeper]
8.停止Leader节点观察服务是否正常还使用,验证zookeeper的高可用
①停止Leader
[root@elk92 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
②观察Leader变化
[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "source /etc/profile.d/zk.sh && zkServer.sh status";done
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
③得出高可用集群结论
如果集群要对外部提供服务,最少要保证半数以上的服务存活的。
换句话说,如果你想要一个zk集群,容忍N台节点故障,则需要准备2N+1台服务器。
所以分布式服务通常是单数节点
三、修改zookeeper集群的堆内存大小
1.查看默认的堆内存大小
[root@elk91 ~]# ps -ef | grep zookeeper
root 26219 1 0 17:09 pts/1 00:00:03 /usr/share/elasticsearch/jdk/bin/java ... -Xmx1000m...
2.生产环境调优说明
对于环境中,如果数据量不大的,默认1GB是够用的,如果数据量较大,建议将堆内存调大,比如4GB。而学习环境中,仅需要128m就可以了。
3.修改堆内存映射
[root@elk91 ~]# vim /usr/local/zookeeper/bin/zkEnv.sh
...
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-128}
#同步到其他节点
[root@elk91 ~]# scp /usr/local/zookeeper/bin/zkEnv.sh 10.0.0.92:/usr/local/zookeeper/bin/
[root@elk91 ~]# scp /usr/local/zookeeper/bin/zkEnv.sh 10.0.0.93:/usr/local/zookeeper/bin/
4.重启zookeeper集群
[root@elk91 ~]# zkServer.sh restart
[root@elk92 ~]# zkServer.sh restart
[root@elk93 ~]# zkServer.sh restart
5.验证测试
[root@elk91 ~]# ps -ef | grep zookeeper
root 26581 1 5 17:41 pts/1 00:00:01 /usr/share/elasticsearch/jdk/bin/java .. -Xmx128m -Xmx128m ..
四、zookeeper的leader选举流程
- 1.先比较zxid;
- 2.再比较myid
五、zookeeper node的基础操作
1.连接集群
[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
2.查看集群的zookeeper node(znode)列表
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1]
3.创建znode
create /节点名 数据
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 5] create /dingzhiyan dezyan
Created /dingzhiyan
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] ls /
[dingzhiyan, zookeeper]
4.查看znode的数据
get /节点名
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] get /dingzhiyan
dezyan
5.修改znode数据
set /节点名 数据
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 9] set /dingzhiyan dzy
6.创建子znode
create /节点名/子节点名 数据
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] create /dingzhiyan/ddd zzz
7.删除znode
delete 节点名
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 4] ls /dingzhiyan/ddd
[one, two]
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 5] delete /dingzhiyan/
ddd/one
deleteall 节点名 递归删除
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] deleteall /dingzhiyan/ddd
六、zookeeper node类型
- 临时znode:随着当前链接断开,自动删除。
- 永久znode:链接断开后,不会删除。
案例
1.创建临时的znode
[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
#创建临时znode
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 38] create -e /dingzhiyan/xixi 哈哈
#创建永久znode
create /dingzhiyan/haha 嘻嘻
2.查看两种znode的状态
#临时znode
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 11] stat /dingzhiyan/xixi
cZxid = 0x210000000e
ctime = Sun Mar 16 20:28:04 CST 2025
mZxid = 0x210000000e
mtime = Sun Mar 16 20:28:04 CST 2025
pZxid = 0x210000000e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x5d0004adf9f60001 #临时的有值效于当前会话的session id
dataLength = 6
numChildren = 0
#永久znode
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 12] stat /dingzhiyan/haha
cZxid = 0x210000000f
ctime = Sun Mar 16 20:28:46 CST 2025
mZxid = 0x210000000f
mtime = Sun Mar 16 20:28:46 CST 2025
pZxid = 0x210000000f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0 #永久的为0x0
dataLength = 6
numChildren = 0
3.断开会话,等到30s后会自动删除
[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
# 刚开始链接时,由于没有到30s,因此不会丢失,时间一到就会丢失。
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /dingzhiyan
[haha]
七、zookeeper的watch机制
1.watch机制
实时监控某个zookeeper node的变化,从而通知对应客户端,而后由客户端触发相应的"回调函数"。
2.实战案例
①可以监控某个znode子节点的变化
ls -w /dingzhiyan
②监控数据的变化
get -w /dingzhiyan
八、安装zkWeb实现zookeeper的WebUI管理
1.下载解压JDK8、zkweb
[root@elk91 ~]# tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
2.使用JDK8启动zkWeb
[root@elk91 ~]# /usr/local/jdk1.8.0_291/bin/java -jar zkWeb-v1.2.1.jar
3.访问zkWeb的UI


本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18811484

浙公网安备 33010602011771号