ZooKeeper 3.6.3 集群部署:3节点配置与防火墙端口 2181/2888/3888 详解
📅 2026/7/12 4:16:53
👁️ 阅读次数
📝 编程学习
ZooKeeper 3.6.3 集群部署:3节点配置与防火墙端口 2181/2888/3888 详解
在分布式系统中,ZooKeeper 作为核心的协调服务,其集群部署的稳定性和安全性直接影响整个系统的可靠性。本文将深入解析 ZooKeeper 3.6.3 三节点集群的部署要点,特别是防火墙端口的精细配置,帮助运维工程师构建高可用的生产环境。
1. 集群架构设计与端口功能解析
ZooKeeper 集群通过三种关键端口实现节点间协作,每种端口都有明确的职责分工:
| 端口号 | 协议 | 作用域 | 功能描述 |
|---|---|---|---|
| 2181 | TCP | 客户端-服务端 | 客户端连接端口,接收所有读写请求 |
| 2888 | TCP | 服务端-服务端 | Leader与Follower间数据同步通道,用于事务日志复制和新节点加入时的数据同步 |
| 3888 | TCP | 服务端-服务端 | 选举专用端口,用于Leader选举过程中的投票通信 |
关键配置原则:
- 所有节点的
zoo.cfg必须包含完全相同的server.x列表 myid文件中的数字必须与server.x的x值严格对应- 防火墙需同时放行入站(INPUT)和出站(OUTPUT)流量
生产环境建议:为每个端口配置独立的防火墙规则,避免使用
--add-port=2181-3888/tcp这种范围式配置,便于后期故障排查和安全管理。
2. 系统环境准备与基础配置
2.1 节点规划示例
# 三节点IP分配 NODE1=192.168.1.101 NODE2=192.168.1.102 NODE3=192.168.1.103 # 统一安装目录 ZOOKEEPER_HOME=/opt/zookeeper2.2 依赖安装与用户创建
# 创建专用用户(所有节点执行) sudo useradd -r -m -d ${ZOOKEEPER_HOME} -s /bin/bash zookeeper sudo chown -R zookeeper:zookeeper ${ZOOKEEPER_HOME} # 安装JDK(以OpenJDK11为例) sudo apt-get update && sudo apt-get install -y openjdk-11-jdk2.3 软件包部署
# 下载并解压(以节点1为例) wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz tar -xzf apache-zookeeper-3.6.3-bin.tar.gz -C ${ZOOKEEPER_HOME} --strip-components=13. 集群配置文件深度优化
3.1 zoo.cfg 核心参数
# 基础参数 tickTime=2000 initLimit=10 syncLimit=5 dataDir=${ZOOKEEPER_HOME}/data dataLogDir=${ZOOKEEPER_HOME}/logs clientPort=2181 # 集群节点配置 server.1=${NODE1}:2888:3888 server.2=${NODE2}:2888:3888 server.3=${NODE3}:2888:3888 # 高级优化参数 maxClientCnxns=100 # 单IP最大连接数 minSessionTimeout=4000 # 最小会话超时(ms) maxSessionTimeout=40000 # 最大会话超时(ms) autopurge.snapRetainCount=5 # 保留的快照数 autopurge.purgeInterval=24 # 清理间隔(小时)3.2 myid 文件配置
# 在各节点分别执行(注意ID与server.x对应) echo "1" > ${ZOOKEEPER_HOME}/data/myid # 节点1 echo "2" > ${ZOOKEEPER_HOME}/data/myid # 节点2 echo "3" > ${ZOOKEEPER_HOME}/data/myid # 节点34. 防火墙精准配置实战
4.1 firewalld 配置方案
# 永久添加规则(所有节点执行) sudo firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2181" protocol="tcp" accept' \ --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2888" protocol="tcp" accept' \ --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3888" protocol="tcp" accept' # 重载生效 sudo firewall-cmd --reload4.2 iptables 配置方案
# 允许集群内部通信(所有节点执行) iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2181 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2888 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3888 -j ACCEPT # 保存规则(CentOS/RHEL) service iptables save4.3 端口连通性测试
# 使用nc工具测试(示例测试节点1到节点2的2888端口) nc -zv ${NODE2} 2888 # 集群内部全连通测试脚本 for port in 2181 2888 3888; do for node in ${NODE1} ${NODE2} ${NODE3}; do echo "Testing ${node}:${port}..." timeout 1 bash -c "cat < /dev/null > /dev/tcp/${node}/${port}" && \ echo "✅ Success" || echo "❌ Failed" done done5. 服务管理与企业级优化
5.1 systemd 服务单元配置
# /etc/systemd/system/zookeeper.service [Unit] Description=Apache ZooKeeper Service After=network.target [Service] User=zookeeper Group=zookeeper Type=forking Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk" ExecStart=${ZOOKEEPER_HOME}/bin/zkServer.sh start ExecStop=${ZOOKEEPER_HOME}/bin/zkServer.sh stop ExecReload=${ZOOKEEPER_HOME}/bin/zkServer.sh restart Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target5.2 关键运维命令
# 集群状态检查(需在所有节点执行) ${ZOOKEEPER_HOME}/bin/zkServer.sh status # 客户端连接测试 ${ZOOKEEPER_HOME}/bin/zkCli.sh -server ${NODE1}:2181 # 日志实时监控 tail -f ${ZOOKEEPER_HOME}/logs/zookeeper.out5.3 监控指标采集
# 启用JMX监控(添加至zkServer.sh) export JMXPORT=9999 JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=${JMXPORT} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"6. 安全加固与故障排查
6.1 安全配置建议
# 在zoo.cfg中增加 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=36000006.2 常见故障处理
选举问题排查步骤:
- 检查3888端口连通性
- 验证各节点
myid唯一性 - 分析
zookeeper.out中的选举日志 - 确认系统时间同步(NTP服务)
数据不一致解决方案:
# 在健康的Leader节点执行 ${ZOOKEEPER_HOME}/bin/zkCli.sh reconfig -remove <故障节点ID>6.3 定期维护脚本
#!/bin/bash # 日志轮转与清理 ZK_LOG_DIR=${ZOOKEEPER_HOME}/logs find ${ZK_LOG_DIR} -name "zookeeper.log.*" -mtime +7 -exec gzip {} \; find ${ZK_LOG_DIR} -name "zookeeper.out.*.gz" -mtime +30 -delete # 快照清理(保留最近5个) find ${ZOOKEEPER_HOME}/data/version-2 -name "snapshot.*" | \ sort -r | tail -n +6 | xargs rm -f
编程学习
技术分享
实战经验