Ubuntu环境下Zookeeper集群故障排查技巧
Zookeeper的日志是故障排查的核心线索,Ubuntu下日志通常位于dataDir目录(如/var/lib/zookeeper/log/或自定义路径)或/var/log/zookeeper/下,文件名为zookeeper.out或zookeeper.log。使用tail -f /path/to/zookeeper.log实时查看最新日志,重点关注ERROR、WARN级别的信息(如端口冲突、磁盘空间不足、节点通信失败等),快速定位故障根源。
Zookeeper的配置文件zoo.cfg(通常位于/etc/zookeeper/conf/或$ZOOKEEPER_HOME/conf/)是集群运行的基础,需检查以下关键参数:
dataDir:数据目录是否存在且具备读写权限(chmod -R 755 /path/to/dataDir);clientPort:客户端连接端口(默认2181)是否未被其他进程占用;server.X:集群节点配置是否完整(格式为server.X=hostname:peerPort:leaderPort,如server.0=node1:2888:3888),且所有节点的X值唯一。注意:若修改了zoo.cfg,需重启集群(zkServer.sh restart)使配置生效。
使用zkServer.sh status命令查看每个节点的状态(Leader/Follower/Looking),若状态显示“Not running”或进程ID与dataDir/zookeeper_server.pid中的ID不一致,需进一步排查:
jps命令确认QuorumPeerMain进程是否存在(该进程是Zookeeper的核心进程);zookeeper_server.pid文件(rm -f /path/to/dataDir/zookeeper_server.pid),再重启服务。Zookeeper集群依赖节点间的通信,需检查:
ping命令测试节点间是否可达(如ping node2);netstat -tulnp | grep 端口号(如netstat -tulnp | grep 2181)检查clientPort(默认2181)、peerPort(默认2888)、leaderPort(默认3888)是否被占用。若端口被占用,杀掉占用进程(kill -9 PID)或修改zoo.cfg中的端口。dataDir目录下的myid文件存储了节点的唯一ID(如1、2),需确保其内容与zoo.cfg中server.X的X值一致(如server.1对应myid内容为1)。若不一致,修改myid文件(echo 1 > /path/to/dataDir/myid)并重启节点。
Zookeeper依赖Java 8及以上版本,需确认:
java -version查看版本);JAVA_HOME环境变量已正确设置(在/etc/profile或~/.bashrc中添加export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64,然后source /etc/profile)。若端口被占用,使用以下命令排查并解决:
# 查找占用端口的进程
sudo lsof -i :2181
# 杀掉占用进程
sudo kill -9 <PID>
# 重启Zookeeper
zkServer.sh start
Ubuntu的ufw防火墙需允许Zookeeper端口通过:
# 查看防火墙状态
sudo ufw status
# 允许2181端口(客户端连接)
sudo ufw allow 2181/tcp
# 允许2888、3888端口(集群通信)
sudo ufw allow 2888/tcp
sudo ufw allow 3888/tcp
# 重启防火墙
sudo ufw reload
使用top、df -h、free -m命令检查节点的CPU、内存、磁盘空间:
zoo.cfg中的maxClientCnxns(最大客户端连接数)或增加服务器内存;dataDir、logs目录中的旧数据(保留最近7天日志即可)。zkServer.sh status),若异常则发送告警(邮件/短信);dataDir目录(如rsync -avz /var/lib/zookeeper /backup/zookeeper);systemd创建服务(/etc/systemd/system/zookeeper.service),设置Restart=always,实现进程崩溃后自动重启。