ZooKeeper 设计核心概念
1. 数据模型(Znode)
- 层次命名空间:类似文件系统的树形结构
- Znode类型:
- 持久节点:客户端断开后仍存在
- 临时节点:客户端会话结束时自动删除
- 顺序节点:自动附加单调递增序号
- 临时顺序节点:临时+顺序的组合
2. 会话机制
- 客户端与服务器建立TCP长连接
- 会话超时(Session Timeout)控制连接有效性
- 心跳机制维持会话活跃
3. Watch机制
- 一次性触发器
- 异步通知客户端节点变化
- 支持的数据事件:NodeCreated/Deleted/DataChanged/ChildrenChanged
4. 原子广播协议(Zab)
- 恢复模式:选举Leader,同步数据
- 广播模式:处理事务请求,保证顺序性
- 两阶段提交:Proposal + Commit
5. 集群角色
- Leader:处理所有写请求,发起提案
- Follower:处理读请求,参与选举和提案投票
- Observer:处理读请求,不参与投票(提高扩展性)
6. 一致性保证
- 顺序一致性
- 原子性
- 单一系统映像
- 可靠性
- 实时性(最终一致)
ZooKeeper 安装配置
单机模式安装
1. 环境准备
# 下载(以3.8.3为例)
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz
# 解压
tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz
mv apache-zookeeper-3.8.3-bin /opt/zookeeper
2. 配置单机模式
cd /opt/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
zoo.cfg 基本配置:
# 基本时间单位(毫秒)
tickTime=2000
# 数据目录
dataDir=/opt/zookeeper/data
# 客户端连接端口
clientPort=2181
# 最大客户端连接数
maxClientCnxns=60
# 快照保留数量
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
3. 启动服务
# 启动
/opt/zookeeper/bin/zkServer.sh start
# 查看状态
/opt/zookeeper/bin/zkServer.sh status
# 客户端连接
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
集群模式安装(以3节点为例)
1. 配置 zoo.cfg
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=10
syncLimit=5
# 集群配置 server.id=host:port1:port2
# port1: 集群内部通信端口
# port2: 选举端口
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
# 开启四字命令
4lw.commands.whitelist=*
2. 创建 myid 文件
# 在每台服务器的 dataDir 目录下
echo "1" > /opt/zookeeper/data/myid # 节点1
echo "2" > /opt/zookeeper/data/myid # 节点2
echo "3" > /opt/zookeeper/data/myid # 节点3
3. 启动集群
# 每台服务器执行
/opt/zookeeper/bin/zkServer.sh start
# 查看集群状态
/opt/zookeeper/bin/zkServer.sh status
关键配置参数详解
必需配置
| 参数 |
说明 |
建议值 |
|---|
clientPort |
客户端连接端口 |
2181 |
dataDir |
数据目录 |
独立磁盘 |
tickTime |
基础时间单位(ms) |
2000 |
集群配置
| 参数 |
说明 |
建议值 |
|---|
initLimit |
Follower初始化连接超时(tick倍数) |
10-20 |
syncLimit |
Follower同步超时 |
5 |
server.id |
集群服务器列表 |
host:port1:port2 |
性能调优
| 参数 |
说明 |
|---|
maxClientCnxns |
单客户端最大连接数 |
jute.maxbuffer |
单个数据节点最大数据量(默认1MB) |
preAllocSize |
事务日志预分配大小 |
监控与维护
1. 四字命令
# 查看状态
echo stat | nc localhost 2181
# 查看连接
echo cons | nc localhost 2181
# 监控
echo mntr | nc localhost 2181
# 环境
echo envi | nc localhost 2181
2. JMX 监控
# 启动时开启JMX
export JMXLOCALONLY=false
export JMXPORT=9999
export JMXAUTH=false
export JMXSSL=false
# 或添加JVM参数
export SERVER_JVMFLAGS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
3. 日志管理
# 修改日志配置 conf/log4j.properties
zookeeper.root.logger=INFO, ROLLINGFILE
log4j.appender.ROLLINGFILE.MaxFileSize=100MB
log4j.appender.ROLLINGFILE.MaxBackupIndex=10
生产环境建议
硬件要求
- 内存:≥4GB(根据节点数调整)
- 磁盘:SSD,独立磁盘存储事务日志
- 网络:低延迟内网通信
配置优化
# 生产环境示例配置
tickTime=2000
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log # 事务日志分离
clientPort=2181
maxClientCnxns=100
minSessionTimeout=4000
maxSessionTimeout=40000
snapCount=100000
autopurge.snapRetainCount=10
autopurge.purgeInterval=24
forceSync=yes
skipACL=no
standaloneEnabled=false # 3.5+支持,禁用单机模式提升稳定性
安全配置
# 启用认证
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
# 网络隔离
secureClientPort=2281
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.keyStore.location=/path/to/keystore
ssl.keyStore.password=password
常用操作命令
# 连接客户端
zkCli.sh -server host:port
# 常用命令
create /path data # 创建节点
get /path # 获取数据
set /path newData # 设置数据
ls /path # 列出子节点
delete /path # 删除节点
rmr /path # 递归删除
注意事项:
集群节点数建议为奇数(3、5、7),便于选举
生产环境务必配置事务日志独立目录(dataLogDir)
定期清理快照和事务日志
监控会话数和节点数,避免内存溢出
版本升级时注意兼容性和滚动重启顺序
这样的配置可满足大多数生产环境需求,具体参数需要根据实际业务负载进行调整。