跳到主要内容

环境安装

本章介绍 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
node1192.168.1.1011
node2192.168.1.1022
node3192.168.1.1033

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

配置参数详解

核心配置参数

参数默认值说明
tickTime2000心跳间隔,单位毫秒
dataDir数据存储目录
dataLogDirdataDir事务日志目录
clientPort2181客户端连接端口
initLimit10Follower 初始化连接 Leader 的超时时间(tickTime 倍数)
syncLimit5Follower 与 Leader 同步的超时时间(tickTime 倍数)
maxClientCnxns60单个客户端最大连接数
minSessionTimeout2 * tickTime最小会话超时时间
maxSessionTimeout20 * 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 的安装和配置:

  1. 单机模式:适合开发和测试,配置简单
  2. 集群模式:适合生产环境,需要至少 3 个节点
  3. Docker 安装:快速部署,适合容器化环境
  4. 配置参数:理解核心参数的含义和优化方法

下一章我们将深入学习 ZooKeeper 的数据模型和 ZNode。