跳到主要内容

Zookeeper 集群部署指南

概述​

本指南介绍如何在 Ubuntu 24.04 上部署 Zookeeper 集群,实现高可用的分布式协调服务。Zookeeper 集群通常用于 Kafka、Hadoop、HBase 等分布式系统的配置管理、命名服务、分布式同步和组服务。

前置条件​

在开始部署之前,请确保满足以下条件:

  1. 操作系统:Ubuntu 24.04 LTS
  2. Java 环境:OpenJDK 11 或更高版本
  3. 网络配置:服务器之间网络互通
  4. 防火墙配置:开放 Zookeeper 端口(2181、2888、3888)

方案优势​

  1. 高可用性:集群模式,任一节点故障不影响服务
  2. 数据一致性:ZAB 协议保证数据强一致性
  3. 原子广播:所有写操作通过 Leader 节点广播
  4. 自动故障转移:Leader 故障时自动选举新 Leader
  5. 高性能:读操作可以在任意节点执行

目录​

  1. 架构设计
  2. 部署规划
  3. 环境准备
  4. Zookeeper 安装
  5. Zookeeper 配置
  6. 启动 Zookeeper
  7. 集群验证
  8. 监控与告警
  9. 故障排除
  10. 最佳实践
  11. 附录

1. 架构设计​

1.1 整体架构​

1.2 角色说明​

角色说明数量选举投票
Leader处理所有写请求,协调数据同步1有
Follower处理读请求,参与 Leader 选举N-1有
Observer处理读请求,不参与选举(可选)N无

1.3 选举机制​

Zookeeper 使用 ZAB(Zookeeper Atomic Broadcast)协议进行 Leader 选举:

  1. 集群启动:所有节点进入 LOOKING 状态
  2. 投票阶段:每个节点投自己一票
  3. 选票比较:比较 ZXID(事务 ID)和 SID(服务器 ID)
  4. Leader 确定:获得过半票数的节点成为 Leader
  5. 状态同步:Leader 同步数据到 Follower

2. 部署规划​

2.1 服务器规划​

组件主机名IP 地址角色说明
Zookeeper 节点 1ubuntu-zk-node110.123.0.191Zookeeper建议作为 Leader
Zookeeper 节点 2ubuntu-zk-node210.123.0.192ZookeeperFollower
Zookeeper 节点 3ubuntu-zk-node310.123.0.193ZookeeperFollower

2.2 端口规划​

端口协议说明
2181TCP客户端连接端口
2888TCP集群内部通信端口(Follower 连接 Leader)
3888TCPLeader 选举端口

2.3 目录规划​

目录说明
/opt/zookeeperZookeeper 安装目录
/var/lib/zookeeperZookeeper 数据目录
/var/log/zookeeperZookeeper 日志目录

3. 环境准备​

在三台 Zookeeper 服务器上执行以下操作:

3.1 安装 Java​

# 更新软件包列表
sudo apt update

# 安装 OpenJDK 11
sudo apt install -y openjdk-11-jdk

# 验证安装
java -version

# 设置 JAVA_HOME 环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' | sudo tee -a /etc/environment
source /etc/environment

3.2 创建 Zookeeper 用户​

# 创建 zookeeper 用户
sudo useradd -m -s /bin/bash zookeeper

# 创建 Zookeeper 目录
sudo mkdir -p /opt/zookeeper
sudo mkdir -p /var/lib/zookeeper
sudo mkdir -p /var/log/zookeeper

# 设置目录权限
sudo chown -R zookeeper:zookeeper /opt/zookeeper
sudo chown -R zookeeper:zookeeper /var/lib/zookeeper
sudo chown -R zookeeper:zookeeper /var/log/zookeeper

3.3 配置主机名和 hosts​

在三台服务器上执行:

# 设置主机名(每台服务器执行对应的命令)

# 节点 1
sudo hostnamectl set-hostname ubuntu-zk-node1

# 节点 2
sudo hostnamectl set-hostname ubuntu-zk-node2

# 节点 3
sudo hostnamectl set-hostname ubuntu-zk-node3

# 配置 /etc/hosts(三台服务器都执行)
sudo cat >> /etc/hosts << 'EOF'
10.123.0.191 ubuntu-zk-node1
10.123.0.192 ubuntu-zk-node2
10.123.0.193 ubuntu-zk-node3
EOF

# 验证配置
ping -c 3 ubuntu-zk-node1
ping -c 3 ubuntu-zk-node2
ping -c 3 ubuntu-zk-node3

3.4 配置防火墙​

# 开放 Zookeeper 端口
sudo ufw allow 2181/tcp
sudo ufw allow 2888/tcp
sudo ufw allow 3888/tcp

ufw reload

# 查看防火墙状态
sudo ufw status

3.5 配置时间同步​

# 安装 chrony
sudo apt install -y chrony

# 启动并启用 chrony
sudo systemctl start chrony
sudo systemctl enable chrony

# 验证时间同步
chronyc sources -v

4. Zookeeper 安装​

在三台 Zookeeper 服务器上执行以下操作:

4.1 下载 Zookeeper​

# 下载 Zookeeper
cd /opt
wget https://downloads.apache.org/zookeeper/zookeeper-3.9.4/apache-zookeeper-3.9.4-bin.tar.gz

# 解压到指定目录
tar -zxvf apache-zookeeper-3.9.4-bin.tar.gz -C /opt/zookeeper --strip-components=1

4.2 创建 myid 文件​

在每台服务器上创建唯一的 myid 文件:

节点 1(10.123.0.191):

# 创建 myid 文件
echo "1" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid

节点 2(10.123.0.192):

# 创建 myid 文件
echo "2" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid

节点 3(10.123.0.193):

# 创建 myid 文件
echo "3" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid

5. Zookeeper 配置​

5.1 配置 zoo.cfg​

在三台服务器上创建相同的配置文件:

# 创建配置文件
cat > /opt/zookeeper/conf/zoo.cfg << 'EOF'
# Zookeeper 配置文件

# 时间单位(毫秒)
tickTime=2000

# 初始同步的超时时间(tickTime * 10 = 20秒)
initLimit=10

# 同步请求的超时时间(tickTime * 5 = 10秒)
syncLimit=5

# 数据目录
dataDir=/var/lib/zookeeper

# 日志目录
dataLogDir=/var/log/zookeeper

# 客户端连接端口
clientPort=2181

# 强制监听IPv4(避免仅tcp6监听)
clientPortAddress=0.0.0.0

# 最大客户端连接数
maxClientCnxns=60

# 单个客户端连接的最大请求数
maxSessionTimeout=60000

# 最小会话超时时间
minSessionTimeout=4000

# 集群节点配置
# 格式:server.<myid>=<hostname>:<leader选举端口>:<集群通信端口>[:<observer>]
server.1=10.123.0.191:2888:3888
server.2=10.123.0.192:2888:3888
server.3=10.123.0.193:2888:3888

# 开启四字母命令(生产环境建议关闭)
4lw.commands.whitelist=*

# 禁用管理员管理功能
admin.enableServer=false

# 自动清理快照
autopurge.snapRetainCount=3
autopurge.purgeInterval=1

# 预分配空间
preAllocSize=65536

# 快照大小限制
snapCount=100000

# 跳过 ACL 权限检查
skipACL=yes
EOF

5.2 配置日志​

# 创建 logback 配置文件
cat > /opt/zookeeper/conf/logback.xml << 'EOF'
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{ISO8601} [myid:%X{myid}] - %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/zookeeper/zookeeper.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/zookeeper/zookeeper.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{ISO8601} [myid:%X{myid}] - %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
EOF

5.3 配置环境变量​

# 配置 Zookeeper 环境变量
sudo cat >> /etc/profile.d/zookeeper.sh << 'EOF'
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
EOF

# 加载环境变量
source /etc/profile.d/zookeeper.sh

# 验证环境变量
echo $ZOOKEEPER_HOME

5.4 配置 JVM 参数​

# 创建 JVM 配置文件
sudo cat > /opt/zookeeper/conf/java.env << 'EOF'
#!/bin/bash

# JVM 内存配置
export JVMFLAGS="-Xms2g -Xmx2g"

# GC 配置 (兼容 JDK 11+)
export JVMFLAGS="$JVMFLAGS -XX:+UseG1GC"
export JVMFLAGS="$JVMFLAGS -XX:MaxGCPauseMillis=200"
export JVMFLAGS="$JVMFLAGS -XX:InitiatingHeapOccupancyPercent=35"
export JVMFLAGS="$JVMFLAGS -XX:G1HeapRegionSize=16m"

# JDK 11+ 统一日志配置 (替代旧的 GC 日志参数)
export JVMFLAGS="$JVMFLAGS -Xlog:gc*:file=/var/log/zookeeper/gc.log:time,tags:filecount=10,filesize=100M"

# 其他优化
export JVMFLAGS="$JVMFLAGS -XX:+UseStringDeduplication"
export JVMFLAGS="$JVMFLAGS -XX:+UnlockExperimentalVMOptions"
export JVMFLAGS="$JVMFLAGS -XX:+TrustFinalNonStaticFields"

# 启用 JFR (JDK Flight Recorder) - 可选性能分析
# export JVMFLAGS="$JVMFLAGS -XX:+FlightRecorder"
# export JVMFLAGS="$JVMFLAGS -XX:StartFlightRecording=duration=60s,filename=/var/log/zookeeper/app.jfr"

# 启用 JMX(可选)
export JMXPORT=9010
EOF

# 设置执行权限
sudo chmod +x /opt/zookeeper/conf/java.env

6. 启动 Zookeeper​

6.1 手动启动测试​

在三台服务器上依次启动 Zookeeper:

# 统一赋值权限
sudo chown -R zookeeper:zookeeper /opt/zookeeper
# 递归修改日志目录权限(解决核心写入失败)
chown -R zookeeper:zookeeper /var/log/zookeeper
# 递归修改数据目录权限(确保myid和快照可读写)
chown -R zookeeper:zookeeper /var/lib/zookeeper
# 设置目录读写权限(避免权限过严)
chmod -R 700 /var/log/zookeeper
chmod -R 700 /var/lib/zookeeper

# 切换到 zookeeper 用户
sudo -u zookeeper bash

# 启动 Zookeeper
cd /opt/zookeeper
bin/zkServer.sh start

# 查看状态
bin/zkServer.sh status

# 查看日志
tail -f /var/log/zookeeper/zookeeper.log

# 退出 zookeeper 用户
exit

预期输出:

节点 1(Leader):

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader

节点 2(Follower):

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

节点 3(Follower):

ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

6.2 配置 Systemd 服务​

在三台服务器上执行:

# 创建 Systemd 服务文件
sudo cat > /etc/systemd/system/zookeeper.service << 'EOF'
[Unit]
Description=Zookeeper Service
After=network.target

[Service]
Type=forking
User=zookeeper
Group=zookeeper
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="ZOOKEEPER_HOME=/opt/zookeeper"
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
ExecReload=/opt/zookeeper/bin/zkServer.sh restart
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# 重载 Systemd
sudo systemctl daemon-reload

# 启用开机自启
sudo systemctl enable zookeeper

# 启动服务
sudo systemctl start zookeeper

# 查看服务状态
sudo systemctl status zookeeper

6.3 停止和重启​

# 停止 Zookeeper
sudo systemctl stop zookeeper

# 重启 Zookeeper
sudo systemctl restart zookeeper

# 查看服务状态
sudo systemctl status zookeeper

7. 集群验证​

7.1 查看集群状态​

在三台服务器上执行:

# 切换到 zookeeper 用户
sudo -u zookeeper bash

# 查看节点状态
cd /opt/zookeeper
bin/zkServer.sh status

# 退出 zookeeper 用户
exit

7.2 连接 Zookeeper​

# 切换到 zookeeper 用户
sudo -u zookeeper bash

# 连接 Zookeeper
cd /opt/zookeeper
bin/zkCli.sh -server 127.0.0.1:2181

# 在 Zookeeper CLI 中执行以下命令

# 查看根节点
ls /

# 创建测试节点
create /test "hello world"

# 获取节点数据
get /test

# 查看节点信息
stat /test

# 删除节点
delete /test

# 退出 CLI
quit

# 退出 zookeeper 用户
exit

7.3 四字母命令​

# 查看集群状态
echo "stat" | nc 127.0.0.1 2181

# 查看节点配置
echo "conf" | nc 127.0.0.1 2181

# 查看连接信息
echo "cons" | nc 127.0.0.1 2181

# 查看环境变量
echo "envi" | nc 127.0.0.1 2181

# 查看监控信息
echo "mntr" | nc 127.0.0.1 2181

# 查看服务器状态
echo "srvr" | nc 127.0.0.1 2181

# 查看会话信息
echo "dump" | nc 127.0.0.1 2181

# 查看观察者信息
echo "wchs" | nc 127.0.0.1 2181

# 查看观察者连接
echo "wchc" | nc 127.0.0.1 2181

7.4 测试 Leader 选举​

# 停止 Leader 节点(假设节点 1 是 Leader)
sudo systemctl stop zookeeper

# 在其他节点查看状态(节点 2 或 3)
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh status

# 应该看到新的 Leader 被选举出来

# 重新启动节点 1
sudo systemctl start zookeeper

# 查看节点 1 的状态
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh status

# 节点 1 应该成为 Follower

7.5 测试数据一致性​

# 在节点 1 上创建数据
sudo -u zookeeper /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 << 'EOF'
create /test "data from node 1"
quit
EOF

# 在节点 2 上读取数据
sudo -u zookeeper /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 << 'EOF'
get /test
quit
EOF

# 在节点 3 上读取数据
sudo -u zookeeper /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 << 'EOF'
get /test
quit
EOF

# 所有节点应该读取到相同的数据

8. 监控与告警​

8.1 关键监控指标​

8.1.1 集群状态指标​

指标说明正常值
zk_server_state服务器状态leader 或 follower
zk_peer_state节点状态leading 或 following
zk_znode_countznode 数量根据业务量
zk_watch_countwatch 数量根据业务量

8.1.2 性能指标​

指标说明正常值
zk_packets_received接收的数据包数持续增长
zk_packets_sent发送的数据包数持续增长
zk_avg_latency平均延迟< 10ms
zk_max_latency最大延迟< 100ms
zk_min_latency最小延迟< 1ms

8.1.3 网络指标​

指标说明正常值
zk_num_alive_connections活跃连接数根据业务量
zk_outstanding_requests待处理请求数< 100

8.2 Prometheus 监控​

8.2.1 安装 Zookeeper Exporter​

# 下载 Zookeeper Exporter
cd /opt
sudo -u zookeeper wget https://github.com/dabealu/zookeeper-exporter/releases/download/v1.0.2/zookeeper_exporter-1.0.2.linux-amd64.tar.gz

# 解压
sudo -u zookeeper tar -zxvf zookeeper_exporter-1.0.2.linux-amd64.tar.gz

# 创建软链接
sudo -u zookeeper ln -s zookeeper_exporter-1.0.2.linux-amd64 zookeeper_exporter

# 清理安装包
sudo -u zookeeper rm zookeeper_exporter-1.0.2.linux-amd64.tar.gz

8.2.2 配置 Zookeeper Exporter​

# 创建 Systemd 服务文件
sudo cat > /etc/systemd/system/zookeeper-exporter.service << 'EOF'
[Unit]
Description=Zookeeper Exporter
After=zookeeper.service

[Service]
Type=simple
User=zookeeper
Group=zookeeper
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
ExecStart=/opt/zookeeper_exporter/zookeeper_exporter \
--zookeeper.addr=127.0.0.1:2181 \
--web.listen-address=:9091 \
--web.telemetry-path=/metrics
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# 重载 Systemd
sudo systemctl daemon-reload

# 启用开机自启
sudo systemctl enable zookeeper-exporter

# 启动服务
sudo systemctl start zookeeper-exporter

# 查看服务状态
sudo systemctl status zookeeper-exporter

# 查看指标
curl http://localhost:9091/metrics

8.3 告警规则​

groups:
- name: zookeeper
interval: 30s
rules:
- alert: ZookeeperDown
expr: up{job="zookeeper"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Zookeeper down"
description: "Zookeeper {{ $labels.instance }} is down"

- alert: ZookeeperLeaderElection
expr: zk_server_state{state!="leader"} == 1
for: 5m
labels:
severity: warning
annotations:
summary: "Zookeeper leader election"
description: "Zookeeper {{ $labels.instance }} is not leader"

- alert: ZookeeperHighLatency
expr: zk_avg_latency > 100
for: 5m
labels:
severity: warning
annotations:
summary: "Zookeeper high latency"
description: "Zookeeper {{ $labels.instance }} avg latency is {{ $value }}ms"

- alert: ZookeeperOutstandingRequests
expr: zk_outstanding_requests > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "Zookeeper outstanding requests high"
description: "Zookeeper {{ $labels.instance }} has {{ $value }} outstanding requests"

- alert: ZookeeperWatchCountHigh
expr: zk_watch_count > 10000
for: 5m
labels:
severity: warning
annotations:
summary: "Zookeeper watch count high"
description: "Zookeeper {{ $labels.instance }} has {{ $value }} watches"

9. 故障排除​

9.1 常见问题​

9.1.1 Zookeeper 无法启动​

问题:Zookeeper 服务启动失败

# 查看 Zookeeper 日志
sudo -u zookeeper tail -f /var/log/zookeeper/zookeeper.log

# 常见原因:
# 1. myid 文件不存在或配置错误
cat /var/lib/zookeeper/myid

# 2. 端口被占用
sudo netstat -tlnp | grep -E "2181|2888|3888"

# 3. 配置文件错误
cat /opt/zookeeper/conf/zoo.cfg

# 4. Java 版本不兼容
java -version

# 5. 目录权限问题
ls -la /var/lib/zookeeper
ls -la /var/log/zookeeper

9.1.2 集群无法形成​

问题:Zookeeper 节点无法组成集群

# 查看节点状态
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh status

# 常见原因:
# 1. myid 不唯一
cat /var/lib/zookeeper/myid

# 2. zoo.cfg 配置错误
cat /opt/zookeeper/conf/zoo.cfg | grep server

# 3. 网络不通
ping ubuntu-zk-node1
ping ubuntu-zk-node2
ping ubuntu-zk-node3

# 4. 防火墙阻止
sudo ufw status

# 5. 主机名解析错误
cat /etc/hosts

9.1.3 Leader 选举失败​

问题:集群无法选举出 Leader

# 查看集群状态
echo "stat" | nc 127.0.0.1 2181

# 常见原因:
# 1. 节点数不足(至少需要 3 个节点)
# 2. 网络分区
# 3. 节点配置不一致
# 4. 时钟不同步

# 检查时钟同步
chronyc sources -v

9.1.4 连接超时​

问题:客户端连接 Zookeeper 超时

# 查看连接信息
echo "cons" | nc 127.0.0.1 2181

# 常见原因:
# 1. 网络延迟高
ping ubuntu-zk-node1

# 2. 负载过高
top

# 3. 磁盘 I/O 瓶颈
iostat -x 1

# 4. 内存不足
free -h

9.2 诊断工具​

9.2.1 日志分析​

# 查看 Zookeeper 日志
sudo -u zookeeper tail -f /var/log/zookeeper/zookeeper.log

# 查看 GC 日志
sudo -u zookeeper tail -f /var/log/zookeeper/gc.log

# 查看系统日志
sudo journalctl -u zookeeper -f

9.2.2 网络诊断​

# 测试网络连通性
ping -c 3 ubuntu-zk-node1
ping -c 3 ubuntu-zk-node2
ping -c 3 ubuntu-zk-node3

# 测试端口连通性
telnet ubuntu-zk-node1 2181
telnet ubuntu-zk-node1 2888
telnet ubuntu-zk-node1 3888

# 查看网络连接
sudo netstat -tlnp | grep -E "2181|2888|3888"

9.2.3 性能诊断​

# 查看 CPU 使用率
top

# 查看内存使用情况
free -h

# 查看磁盘 I/O
iostat -x 1

# 查看 Zookeeper 性能指标
echo "mntr" | nc 127.0.0.1 2181

10. 最佳实践​

10.1 性能优化​

10.1.1 JVM 参数优化​

# 编辑 java.env 文件
sudo cat > /opt/zookeeper/conf/java.env << 'EOF'
#!/bin/bash

# 根据服务器内存调整 JVM 参数
# 4GB 内存服务器
export JVMFLAGS="-Xms2g -Xmx2g"

# 8GB 内存服务器
# export JVMFLAGS="-Xms4g -Xmx4g"

# 16GB 内存服务器
# export JVMFLAGS="-Xms8g -Xmx8g"

# GC 配置 (兼容 JDK 11+)
export JVMFLAGS="$JVMFLAGS -XX:+UseG1GC"
export JVMFLAGS="$JVMFLAGS -XX:MaxGCPauseMillis=200"
export JVMFLAGS="$JVMFLAGS -XX:InitiatingHeapOccupancyPercent=35"
export JVMFLAGS="$JVMFLAGS -XX:G1HeapRegionSize=16m"

# JDK 11+ 统一日志配置 (替代旧的 GC 日志参数)
export JVMFLAGS="$JVMFLAGS -Xlog:gc*:file=/var/log/zookeeper/gc.log:time,tags:filecount=10,filesize=100M"

# 其他优化
export JVMFLAGS="$JVMFLAGS -XX:+UseStringDeduplication"
export JVMFLAGS="$JVMFLAGS -XX:+UnlockExperimentalVMOptions"
export JVMFLAGS="$JVMFLAGS -XX:+TrustFinalNonStaticFields"

# 启用 JFR (JDK Flight Recorder) - 可选性能分析
# export JVMFLAGS="$JVMFLAGS -XX:+FlightRecorder"
# export JVMFLAGS="$JVMFLAGS -XX:StartFlightRecording=duration=60s,filename=/var/log/zookeeper/app.jfr"

# 启用 JMX(可选)
export JMXPORT=9010
EOF

10.1.2 系统参数优化​

# 编辑系统参数
sudo cat >> /etc/sysctl.conf << 'EOF'
# 网络参数优化
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 文件描述符限制
fs.file-max = 65536
EOF

# 应用系统参数
sudo sysctl -p

# 配置文件描述符限制
sudo cat >> /etc/security/limits.conf << 'EOF'
zookeeper soft nofile 65536
zookeeper hard nofile 65536
EOF

10.2 安全配置​

10.2.1 关闭四字母命令​

# 编辑 zoo.cfg
sudo sed -i 's/4lw.commands.whitespace=.*/4lw.commands.whitespace=/' /opt/zookeeper/conf/zoo.cfg

# 重启 Zookeeper
sudo systemctl restart zookeeper

10.2.2 启用 SASL 认证​

# 创建 JAAS 配置文件
sudo cat > /opt/zookeeper/conf/jaas.conf << 'EOF'
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_super="admin123"
user_kafka="kafka123";
};
EOF

# 编辑 zoo.cfg,添加认证配置
sudo sed -i '/^dataLogDir=/a authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider\nrequireClientAuthScheme=sasl\njaasLoginRenew=3600000' /opt/zookeeper/conf/zoo.cfg

# 编辑 java.env,添加 JAAS 配置
sudo sed -i '/^export JVMFLAGS=/a export JVMFLAGS="$JVMFLAGS -Djava.security.auth.login.config=/opt/zookeeper/conf/jaas.conf"' /opt/zookeeper/conf/java.env

# 重启 Zookeeper
sudo systemctl restart zookeeper

10.3 备份与恢复​

10.3.1 备份快照​

# 创建备份脚本
sudo cat > /opt/zookeeper/bin/backup.sh << 'EOF'
#!/bin/bash

BACKUP_DIR=/backup/zookeeper
DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_DIR=/var/lib/zookeeper/version-2

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份快照
tar -czf $BACKUP_DIR/snapshot_$DATE.tar.gz -C $SNAPSHOT_DIR .

# 保留最近 7 天的备份
find $BACKUP_DIR -name "snapshot_*.tar.gz" -mtime +7 -delete

echo "Backup completed: snapshot_$DATE.tar.gz"
EOF

# 设置执行权限
sudo chmod +x /opt/zookeeper/bin/backup.sh

# 配置定时任务
sudo crontab -e

# 添加以下行(每天凌晨 2 点备份)
0 2 * * * /opt/zookeeper/bin/backup.sh >> /var/log/zookeeper/backup.log 2>&1

10.3.2 恢复快照​

# 停止 Zookeeper
sudo systemctl stop zookeeper

# 备份当前数据
sudo cp -r /var/lib/zookeeper /var/lib/zookeeper.backup

# 恢复快照
sudo tar -xzf /backup/zookeeper/snapshot_20260123_020000.tar.gz -C /var/lib/zookeeper/version-2/

# 启动 Zookeeper
sudo systemctl start zookeeper

# 验证恢复
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh status

10.4 监控指标​

10.4.1 关键指标​

指标阈值告警级别
zk_avg_latency> 100msWarning
zk_max_latency> 500msWarning
zk_outstanding_requests> 1000Warning
zk_watch_count> 10000Warning
zk_znode_count> 100000Warning

10.4.2 告警阈值​

  • Zookeeper 服务停止:Critical
  • Leader 选举失败:Critical
  • 平均延迟 > 100ms:Warning
  • 最大延迟 > 500ms:Warning
  • 待处理请求 > 1000:Warning
  • Watch 数量 > 10000:Warning

11. 附录​

11.1 配置参数说明​

11.1.1 核心参数​

参数默认值说明
tickTime2000基本时间单位(毫秒)
initLimit10初始同步的超时时间(tickTime * 10)
syncLimit5同步请求的超时时间(tickTime * 5)
dataDir/tmp/zookeeper数据目录
dataLogDir/tmp/zookeeper日志目录
clientPort2181客户端连接端口
maxClientCnxns60最大客户端连接数

11.1.2 集群参数​

参数默认值说明
server.x-集群节点配置
electionPort3888选举端口
leaderPort2888集群通信端口

11.1.3 性能参数​

参数默认值说明
snapCount100000快照间隔(事务数)
preAllocSize65536预分配空间(字节)
maxSessionTimeout40000最大会话超时(毫秒)
minSessionTimeout4000最小会话超时(毫秒)

11.2 常用命令参考​

11.2.1 服务管理命令​

# 启动 Zookeeper
sudo systemctl start zookeeper

# 停止 Zookeeper
sudo systemctl stop zookeeper

# 重启 Zookeeper
sudo systemctl restart zookeeper

# 查看状态
sudo systemctl status zookeeper

# 查看日志
sudo journalctl -u zookeeper -f

11.2.2 集群管理命令​

# 查看节点状态
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh status

# 启动节点
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh start

# 停止节点
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh stop

# 重启节点
sudo -u zookeeper /opt/zookeeper/bin/zkServer.sh restart

11.2.3 客户端命令​

# 连接 Zookeeper
sudo -u zookeeper /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

# 创建节点
create /path "data"

# 获取节点数据
get /path

# 设置节点数据
set /path "newdata"

# 删除节点
delete /path

# 列出子节点
ls /path

# 查看节点信息
stat /path

11.2.4 四字母命令​

# 查看集群状态
echo "stat" | nc 127.0.0.1 2181

# 查看节点配置
echo "conf" | nc 127.0.0.1 2181

# 查看连接信息
echo "cons" | nc 127.0.0.1 2181

# 查看监控信息
echo "mntr" | nc 127.0.0.1 2181

# 查看服务器状态
echo "srvr" | nc 127.0.0.1 2181

11.3 官方资源链接​

11.4 参考资料​


总结​

通过本指南,你已经成功在 Ubuntu 24.04 上部署了 Zookeeper 高可用集群。该方案具有以下特点:

  1. 高可用性:3 节点集群,任一节点故障不影响服务
  2. 数据一致性:ZAB 协议保证数据强一致性
  3. 自动故障转移:Leader 故障时自动选举新 Leader
  4. 高性能:读操作可以在任意节点执行
  5. 易扩展:支持动态添加节点

关键要点​

  1. 奇数节点:生产环境建议使用奇数个节点(3、5、7)
  2. 独立部署:Zookeeper 应该独立部署,不要与其他服务混用
  3. 监控告警:配置完善的监控和告警机制
  4. 定期备份:定期备份快照数据
  5. 安全配置:生产环境建议启用 SASL 认证

下一步建议​

  1. 根据实际业务需求调整 Zookeeper 配置
  2. 配置监控和告警,及时发现和处理问题
  3. 定期备份快照数据
  4. 进行故障演练,验证高可用方案的有效性
  5. 学习 Zookeeper 的使用,充分利用分布式协调功能

如有任何问题或建议,欢迎反馈!