官网:https://zookeeper.apache.org/
核心功能:分布式应用的协调服务(配置管理、命名服务、分布式锁、集群管理)
数据模型:层次化的命名空间(类似文件系统)
一致性保证:基于ZAB协议的原子广播,保证顺序一致性
| 特性 | 说明 | 应用场景 |
|---|---|---|
顺序一致性 |
客户端更新按顺序应用 |
分布式锁、队列 |
原子性 |
更新操作要么成功要么失败 |
配置更新 |
单一系统映像 |
客户端连接到任意服务器看到相同视图 |
服务发现 |
可靠性 |
一旦更新生效则持久化 |
元数据存储 |
实时性 |
客户端在一定时间内看到最新视图 |
监控系统 |

Leader:处理所有写请求,发起提案投票
Follower:处理读请求,参与Leader选举投票
Observer:仅处理读请求,不参与投票(扩展读性能)
连接zookeeper
# 连接本地Zookeeper zkCli.sh -server localhost:2181 # 连接远程Zookeeper zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181 # 连接时指定超时时间 zkCli.sh -server localhost:2181 -timeout 5000
基础操作命令
# 查看帮助 help # 查看命令历史 history # 退出客户端 quit # 连接状态 stat
节点创建与查看
# 创建持久节点 create /test "hello zookeeper" # 创建临时节点(会话结束自动删除) create -e /temp_node "temporary data" # 创建顺序节点 create -s /seq_node "sequential data" # 查看节点 get /test # 查看节点状态信息 stat /test
节点列表操作
# 列出子节点 ls / # 递归列出所有子节点 ls -R / # 列出节点并显示状态信息 ls2 / # 3.4.x版本 ls -s / # 3.5.x+版本
节点修改与删除
# 修改节点数据 set /test "updated data" # 带版本号修改(乐观锁) set /test "new data" 1 # 删除节点 delete /test # 递归删除节点及其子节点 deleteall /path
监听(Watch)机制
# 设置数据变化监听 get /test watch # 设置子节点变化监听 ls / watch # 永久监听(3.6.0+) addWatch /test
ACL权限管理
# 查看节点ACL getAcl /test # 设置ACL权限 setAcl /test world:anyone:crwda # 创建带ACL的节点 create /secure_node "secret" world:anyone:r
认证与授权
# 添加认证 addauth digest username:password # 使用认证创建节点 create /secure_node "data" digest:username:password:cdrwa # 查看认证信息 echo srst | nc localhost 2181
# 1. 服务器状态监控 # 服务器统计信息 echo stat | nc localhost 2181 # 服务器健康检查 echo ruok | nc localhost 2181 # 连接信息 echo cons | nc localhost 2181 # 环境变量 echo envi | nc localhost 2181 # 2.高级监控命令 # 监控信息 echo mntr | nc localhost 2181 # 服务器跟踪 echo srvr | nc localhost 2181 # 连接跟踪 echo crst | nc localhost 2181 # 观察者信息 echo wchs | nc localhost 2181
集群规模规划
| 节点数量 | 容错能力 | 适用场景 |
|---|---|---|
3节点 |
1节点故障 |
开发测试环境 |
5节点 |
2节点故障 |
生产环境推荐 |
7节点+ |
N/2-1节点故障 |
超大规模集群 |
# 所有节点执行
# 创建专用用户
[root@elk-91 ~]# groupadd zookeeper
[root@elk-91 ~]# useradd -g zookeeper zookeeper
# 创建目录结构
[root@elk-91 ~]# mkdir -p /opt/zookeeper/{data,logs,conf,bin}
[root@elk-91 ~]# mkdir -p /var/log/zookeeper
# 以下操作所有节点执行 # 下载安装包(以3.9.4为例) [root@elk-91 ~]# wget https://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.9.4/apache-zookeeper-3.9.4-bin.tar.gz [root@elk-91 ~]# tar -zxvf apache-zookeeper-3.9.4-bin.tar.gz -C /opt/zookeeper/ [root@elk-91 zookeeper]# ln -s apache-zookeeper-3.9.4-bin current # 权限设置 [root@elk-91 ~]# chown -R zookeeper:zookeeper /opt/zookeeper [root@elk-91 ~]# chown -R zookeeper:zookeeper /var/log/zookeeper
## 主配置文件 zoo.cfg,所有节点都要执行 [root@elk-91 ~]# cd /opt/zookeeper/current/conf [root@elk-91 conf]# mv zoo_sample.cfg zoo.cfg [root@elk-91 conf]# cat zoo.cfg # 增加会话超时容忍度 # 定义最小单元的时间范围tick tickTime=2000 # 启动时最长等待tick数量 initLimit=10 # 数据同步时最长等待的tick时间进行响应ACK syncLimit=5 # 指定数据目录 dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/logs # 监听端口 clientPort=2181 # 网络优化 clientPortAddress=0.0.0.0 maxClientCnxns=60 autopurge.snapRetainCount=3 autopurge.purgeInterval=1 # 开启四字命令允许所有的节点访问 4lw.commands.whitelist=* # 集群节点配置 server.91=10.0.0.91:2888:3888 server.92=10.0.0.92:2888:3888 server.93=10.0.0.93:2888:3888
节点ID配置
# 在每个节点上创建myid文件,内容为对应的server编号,如果设置错误集群会起不来 # 节点91: [root@elk-91 ~]# echo "91" > /opt/zookeeper/data/myid # 节点92: [root@elk-92 ~]# echo "92" > /opt/zookeeper/data/myid # 节点93: [root@elk-93 ~]# echo "93" > /opt/zookeeper/data/myid
# 创建JVM参数文件,根据实际情况配置,所有节点执行
[root@elk-91 ~]# vi /opt/zookeeper/current/conf/java.env
[root@elk-91 ~]# cat /opt/zookeeper/current/conf/java.env
export JAVA_HOME=/usr/share/elasticsearch/jdk
export JVMFLAGS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35"
# 或者更改zkEnv.sh
[root@elk-92 ~]# grep ^ZK_SERVER_HEAP /opt/zookeeper/current/bin/zkEnv.sh
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}"
[root@elk-92 ~]# sed -i '/^ZK_SERVER_HEAP/s#1000#2000#' /opt/zookeeper/current/bin/zkEnv.sh
# 创建systemd服务文件,所有节点执行 [root@elk-91 ~]# cat > /etc/systemd/system/zookeeper.service << EOF [Unit] Description=Zookeeper Service After=network.target [Service] Type=forking User=zookeeper Group=zookeeper Environment=ZOO_LOG_DIR=/var/log/zookeeper ExecStart=/opt/zookeeper/current/bin/zkServer.sh start ExecStop=/opt/zookeeper/current/bin/zkServer.sh stop ExecReload=/opt/zookeeper/current/bin/zkServer.sh restart Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target EOF # 启动服务 [root@elk-91 ~]# systemctl daemon-reload [root@elk-91 ~]# systemctl enable zookeeper [root@elk-91 ~]# systemctl start zookeeper
zookeeper可视化管理工具ZkWeb安装部署
# 注意:java环境为8 [root@elk-92 ~]# java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) # 下载 [root@elk-92 deploy]# wget https://down-wy2.oss-cn-hongkong.aliyuncs.com/gongju-test/java-tomcat/zkWeb-v1.2.1.jar # 启动 [root@elk-92 deploy]# nohup java -jar zkWeb-v1.2.1.jar >> zkweb.log &
访问并添加节点:http://10.0.0.92:8099