环境安装
本章介绍 ZooKeeper 的安装和配置方法,包括单机模式和集群模式。
系统要求
在安装 ZooKeeper 之前,请确保系统满足以下要求:
| 要求 | 说明 |
|---|---|
| Java 版本 | JDK 8 或更高版本 |
| 操作系统 | Linux、Windows、macOS |
| 内存 | 至少 512MB 可用内存 |
| 磁盘 | 事务日志建议使用独立磁盘 |
下载 ZooKeeper
从 Apache 官方网站下载 ZooKeeper:
# 访问下载页面
# https://zookeeper.apache.org/releases.html
# 使用 wget 下载(以 3.8.4 为例)
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
# 解压
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
# 进入目录
cd apache-zookeeper-3.8.4-bin
单机模式安装
单机模式适合开发和测试环境。
1. 配置环境变量
# 编辑 ~/.bashrc 或 ~/.zshrc
export ZOOKEEPER_HOME=/path/to/apache-zookeeper-3.8.4-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 使配置生效
source ~/.bashrc
2. 创建配置文件
# 创建数据目录
mkdir -p /tmp/zookeeper/data
# 创建配置文件
cd $ZOOKEEPER_HOME/conf
cp zoo_sample.cfg zoo.cfg
编辑 zoo.cfg 文件:
# 心跳间隔(毫秒)
tickTime=2000
# 数据目录
dataDir=/tmp/zookeeper/data
# 客户端连接端口
clientPort=2181
# 数据快照数量阈值
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
3. 启动服务
# 启动 ZooKeeper
zkServer.sh start
# 查看状态
zkServer.sh status
# 停止服务
zkServer.sh stop
# 重启服务
zkServer.sh restart
4. 验证安装
# 使用客户端连接
zkCli.sh -server localhost:2181
# 在客户端中执行命令
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /test "hello world"
Created /test
[zk: localhost:2181(CONNECTED) 2] get /test
hello world
[zk: localhost:2181(CONNECTED) 3] quit
集群模式安装
生产环境建议使用集群模式,至少需要 3 个节点。
1. 规划集群
假设我们部署 3 个节点的集群:
| 节点 | IP 地址 | myid |
|---|---|---|
| node1 | 192.168.1.101 | 1 |
| node2 | 192.168.1.102 | 2 |
| node3 | 192.168.1.103 | 3 |
2. 配置各节点
在每个节点上执行以下操作:
创建 myid 文件:
# 在 node1 上执行
echo "1" > /tmp/zookeeper/data/myid
# 在 node2 上执行
echo "2" > /tmp/zookeeper/data/myid
# 在 node3 上执行
echo "3" > /tmp/zookeeper/data/myid
编辑 zoo.cfg(所有节点相同):
# 心跳间隔(毫秒)
tickTime=2000
# Follower 连接 Leader 的超时时间(心跳数)
initLimit=10
# Follower 与 Leader 同步的超时时间(心跳数)
syncLimit=5
# 数据目录
dataDir=/tmp/zookeeper/data
# 客户端连接端口
clientPort=2181
# 集群配置
# server.id=host:peerPort:leaderPort
# id: 服务器标识,与 myid 文件中的值对应
# peerPort: 集群节点间通信端口
# leaderPort: Leader 选举端口
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
# 自动清理配置
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
3. 启动集群
在每个节点上启动 ZooKeeper:
# 启动服务
zkServer.sh start
# 查看状态(其中一个应该是 Leader)
zkServer.sh status
4. 验证集群
# 连接到任意节点
zkCli.sh -server 192.168.1.101:2181
# 创建节点
[zk: 192.168.1.101:2181(CONNECTED) 0] create /cluster-test "cluster data"
# 连接到另一个节点验证数据同步
zkCli.sh -server 192.168.1.102:2181
[zk: 192.168.1.102:2181(CONNECTED) 0] get /cluster-test
cluster data
配置参数详解
核心配置参数
| 参数 | 默认值 | 说明 |
|---|---|---|
tickTime | 2000 | 心跳间隔,单位毫秒 |
dataDir | 无 | 数据存储目录 |
dataLogDir | dataDir | 事务日志目录 |
clientPort | 2181 | 客户端连接端口 |
initLimit | 10 | Follower 初始化连接 Leader 的超时时间(tickTime 倍数) |
syncLimit | 5 | Follower 与 Leader 同步的超时时间(tickTime 倍数) |
maxClientCnxns | 60 | 单个客户端最大连接数 |
minSessionTimeout | 2 * tickTime | 最小会话超时时间 |
maxSessionTimeout | 20 * tickTime | 最大会话超时时间 |
性能优化参数
# 快照数量阈值,超过后自动清理
autopurge.snapRetainCount=3
# 清理间隔(小时),0 表示禁用自动清理
autopurge.purgeInterval=1
# 预分配事务日志文件大小(KB)
preAllocSize=65536
# 快照文件大小阈值(字节)
snapCount=100000
# 最大请求队列长度
maxRequestQueueSize=100
# 提交处理器线程数
commitProcessorThreads=4
集群配置参数
# 集群节点配置
# server.id=host:peerPort:leaderPort
server.1=host1:2888:3888
server.2=host2:2888:3888
server.3=host3:2888:3888
# Observer 节点配置(不参与投票)
server.4=host4:2888:3888:observer
使用 Docker 安装
单机模式
# 拉取镜像
docker pull zookeeper:3.8.4
# 启动容器
docker run -d \
--name zookeeper \
-p 2181:2181 \
zookeeper:3.8.4
# 查看日志
docker logs -f zookeeper
集群模式(Docker Compose)
创建 docker-compose.yml 文件:
version: '3.8'
services:
zoo1:
image: zookeeper:3.8.4
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo2:
image: zookeeper:3.8.4
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo3:
image: zookeeper:3.8.4
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
启动集群:
# 启动
docker-compose up -d
# 查看状态
docker-compose ps
# 停止
docker-compose down
日志配置
日志级别
编辑 conf/log4j.properties:
# 根日志级别
zookeeper.root.logger=INFO, CONSOLE
# 滚动日志配置
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
log4j.appender.ROLLINGFILE.MaxBackupIndex=10
日志目录
# 默认日志目录
$ZOOKEEPER_HOME/logs
# 查看日志
tail -f $ZOOKEEPER_HOME/logs/zookeeper-*.out
常见问题排查
1. 端口被占用
# 检查端口占用
netstat -tlnp | grep 2181
# 或使用 lsof
lsof -i :2181
2. 无法启动集群
检查以下几点:
- 各节点的
myid文件是否正确 - 防火墙是否开放端口(2181, 2888, 3888)
- 各节点时间是否同步
# 检查防火墙
firewall-cmd --list-ports
# 开放端口
firewall-cmd --add-port=2181/tcp --permanent
firewall-cmd --add-port=2888/tcp --permanent
firewall-cmd --add-port=3888/tcp --permanent
firewall-cmd --reload
3. 内存不足
调整 JVM 内存:
# 编辑 zkEnv.sh
export JVMFLAGS="-Xms512m -Xmx512m $JVMFLAGS"
4. 磁盘空间不足
# 检查磁盘空间
df -h
# 清理快照和日志
# 建议使用自动清理配置
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
小结
本章介绍了 ZooKeeper 的安装和配置:
- 单机模式:适合开发和测试,配置简单
- 集群模式:适合生产环境,需要至少 3 个节点
- Docker 安装:快速部署,适合容器化环境
- 配置参数:理解核心参数的含义和优化方法
下一章我们将深入学习 ZooKeeper 的数据模型和 ZNode。