AWS服务器启动脚本中Kafka与ZooKeeper启动失败求助
解决方案:AWS EC2开机自动启动ZooKeeper与Kafka
核心问题分析
你的脚本中Kafka相关命令失效,主要是三个原因:
- 环境变量缺失:开机启动脚本的执行环境没有加载用户级环境变量(比如
JAVA_HOME,Kafka依赖Java运行),而终端手动执行时会加载这些变量。 - 启动顺序问题:直接后台启动ZooKeeper后立刻启动Kafka,此时ZooKeeper尚未就绪,Kafka连接失败会直接退出。
- Shell兼容性:脚本开头用
#!/bin/sh(多数EC2系统中是轻量的dash),但Kafka的启动脚本是基于bash编写的,存在语法兼容性问题。
修复方案一:调整现有启动脚本
1. 修改脚本头部与环境变量
将脚本开头改为#!/bin/bash,并添加Java环境变量(根据你的Java安装路径调整):
#!/bin/bash # 配置Java环境变量,替换为你的实际Java路径 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
2. 调整启动逻辑,等待ZooKeeper就绪
ZooKeeper启动后需要等待其端口(默认2181)就绪,再启动Kafka:
# 启动ZooKeeper(去掉冗余的sh调用,直接执行脚本) /home/ec2-user/kafka_2.13-3.4.0/bin/zookeeper-server-start.sh -daemon /home/ec2-user/kafka_2.13-3.4.0/config/zookeeper.properties # 等待ZooKeeper端口就绪(需要先安装nc:sudo yum install nc -y) while ! nc -z localhost 2181; do sleep 3 done # 启动Kafka实例 /home/ec2-user/kafka_2.13-3.4.0/bin/kafka-server-start.sh -daemon /home/ec2-user/kafka_2.13-3.4.0/config/server0.properties /home/ec2-user/kafka_2.13-3.4.0/bin/kafka-server-start.sh -daemon /home/ec2-user/kafka_2.13-3.4.0/config/server1.properties
3. 保留原有其他命令
后续的PM2、Nginx启动命令可以保留原写法。
修复方案二:使用Systemd服务管理(推荐)
相比自定义启动脚本,Systemd更稳定,支持自动重启、日志管理,是AWS EC2的标准服务管理方式。
1. 创建ZooKeeper服务文件
新建/etc/systemd/system/zookeeper.service:
[Unit] Description=Apache ZooKeeper Service After=network.target [Service] User=ec2-user ExecStart=/home/ec2-user/kafka_2.13-3.4.0/bin/zookeeper-server-start.sh /home/ec2-user/kafka_2.13-3.4.0/config/zookeeper.properties ExecStop=/home/ec2-user/kafka_2.13-3.4.0/bin/zookeeper-server-stop.sh Restart=on-failure Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" [Install] WantedBy=multi-user.target
2. 创建Kafka通用服务文件
新建/etc/systemd/system/kafka@.service(支持多实例):
[Unit] Description=Apache Kafka Broker %I After=zookeeper.service network.target [Service] User=ec2-user ExecStart=/home/ec2-user/kafka_2.13-3.4.0/bin/kafka-server-start.sh /home/ec2-user/kafka_2.13-3.4.0/config/server%I.properties ExecStop=/home/ec2-user/kafka_2.13-3.4.0/bin/kafka-server-stop.sh Restart=on-failure Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64" [Install] WantedBy=multi-user.target
3. 启用并启动服务
# 重载systemd配置 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable zookeeper.service sudo systemctl enable kafka@0.service sudo systemctl enable kafka@1.service # 立即启动服务 sudo systemctl start zookeeper.service sudo systemctl start kafka@0.service sudo systemctl start kafka@1.service
验证与排查
- 查看启动日志:
- ZooKeeper日志:
journalctl -u zookeeper -f - Kafka实例日志:
journalctl -u kafka@0 -f
- ZooKeeper日志:
- 检查端口状态:
netstat -tulpn | grep -E "(2181|9092)"(默认ZooKeeper端口2181,Kafka端口9092/9093) - 确认权限:确保
ec2-user对Kafka的日志目录、数据目录(配置文件中dataDir/log.dirs指定的路径)有读写权限。
内容的提问来源于stack exchange,提问作者flimsy
相关产品推荐
相关产品推荐

