ZooKeeper集群搭建

搭建 ZooKeeper 集群是构建高可用分布式系统(如 Kafka、Hadoop HHA、Dubbo 等)的关键步骤。ZooKeeper 集群通常采用奇数节点 部署(如 3 台、5 台),以容忍 (n-1)/2 台机器故障。

以下是基于最新稳定版本(如 3.8.x 或 3.9.x)的 3 节点集群搭建详细指南。

一、环境规划

假设我们有 3 台 Linux 服务器(CentOS/Ubuntu均可),已安装好 JDK(JDK 8 或 JDK 11+)。

主机名 IP 地址 节点 ID (myid) 端口说明
zk-node1 192.168.1.101 1 2181(客户端), 2888( follower通信), 3888(选举)
zk-node2 192.168.1.102 2 同上
zk-node3 192.168.1.103 3 同上

注意 :请确保所有机器时间同步(使用 ntpdate 或 chrony),防火墙已关闭或放行了相关端口。


二、搭建步骤(每台机器均需执行,除 myid 不同外)

1. 下载与解压

前往 Apache 官网下载最新稳定版(例如 apache-zookeeper-3.8.4-bin.tar.gz)。

复制代码
# 创建目录
sudo mkdir -p /opt/zookeeper
cd /opt/zookeeper

# 下载 (以 3.8.4 为例,请替换为最新版本链接)
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

# 解压
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
mv apache-zookeeper-3.8.4-bin zookeeper-3.8.4
2. 创建数据目录和日志目录

在生产环境中,建议将数据和日志分开存放,且不要放在系统盘。

复制代码
cd /opt/zookeeper/zookeeper-3.8.4
mkdir -p data
mkdir -p logs
3. 配置 zoo.cfg

进入 conf 目录,复制示例配置文件并修改。

复制代码
cd conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

修改后的 zoo.cfg 内容示例:

复制代码
# 客户端连接端口
clientPort=2181

# 数据目录 (对应上面创建的 data 目录)
dataDir=/opt/zookeeper/zookeeper-3.8.4/data

# 日志目录 (可选,不配则默认在 dataDir)
dataLogDir=/opt/zookeeper/zookeeper-3.8.4/logs

# 心跳检测时间 (毫秒)
tickTime=2000

# 初始化连接超时时间 (tickTime 的倍数)
initLimit=10

# 同步超时时间 (tickTime 的倍数)
syncLimit=5

# --- 集群配置核心部分 ---
# 格式: server.A=B:C:D
# A: 节点 ID (对应 myid 文件中的数字)
# B: 节点 IP
# C: Follower 与 Leader 交换信息的端口 (2888)
# D: 选举 Leader 的端口 (3888)
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

# (可选) 4lw commands whitelist,允许使用 ruok 等监控命令
4lw.commands.whitelist=*

提示 :将此配置好的 zoo.cfg 文件分发到其他两台节点的相同目录下。

4. 创建节点标识文件 (myid)

这是区分不同节点的关键步骤。每台机器的该文件内容必须不同。

在 dataDir 指定的目录下(即 /opt/zookeeper/zookeeper-3.8.4/data)创建名为 myid 的文件:

  • 在 node1 (192.168.1.101) 上执行:

    echo "1" > /opt/zookeeper/zookeeper-3.8.4/data/myid

  • 在 node2 (192.168.1.102) 上执行:

    echo "2" > /opt/zookeeper/zookeeper-3.8.4/data/myid

  • 在 node3 (192.168.1.103) 上执行:

    echo "3" > /opt/zookeeper/zookeeper-3.8.4/data/myid

5. 启动集群

在所有节点上依次执行启动命令(顺序不限,但建议同时或快速连续启动以加速选举)。

复制代码
cd /opt/zookeeper/zookeeper-3.8.4/bin
./zkServer.sh start

或者使用后台运行模式(推荐生产环境):

复制代码
./zkServer.sh start-foreground & 
# 或者直接作为服务运行,若配置了 systemd
6. 验证集群状态

在任意节点执行状态检查命令:

复制代码
./zkServer.sh status

预期输出:

  • 其中一台显示 Mode: leader
  • 其余两台显示 Mode: follower

如果显示 Error contacting service. It is probably not running.,请检查:

  1. 防火墙是否拦截了 2181, 2888, 3888 端口。
  2. zoo.cfg 中的 IP 地址是否正确。
  3. myid 文件内容是否与配置中的 server.X 对应。
  4. 查看 logs 目录下的 .log 和 .out 文件排查具体错误。

三、常用运维命令

命令 说明
./zkServer.sh start 启动节点
./zkServer.sh stop 停止节点
./zkServer.sh restart 重启节点
./zkServer.sh status 查看当前节点角色 (Leader/Follower)
./zkCli.sh 连接本地客户端进行测试
`echo ruok nc localhost 2181`

四、常见问题与优化建议

  1. 脑裂问题:确保网络稳定。如果网络分区导致集群分裂,少数派节点将无法提供服务。
  2. 磁盘性能 :ZooKeeper 对磁盘 I/O 延迟非常敏感(尤其是写操作,因为要写事务日志)。建议使用 SSD,并将 dataLogDir 单独挂载到高性能磁盘。
  3. JVM 调优 :编辑 bin/zkEnv.sh,调整 JVMFLAGS。对于 3 节点小集群,默认设置通常足够;大规模集群需调整堆内存(不宜过大,避免 GC 停顿),通常 2GB-4GB 即可。
  4. 快照清理 :ZooKeeper 会保留多个快照,可在 zoo.cfg 中配置 snapCount 和 purgeInterval (或使用 PurgeTxnLog 工具) 定期清理旧数据,防止磁盘爆满。

按照以上步骤,你就可以成功搭建一个稳定的 ZooKeeper 集群了。

相关推荐
数字新视界10 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
微三云 - 廖会灵 (私域系统开发)11 小时前
企业级 SaaS 系统架构设计:单体、微服务还是模块化单体?技术选型实战
微服务·架构·系统架构
Liaiyang6613 小时前
六家大模型体检卡:六个 ∅_safe(安全兜底态)的藏身之处(或显影处),就是下一次翻车的地方
系统架构·agent·rlhf·ai安全·容错设计·大模型评测·ai幻觉
shuair13 小时前
Spring Cloud 微服务脚手架:Simple Cloud 系统架构设计
spring cloud·微服务·系统架构
szxinmai主板定制专家16 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
ClickHouseDB1 天前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
深圳讯鹏科技1 天前
ESD防静电监控系统架构分享:从工位设备数据采集到看板联动
系统架构
Jmyd01231 天前
博物馆数字展厅系统架构设计:实景采集到云渲染全链路
unity·系统架构·博物馆·数字展厅·博物馆数字化
赤生云电竞1 天前
算力调度系统架构实践:计费、配额与抢占策略解析
系统架构
辛迪聊物业数字化2 天前
智慧社区小程序落地避坑指南:3类物业方案选型+成本测算,线上服务零翻车
大数据·嵌入式硬件·百度·系统架构