首先需要明确是哪个端口被占用,以及占用该端口的进程是什么。Zookeeper的常用端口包括:
clientPort):默认2181(单机/集群均需配置);server.X配置中的第一个端口(如2888,用于Leader选举)和第二个端口(如3888,用于数据同步)。使用以下命令检查端口占用:
sudo netstat -tulnp | grep <端口号> # 如 sudo netstat -tulnp | grep 2181
# 或使用更现代的ss命令
sudo ss -tulnp | grep <端口号>
输出结果会显示占用端口的进程ID(PID)和进程名称(如java、nginx等)。
如果占用端口的进程是无关服务(如误启动的其他应用),可以直接终止该进程:
sudo kill -9 <PID> # 替换<PID>为上一步查到的进程ID
终止后,再次检查端口是否释放:
sudo netstat -tulnp | grep <端口号>
若无输出,则表示端口已释放。
如果占用端口的进程是必需服务(如另一台Zookeeper实例),则需要修改Zookeeper的配置文件,更换端口。
配置文件路径通常为:
/etc/zookeeper/conf/zoo.cfg 或 /opt/zookeeper/conf/zoo.cfg;conf/zoo.cfg文件。修改以下参数(以clientPort为例,集群端口同理):
# 原配置(默认2181)
clientPort=2181
# 修改为未被占用的端口(如2182)
clientPort=2182
集群模式还需修改server.X的端口(确保每个节点的server.X端口不重复):
# 原配置(默认2888:3888)
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
# 修改为(如2889:3889、2890:3890)
server.1=zoo1:2889:3889
server.2=zoo2:2890:3890
修改完成后,保存文件。
修改配置后,需要重启Zookeeper以使更改生效:
# 如果使用systemd管理(Ubuntu 16.04+推荐)
sudo systemctl restart zookeeper
# 如果使用sysvinit管理(旧版Ubuntu)
sudo service zookeeper restart
重启后,检查服务状态是否正常:
sudo systemctl status zookeeper # 或 sudo service zookeeper status
若状态显示为active (running),则表示服务已正常启动。
最后,再次检查Zookeeper的新端口是否处于监听状态:
sudo netstat -tulnp | grep <新端口号> # 如 sudo netstat -tulnp | grep 2182
若有输出且进程为java(Zookeeper进程),则说明端口冲突已解决。
server.X配置同步更新,否则会导致集群无法正常通信;80、443),防止与其他服务冲突;lsof -i :<端口号>进一步分析。