ZooKeeper 是 Apache 开源的分布式协调服务,旨在为分布式系统提供高可靠的配置管理、分布式同步、集群管理等功能。其设计目标是通过简单的接口,解决分布式系统中常见的一致性、可靠性和协作问题,被广泛应用于分布式存储(如 HBase)、消息中间件(如 Kafka)等场景。
ZooKeeper 采用双版本分支策略,分为稳定版(Stable)和当前版(Current)。以最新文档为例,稳定版为 3.8.x,当前版为 3.9.x。当新版本发布后,旧稳定版将在约半年后终止支持(EoL),期间仅提供安全和关键修复。例如,3.7 版本已于 2024 年 2 月 2 日停止支持,用户需及时升级以确保系统安全。
官方提供各版本二进制包和源码包下载,地址:Apache ZooKeeper。下载后需通过 PGP 签名和 SHA-512 哈希验证文件完整性,具体可参考官方文档《Verifying Hashes and Signatures》。
通过ZAB(ZooKeeper Atomic Broadcast)协议确保数据在集群中的强一致性,即使部分节点故障,剩余节点仍能组成多数派(Quorum)维持服务。
采用类似文件系统的树形结构(ZNode)存储数据,支持持久节点、临时节点(会话结束后自动删除)、顺序节点(自动生成递增序号)等类型,适用于分布式锁、领导者选举等场景。
客户端可对 ZNode 的创建、删除、数据变更等事件注册监听器,实现分布式事件通知,降低系统间的耦合度。
支持动态扩缩容,通过 Observer 节点(不参与投票)提升读性能,同时 3.9 版本引入 Netty-TcNative OpenSSL 支持和性能优化,进一步提升吞吐量。
ZooKeeper 通过 ** 事务日志(transaction log)和数据快照(snapshot)** 实现数据持久化:
事务日志:记录所有写操作,确保数据变更的顺序性和可恢复性,默认存储于dataLogDir
目录。
数据快照:定期将内存中的数据状态写入磁盘,用于快速恢复,默认存储于dataDir
目录。
配置示例(zoo.cfg
):
dataDir=/var/lib/zookeeper
dataLogDir=/var/log/zookeeper
systemctl stop firewalld # 临时关闭
systemctl disable firewalld # 永久关闭
# 上传安装包到/opt/modules目录
cd /opt/modules
tar -zxvf zookeeper-3.9.3-bin.tar.gz -C /opt/installs/
cd /opt/installs/
mv zookeeper-3.9.3-bin zookeeper # 重命名
cd zookeeper/conf
mv zoo_sample.cfg zoo.cfg # 重命名配置文件
tickTime=2000 # 基本时间单元(ms)
initLimit=10 # ollower初始连接时的超时时间(tickTime倍数)
syncLimit=5 # follower与leader同步数据的超时时间(tickTime倍数)
dataDir=/opt/installs/zookeeper/data # 数据目录(需手动创建)
dataLogDir=/opt/installs/zookeeper/logs # 日志目录(需手动创建)
clientPort=2181 # 客户端连接端口
server.1=bigdata01:2888:3888 # 节点1(IP:选举端口:通信端口)
server.2=bigdata02:2888:3888 # 节点2
server.3=bigdata03:2888:3888 # 节点3
# 在dataDir目录下创建myid文件,写入节点ID(1/2/3)
echo 1 > /opt/installs/zookeeper/data/myid # 节点1执行
echo "export ZOOKEEPER_HOME=/opt/installs/zookeeper" >> /etc/profile
echo "export PATH=\$PATH:\$ZOOKEEPER_HOME/bin" >> /etc/profile
source /etc/profile # 刷新配置
在/usr/local/bin
目录创建脚本,简化集群操作:
#!/bin/bash
case $1 in
"start"){
for i in 1 2 3; do
ssh bigdata0${i} "zkServer.sh start"
done
};;
"stop"){
for i in 1 2 3; do
ssh bigdata0${i} "zkServer.sh stop"
done
};;
"status"){
for i in 1 2 3; do
ssh bigdata0${i} "zkServer.sh status"
done
};;
esac
使用实例:
zk.sh start # 启动集群
zk.sh status # 查看各节点状态
zkCli.sh -server bigdata01:2181 # 连接单节点
zkCli.sh -server bigdata01:2181,bigdata02:2181,bigdata03:2181 # 连接集群
命令 | 描述 |
---|---|
ls /path |
查看指定路径下的子节点 |
get /path |
获取节点数据及元信息(版本号、时间戳等) |
create /path data |
创建持久节点(默认类型) |
create -e /path data |
创建临时节点 |
create -s /path data |
创建顺序节点(自动生成后缀如path0000000001 ) |
set /path new_data |
更新节点数据 |
delete /path |
删除空节点(若有子节点需使用deleteall ) |
deleteall /path |
递归删除节点及其子节点 |
get /config watch # 监听/config节点的数据变更
ls /nodes watch # 监听/nodes节点的子节点变更
安装:下载prettyZoo,解压后直接运行。
功能:可视化浏览 ZNode 树,支持节点增删改查、监听管理,界面友好。
轻量级客户端,支持命令行和简单图形界面,适合快速调试。
tar -zxvf kafka-ui-lite-1.2.11-bin.tar.gz -C /opt/installs/
mv kafka-ui-lite-1.2.11 kafka-ui
echo "export KAFKA_UI_HOME=/opt/installs/kafka-ui" >> /etc/profile
echo "export PATH=\$PATH:\$KAFKA_UI_HOME/bin" >> /etc/profile
source /etc/profile
cd /opt/installs/kafka-ui/bin
./kafkaUI.sh start # 启动服务
访问地址:http://bigdata01:8889