You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS服务器启动脚本中Kafka与ZooKeeper启动失败求助

解决方案:AWS EC2开机自动启动ZooKeeper与Kafka

核心问题分析

你的脚本中Kafka相关命令失效,主要是三个原因:

  1. 环境变量缺失:开机启动脚本的执行环境没有加载用户级环境变量(比如JAVA_HOME,Kafka依赖Java运行),而终端手动执行时会加载这些变量。
  2. 启动顺序问题:直接后台启动ZooKeeper后立刻启动Kafka,此时ZooKeeper尚未就绪,Kafka连接失败会直接退出。
  3. 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

验证与排查

  1. 查看启动日志:
    • ZooKeeper日志:journalctl -u zookeeper -f
    • Kafka实例日志:journalctl -u kafka@0 -f
  2. 检查端口状态:netstat -tulpn | grep -E "(2181|9092)"(默认ZooKeeper端口2181,Kafka端口9092/9093)
  3. 确认权限:确保ec2-user对Kafka的日志目录、数据目录(配置文件中dataDir/log.dirs指定的路径)有读写权限。

内容的提问来源于stack exchange,提问作者flimsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:37:37