首先确认Zookeeper服务是否正在运行。在CentOS/RHEL系统中,可使用systemctl命令:
sudo systemctl status zookeeper
若服务未运行,启动服务并设置开机自启:
sudo systemctl start zookeeper
sudo systemctl enable zookeeper
在非systemd系统中,可通过zkServer.sh脚本管理:
./bin/zkServer.sh status # 查看状态
./bin/zkServer.sh start # 启动服务
通过状态信息可快速判断服务是否正常启动。
日志是故障排查的核心依据,Zookeeper日志默认存储在/var/log/zookeeper/目录(或dataLogDir配置的路径),主日志文件通常为zookeeper.out。使用以下命令查看日志:
tail -f /var/log/zookeeper/zookeeper.out # 实时查看最新日志
grep 'ERROR' /var/log/zookeeper/zookeeper.out # 过滤错误信息
也可通过zkServer.sh命令获取特定日期或服务器的日志:
./bin/zkServer.sh get-logs --date 2025-10-12 # 查看指定日期日志
./bin/zkServer.sh get-logs --server server1 # 查看指定服务器日志
重点关注FATAL(致命错误)、ERROR(错误)级别的日志,如java.lang.OutOfMemoryError(内存不足)、Connection refused(连接拒绝)等。
Zookeeper的主配置文件为zoo.cfg(通常位于conf/目录),需检查以下关键参数:
dataDir:数据存储目录是否存在且具备读写权限(如/tmp/zookeeper);clientPort:客户端连接端口(默认2181)是否未被占用;server.X:集群节点配置是否正确(格式为server.id=host:port1:port2,如server.1=node1:2888:3888)。sudo systemctl restart zookeeper
确保所有节点的myid文件(位于dataDir目录)内容与server.X中的id一致。
Zookeeper依赖Java 8及以上版本,需确认Java环境是否正确配置:
java -version # 查看Java版本
echo $JAVA_HOME # 查看JAVA_HOME环境变量
若未安装Java,使用以下命令安装OpenJDK 8(CentOS为例):
sudo yum install java-1.8.0-openjdk-devel -y
若未设置JAVA_HOME,可编辑~/.bash_profile文件添加:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bash_profile
Java版本不兼容(如Java 17)或环境变量未设置会导致启动失败。
Zookeeper默认使用2181端口(客户端连接)、2888端口(Follower与Leader通信)、3888端口(Leader选举)。使用以下命令检查端口占用情况:
netstat -tulnp | grep 2181 # 查看2181端口占用
ss -tuln | grep 2181 # 更现代的端口查看命令
若端口被占用,可杀掉占用进程(kill -9 <PID>)或修改zoo.cfg中的clientPort为新端口(如2182),并重启服务。
Zookeeper集群要求节点间网络互通,使用ping命令测试节点间连通性:
ping node2 # 测试与node2的连通性
使用telnet命令测试端口是否可达(如2181端口):
telnet node2 2181 # 测试node2的2181端口
若无法连通,需检查防火墙设置或网络配置。
Zookeeper是内存密集型应用,需确保系统有足够的资源:
free -m查看内存使用情况,若内存不足,可调整zoo.cfg中的maxClientCnxns(最大客户端连接数)或增加系统内存;df -h查看磁盘空间,若dataDir所在分区空间不足(如小于1GB),需清理磁盘或更换存储路径;top查看CPU使用率,若CPU占用过高(如超过80%),需优化Zookeeper参数(如调整tickTime)或升级硬件。Zookeeper提供了一系列四字命令(需在zoo.cfg中开启4lw.commands.whitelist参数,默认允许常用命令),用于监控集群状态:
stat:查看服务器运行状态(角色、连接数、zxid等);ruok:检查服务器是否运行(返回imok表示正常);mntr:查看集群详细指标(Leader/Follower状态、事务处理数量等);cons:查看客户端连接详情(IP、延迟、请求队列)。nc命令执行四字命令(如localhost为本地服务器):echo stat | nc localhost 2181 # 查看服务器状态
echo mntr | nc localhost 2181 # 查看集群指标
通过四字命令可快速判断集群是否正常运行(如ruok返回imok表示服务正常)。
集群脑裂(多个Leader节点)会导致数据不一致,常见原因包括:
myid文件配置错误(节点ID与server.X不匹配);myid文件(位于dataDir目录),确保内容与zoo.cfg中的server.X一致;mntr命令查看集群状态,确认Leader节点是否唯一。若以上步骤均无法解决问题,可尝试重启Zookeeper服务:
sudo systemctl restart zookeeper
若重启后仍无法启动,需清除数据目录(dataDir)和日志目录(dataLogDir)中的数据(注意:需提前备份重要数据),然后重新启动:
rm -rf /tmp/zookeeper/* # 清除数据目录(默认/tmp/zookeeper)
./bin/zkServer.sh start # 重启服务
清除数据可解决数据损坏或事务日志异常导致的问题。