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

http://10.0.0.91:8099/

posted @ 2025-04-06 19:22  丁志岩  阅读(53)  评论(0)    收藏  举报