zookeeper启不来了

ZooKeeper 启动后 2181 端口未监听排查与修复记录

一、问题描述

在 Linux 服务器中执行 ZooKeeper 启动命令后,控制台提示服务已经运行:

复制代码
./zkServer.sh start

启动输出如下:

复制代码
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 4446.

但继续检查端口时,发现 2181 和配置中的管理端口 8085 均未监听:

复制代码
sudo netstat -tunlp | grep 2181
sudo netstat -tunlp | grep 8085

这说明现象上看似"已经启动",但实际上 ZooKeeper 并没有正常对外提供服务。

二、问题分析

1. 表面现象与真实状态不一致

zkServer.sh start 返回 already running as process 4446,只能说明启动脚本检测到了一个已有的进程号,并不代表 ZooKeeper 当前一定运行正常,更不代表端口已经成功监听。

2. 启动脚本的判断机制

ZooKeeper 的 zkServer.sh 脚本会根据 zoo.cfg 中的 dataDir 路径,默认在该目录下生成 PID 文件:

复制代码
/usr/local/zookeeper/data/zookeeper_server.pid

脚本再次启动时,会优先读取该 PID 文件中的进程号,并判断该进程是否存在。如果进程号存在,就会直接提示:

复制代码
already running as process xxxx

因此,当 PID 文件残留、内容失效、或者对应进程状态异常时,就会出现"脚本判断已启动,但服务实际不可用"的问题。

3. 本次问题的根因

本次问题最终确认是:

  • dataDir 目录下残留了旧的 PID 文件

  • 启动脚本读取到了旧的进程号

  • 脚本误认为 ZooKeeper 已经在运行

  • 实际上 2181 端口并没有被正常监听

根因文件如下:

复制代码
/usr/local/zookeeper/data/zookeeper_server.pid

三、排查过程

1. 先确认配置文件

查看 zoo.cfg,确认 ZooKeeper 的基础配置如下:

复制代码
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/dataLog
admin.serverPort=8085
clientPort=2181

从配置上看,客户端端口为 2181,管理端口为 8085,理论上正常启动后应至少能看到 2181 监听。

2. 检查端口监听状态

执行以下命令检查端口:

复制代码
sudo netstat -tunlp | grep 2181
sudo netstat -tunlp | grep 8085

检查结果为空,说明 ZooKeeper 实际没有成功监听端口。

3. 检查启动脚本提示

进入 bin 目录再次执行启动命令:

复制代码
./zkServer.sh start

脚本提示:

复制代码
Starting zookeeper ... already running as process 4446.

这一步进一步说明,问题不在"启动命令没有执行",而在于"脚本错误地判断服务已运行"。

4. 结合目录结构定位 PID 文件位置

根据 ZooKeeper 启动脚本机制,以及当前配置中的 dataDir=/usr/local/zookeeper/data,可以判断 PID 文件默认不在安装根目录,而是在 dataDir 下。

因此,本次重点排查文件为:

复制代码
/usr/local/zookeeper/data/zookeeper_server.pid

5. 锁定问题

当端口未监听、但启动脚本又提示 already running 时,最典型的原因就是 PID 文件残留。

也就是说:

  • ZooKeeper 之前可能异常退出

  • PID 文件没有被正常清理

  • 后续重启时脚本误判为服务仍在运行

至此,问题定位完成。

四、解决问题过程

1. 删除残留 PID 文件

执行以下命令删除无效 PID 文件:

复制代码
rm -f /usr/local/zookeeper/data/zookeeper_server.pid

2. 重新启动 ZooKeeper

重新执行启动命令:

复制代码
cd /usr/local/zookeeper/bin
./zkServer.sh start

3. 再次验证端口

启动后重新检查:

复制代码
sudo netstat -tunlp | grep 2181

此时 2181 端口恢复正常监听,说明 ZooKeeper 已重新启动成功,问题修复完成。

五、最终结论

本次问题并不是 ZooKeeper 正常运行而端口未显示,而是 ZooKeeper 实际未成功提供服务,启动脚本又被残留 PID 文件误导,导致出现"显示已启动、实际未监听"的假象。

最终修复方式为:

复制代码
rm -f /usr/local/zookeeper/data/zookeeper_server.pid
cd /usr/local/zookeeper/bin
./zkServer.sh start

修复后,2181 端口恢复正常。

六、经验总结

  1. zkServer.sh start 提示 already running 时,不能直接认为服务一定正常。

  2. 端口是否监听,才是判断 ZooKeeper 是否真正可用的重要依据。

  3. ZooKeeper 的 PID 文件默认位于 dataDir 目录下,而不是安装根目录。

  4. 如果出现"无法启动但提示已运行"的情况,应优先检查并清理残留的 zookeeper_server.pid 文件。

相关推荐
Molesidy31 分钟前
【GUI】【AWTK】基于开阳平台的GUI界面设计环境搭建
linux·gui·awtk
RisunJan42 分钟前
Linux命令-semanage(SELinux 策略管理)
linux·运维·服务器
流浪0011 小时前
Linux系统篇 21:文件(五)——动静态库、ELF 底层原理全解
linux·运维·服务器
Dawn-bit1 小时前
Linux救援模式和系统恢复
linux·运维·服务器·云计算·运维开发
十八岁牛爷爷1 小时前
Linux 进程与进程状态・三层级深度解析
linux·运维·服务器
不会就选b2 小时前
linux之进程管理(二)--替换
linux·运维·服务器
倔强的石头1062 小时前
【Linux指南】动静态库系列(二):从源码复用到目标文件复用:为什么需要把 .o 打包成库
linux·运维·服务器
HLC++14 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室15 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设