三节点部署 ZooKeeper 集群

适用版本:JDK 1.8 + Apache ZooKeeper 3.8.4,三个节点分别命名为 node01、node02、node03。以下命令默认在三台节点上均执行(特别注明的除外),安装目录统一为 /opt。


1. 安装 Java

# 解压 JDK 安装包
tar zxf jdk-8u361-linux-x64.tar.gz -C /opt/

# 配置环境变量
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/opt/jdk1.8.0_361
export PATH=$JAVA_HOME/bin:$PATH
EOF

# 使配置生效并验证
source /etc/profile
java -version

2. 解压 ZooKeeper 安装包

# 解压安装包
tar zxf apache-zookeeper-3.8.4-bin.tar.gz -C /opt/

# 创建软连接
cd /opt
ln -s apache-zookeeper-3.8.4-bin /opt/zookeeper

3. 配置 zoo.cfg

cd /opt/zookeeper/conf && cp zoo_sample.cfg zoo.cfg && vim zoo.cfg

修改/添加如下配置:

clientPort=2181             # 暴露端口号
autopurge.snapRetainCount=3 # 保留最新的快照和事务日志数量
autopurge.purgeInterval=24  # 清理频率,单位小时
tickTime=2000               # 定义最小时间单元长度,单位毫秒
initLimit=10                # 初始化时间,包含启动和数据同步,其值是tickTime的倍数
syncLimit=5                 # 正常工作时的心跳监测间隔,其值是tickTime的倍数
dataDir=/data/zookeeper/data # 数据快照存储路径
dataLogDir=/data/zookeeper/logs # 事务日志存放目录,对性能影响较大,建议和数据快照分开存储
# 提供Prometheus监控指标
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
# 增加如下集群配置
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888

4. 修改日志文件路径【可选】

vim /opt/zookeeper/conf/logback.xml

修改日志输出目录(默认是 zookeeper 安装目录下的 logs):

<property name="zookeeper.log.dir" value="/data/zookeeper/logs" />

5. 创建数据与日志目录

mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs

6. 配置节点 myid

每个节点分别设置对应的编号(myid 必须与 zoo.cfg 中 server.N 的编号一致):

# node01 主机执行
echo 1 > /data/zookeeper/data/myid

# node02 主机执行
echo 2 > /data/zookeeper/data/myid

# node03 主机执行
echo 3 > /data/zookeeper/data/myid

7. 配置主机名解析(如未配置需补充)

集群配置中使用了 node01/node02/node03 主机名,需保证三台节点均可相互解析,可配置 /etc/hosts(三台节点均添加):

192.168.1.11 node01
192.168.1.12 node02
192.168.1.13 node03

8. 配置环境变量

cat >> /etc/profile << 'EOF'
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
EOF

source /etc/profile

9. 开放端口(如开启防火墙需执行)

三台节点均需放行 ZooKeeper 相关端口:

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

10. 逐个启动并查看状态

zkServer.sh start
zkServer.sh status

三台节点全部启动后,zkServer.sh status 应显示一个 leader 和两个 follower。

11. 集群一键启停脚本

在任意一台节点上创建 zk-cluster.sh,通过 SSH 统一管理整个集群:

vim /opt/zookeeper/bin/zk-cluster.sh

脚本内容如下:

#!/bin/bash
ZK_HOME=/opt/zookeeper
NODES=(node01 node02 node03)

case "$1" in
  start)
    for node in "${NODES[@]}"; do
      echo "===== Starting ZooKeeper on $node ====="
      ssh $node "$ZK_HOME/bin/zkServer.sh start"
    done
    ;;
  stop)
    for node in "${NODES[@]}"; do
      echo "===== Stopping ZooKeeper on $node ====="
      ssh $node "$ZK_HOME/bin/zkServer.sh stop"
    done
    ;;
  restart)
    $0 stop
    sleep 3
    $0 start
    ;;
  status)
    for node in "${NODES[@]}"; do
      echo "===== Status on $node ====="
      ssh $node "$ZK_HOME/bin/zkServer.sh status"
    done
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
esac

赋予执行权限并加入 PATH 后使用:

chmod +x /opt/zookeeper/bin/zk-cluster.sh
ln -s /opt/zookeeper/bin/zk-cluster.sh /usr/local/bin/zk-cluster

# 使用示例
zk-cluster start      # 一键启动整个集群
zk-cluster status     # 查看三个节点的角色状态
zk-cluster stop       # 一键停止整个集群

说明:脚本依赖节点间的 SSH 免密登录,可提前执行 ssh-copy-id node01 等命令配置。

12. 验证集群

# 查看各节点角色
zkServer.sh status

# 连接集群测试
zkCli.sh -server node01:2181
# 进入客户端后可执行:ls /、create /test hello、get /test 等命令验证