1. ZooKeeper集群部署前的准备工作
在开始部署ZooKeeper 3.6.3集群之前,我们需要做好充分的准备工作。首先确保你有三台运行Linux的服务器,这三台服务器需要满足以下条件:
- 操作系统:建议使用CentOS 7.x或Ubuntu 18.04及以上版本
- Java环境:ZooKeeper需要Java 8或更高版本
- 网络配置:服务器之间需要能够互相通信,建议关闭防火墙或开放相关端口
- 时间同步:集群节点间时间必须同步,建议配置NTP服务
我建议将三台服务器的主机名分别设置为zk1、zk2和zk3,这样后续配置会更清晰。在实际生产环境中,这三台服务器最好分布在不同的物理机上,以确保高可用性。
提示:在开始安装前,建议先更新系统软件包。在CentOS上可以使用
yum update -y,在Ubuntu上使用apt update && apt upgrade -y。
2. 安装Java环境
ZooKeeper运行需要Java环境支持,以下是安装OpenJDK 11的步骤:
# 对于CentOS/RHEL系统 sudo yum install -y java-11-openjdk-devel # 对于Ubuntu/Debian系统 sudo apt install -y openjdk-11-jdk安装完成后,验证Java版本:
java -version输出应该类似于:
openjdk version "11.0.12" 2021-07-20 OpenJDK Runtime Environment (build 11.0.12+7-post-Debian-2) OpenJDK 64-Bit Server VM (build 11.0.12+7-post-Debian-2, mixed mode, sharing)3. 下载并安装ZooKeeper
在三台服务器上分别执行以下步骤:
- 创建安装目录并下载ZooKeeper:
cd /opt sudo wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz- 解压安装包:
sudo tar -xzf apache-zookeeper-3.6.3-bin.tar.gz sudo mv apache-zookeeper-3.6.3-bin zookeeper- 创建数据和日志目录:
sudo mkdir -p /var/lib/zookeeper/{data,logs} sudo chown -R $(whoami):$(whoami) /var/lib/zookeeper4. 配置ZooKeeper集群
这是部署过程中最关键的一步,我们需要正确配置ZooKeeper集群。
- 首先,复制示例配置文件:
cd /opt/zookeeper/conf cp zoo_sample.cfg zoo.cfg- 编辑zoo.cfg文件,添加以下内容:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper/data dataLogDir=/var/lib/zookeeper/logs clientPort=2181 server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888让我解释一下这些关键参数的含义:
- tickTime:ZooKeeper使用的基本时间单位(毫秒)
- initLimit:follower节点初始连接leader节点的超时时间(以tickTime为单位)
- syncLimit:follower节点与leader节点之间请求应答的超时时间
- dataDir:存储内存数据库快照的目录
- dataLogDir:事务日志目录(如果不设置,会使用dataDir)
- server.X:集群服务器列表,X对应每台服务器的myid文件中的数字
- 创建myid文件,每台服务器的myid文件内容不同:
在zk1上:
echo "1" > /var/lib/zookeeper/data/myid在zk2上:
echo "2" > /var/lib/zookeeper/data/myid在zk3上:
echo "3" > /var/lib/zookeeper/data/myid5. 配置系统服务
为了便于管理,我们可以将ZooKeeper配置为系统服务。
- 创建systemd服务文件:
sudo vi /etc/systemd/system/zookeeper.service- 添加以下内容:
[Unit] Description=Apache ZooKeeper Server Documentation=https://zookeeper.apache.org After=network.target [Service] Type=forking User=root Group=root ExecStart=/opt/zookeeper/bin/zkServer.sh start ExecStop=/opt/zookeeper/bin/zkServer.sh stop ExecReload=/opt/zookeeper/bin/zkServer.sh restart Restart=on-abnormal [Install] WantedBy=multi-user.target- 重新加载systemd并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable zookeeper6. 启动ZooKeeper集群
现在可以启动ZooKeeper服务了。注意,启动顺序应该是随机的,ZooKeeper会自动选举leader。
在三台服务器上分别执行:
sudo systemctl start zookeeper检查服务状态:
sudo systemctl status zookeeper查看集群状态:
/opt/zookeeper/bin/zkServer.sh status正常情况下,输出会显示其中一台是leader,另外两台是follower:
ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leader # 或 follower7. 生产环境优化配置
在生产环境中,我们需要对ZooKeeper进行一些优化配置。以下是zoo.cfg中建议添加的配置项:
# 限制单个IP的最大连接数,防止某个客户端占用过多资源 maxClientCnxns=60 # 自动清理快照和日志文件 autopurge.snapRetainCount=5 autopurge.purgeInterval=24 # 启用四字命令监控 4lw.commands.whitelist=* # 调整JVM堆大小(在zookeeper-env.sh中配置) export JAVA_OPTS="-Xms4G -Xmx4G -XX:+UseG1GC"8. 集群监控与维护
8.1 使用四字命令监控
ZooKeeper提供了一些简单的四字命令用于监控:
echo stat | nc localhost 2181 echo mntr | nc localhost 2181 echo ruok | nc localhost 21818.2 使用ZooInspector可视化工具
ZooInspector是ZooKeeper官方提供的GUI工具,可以直观地查看ZooKeeper中的数据。
- 下载ZooInspector:
wget https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip unzip ZooInspector.zip- 运行:
cd ZooInspector/build java -jar zookeeper-dev-ZooInspector.jar8.3 日志清理脚本
ZooKeeper不会自动清理旧的快照和日志文件,我们需要定期清理。创建一个清理脚本:
#!/bin/bash # 保留最近5个快照和日志 count=5 dataDir=/var/lib/zookeeper/data logDir=/var/lib/zookeeper/logs # 清理旧快照 ls -t $dataDir/snapshot.* | tail -n +$((count+1)) | xargs rm -f # 清理旧日志 ls -t $logDir/log.* | tail -n +$((count+1)) | xargs rm -f然后添加到crontab中,每天凌晨执行:
0 2 * * * /path/to/cleanup_script.sh9. 常见问题排查
在实际部署过程中,可能会遇到各种问题。以下是一些常见问题及解决方法:
无法选举leader:
- 检查防火墙是否开放了2888和3888端口
- 检查myid文件是否正确
- 检查服务器时间是否同步
客户端无法连接:
- 检查2181端口是否开放
- 检查zoo.cfg中的clientPort配置
- 检查ZooKeeper服务是否正常运行
性能问题:
- 检查磁盘IO性能,事务日志最好放在单独的SSD上
- 调整JVM堆大小
- 考虑增加观察者节点分担读压力
10. 集群扩展与升级
10.1 添加新节点
要向现有集群添加新节点,需要:
- 在新节点上安装ZooKeeper
- 在zoo.cfg中添加所有服务器列表
- 创建myid文件
- 逐步重启现有节点使配置生效
10.2 版本升级
升级ZooKeeper版本时,建议:
- 先升级观察者节点
- 然后升级follower节点
- 最后升级leader节点
- 确保所有节点使用相同的配置文件
在生产环境中,我建议先在测试环境验证升级过程,确保兼容性和稳定性。升级过程中要密切关注监控指标,准备好回滚方案。