Zookeeper linux 服务端集群搭建步骤

以下是 Linux 环境下 Apache ZooKeeper 生产级集群(3 节点)搭建完整步骤从零开始,手动操作 + 脚本自动化双版本,适用于 CentOS 7/8、Ubuntu 20.04+。

目标:搭建一个 高可用、支持自动 Leader 选举 的 ZooKeeper 集群
版本apache-zookeeper-3.8.4-bin(截至 2025 年 10 月最新稳定版)


一、集群规划(3 节点)

主机IP角色myid
zk1192.168.1.101Leader/Follower1
zk2192.168.1.102Leader/Follower2
zk3192.168.1.103Leader/Follower3

推荐使用 奇数节点,保证多数派(Quorum)容错。


二、每台服务器通用准备(3 台都执行)

1. 安装 JDK(必须)

# CentOS
sudo yum install -y java-11-openjdk-devel

# Ubuntu
sudo apt update
sudo apt install -y openjdk-11-jdk

验证:

java -version
# 输出类似:openjdk version "11.0.21" ...

2. 创建 zookeeper 用户(推荐)

sudo groupadd zookeeper
sudo useradd -g zookeeper -m -s /bin/bash zookeeper

3. 创建目录(建议挂载独立磁盘)

sudo mkdir -p /data/zookeeper/data
sudo mkdir -p /data/zookeeper/logs
sudo chown -R zookeeper:zookeeper /data/zookeeper

三、下载 & 解压 ZooKeeper(每台执行)

cd /opt

# 下载(推荐使用官方镜像)
sudo wget https://downloads.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

# 解压
sudo tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
sudo mv apache-zookeeper-3.8.4-bin zookeeper
sudo chown -R zookeeper:zookeeper zookeeper

四、配置 zoo.cfg(每台都一样)

sudo -u zookeeper vim /opt/zookeeper/conf/zoo.cfg
# 基本参数
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181

# 集群配置(关键!)
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

# 优化参数(生产推荐)
maxClientCnxns=200
autopurge.snapRetainCount=10
autopurge.purgeInterval=1

五、设置 myid(每台不同!)

# zk1
echo "1" | sudo tee /data/zookeeper/data/myid

# zk2
echo "2" | sudo tee /data/zookeeper/data/myid

# zk3
echo "3" | sudo tee /data/zookeeper/data/myid

必须唯一,对应 server.x 中的 x


六、配置 hosts 解析(每台执行)

sudo vim /etc/hosts

添加:

192.168.1.101 zk1
192.168.1.102 zk2
192.168.1.103 zk3

验证:

ping zk1

七、防火墙放行(每台执行)

CentOS

sudo firewall-cmd --add-port=2181/tcp --permanent
sudo firewall-cmd --add-port=2888/tcp --permanent
sudo firewall-cmd --add-port=3888/tcp --permanent
sudo firewall-cmd --reload

Ubuntu

sudo ufw allow 2181
sudo ufw allow 2888
sudo ufw allow 3888

八、配置 systemd 服务(开机自启)

sudo vim /etc/systemd/system/zookeeper.service
[Unit]
Description=Apache ZooKeeper Server
Requires=network.target
After=network.target

[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zookeeper
Group=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
ExecReload=/opt/zookeeper/bin/zkServer.sh restart
Restart=always
TimeoutSec=30

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable zookeeper

九、启动集群(顺序启动)

# 在每台机器上执行
sudo systemctl start zookeeper

十、验证集群状态

# 查看角色
/opt/zookeeper/bin/zkServer.sh status

预期输出

# zk1(可能为 Leader)
Mode: leader

# zk2
Mode: follower

# zk3
Mode: follower

十一、四字命令验证(任意一台)

echo mntr | nc 127.0.0.1 2181

输出示例:

zk_version    3.8.4
zk_avg_latency    0
zk_max_latency    0
zk_min_latency    0
zk_packets_received    12
zk_packets_sent    11
zk_num_alive_connections    1
zk_outstanding_requests    0
zk_server_state    leader
zk_znode_count    5
zk_watch_count    0
zk_ephemerals_count    0
zk_approximate_data_size    49
zk_open_file_descriptor_count    38
zk_max_file_descriptor_count    1048576
zk_followers    2
zk_synced_followers    2
zk_pending_syncs    0

十二、客户端连接测试

/opt/zookeeper/bin/zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
[zk: zk1:2181,zk2:2181,zk3:2181(CONNECTED) 0] ls /

[zookeeper]

[zk: …] create /cluster_test “hello cluster” Created /cluster_test [zk: …] get /cluster_test hello cluster


高可用测试(模拟故障)

# 停止 Leader 节点(假设 zk1 是 Leader)
sudo systemctl stop zookeeper   # 在 zk1 上执行

# 查看 zk2/zk3 状态
/opt/zookeeper/bin/zkServer.sh status
# 其中一台会变成 leader

集群仍可正常提供服务,zk1 重启后自动加入。


自动化脚本(一键部署)

setup_zookeeper.sh(每台执行)

#!/bin/bash
ID=$1
IP=$2

if [ -z "$ID" ] || [ -z "$IP" ]; then
    echo "用法: $0 <myid> <本机IP>"
    exit 1
fi

# 1. 创建用户和目录
sudo groupadd zookeeper 2>/dev/null
sudo useradd -g zookeeper -m -s /bin/bash zookeeper 2>/dev/null
sudo mkdir -p /data/zookeeper/data /data/zookeeper/logs
sudo chown -R zookeeper:zookeeper /data/zookeeper

# 2. 下载解压
cd /opt
if [ ! -d "zookeeper" ]; then
    sudo wget -q https://downloads.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
    sudo tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
    sudo mv apache-zookeeper-3.8.4-bin zookeeper
    sudo chown -R zookeeper:zookeeper zookeeper
fi

# 3. 配置 zoo.cfg
cat > /opt/zookeeper/conf/zoo.cfg <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
maxClientCnxns=200
autopurge.snapRetainCount=10
autopurge.purgeInterval=1

server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
EOF
sudo chown zookeeper:zookeeper /opt/zookeeper/conf/zoo.cfg

# 4. 设置 myid
echo "$ID" | sudo tee /data/zookeeper/data/myid > /dev/null

# 5. systemd 服务
cat > /etc/systemd/system/zookeeper.service <<EOF
[Unit]
Description=Apache ZooKeeper Server
After=network.target

[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable zookeeper

echo "ZooKeeper 配置完成!myid=$ID, IP=$IP"
echo "执行: sudo systemctl start zookeeper"

使用方法:

# zk1
chmod +x setup_zookeeper.sh
sudo ./setup_zookeeper.sh 1 192.168.1.101

# zk2
sudo ./setup_zookeeper.sh 2 192.168.1.102

# zk3
sudo ./setup_zookeeper.sh 3 192.168.1.103

总结:启动顺序

# 1. 每台执行脚本(或手动配置)
# 2. 启动服务
sudo systemctl start zookeeper

# 3. 检查状态
/opt/zookeeper/bin/zkServer.sh status

附:常用运维命令

命令用途
zkServer.sh start启动
zkServer.sh stop停止
zkServer.sh status查看角色
zkServer.sh restart重启
zkCli.sh -server ...客户端
echo mntr | nc localhost 2181监控

集群搭建完成!


需要我提供:

  • Ansible 自动化部署 Playbook
  • Prometheus + Grafana 监控
  • 日志清理策略
  • 备份恢复脚本

请继续提问!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注