如何在Ubuntu系统启动时自动启动Kafka?

14

Kafka是否有官方的方式(例如init.d脚本)在系统启动时启动Kafka?

我所见过的唯一官方方法是:

nohup ~/kafka/bin/kafka-server-start.sh ~/kafka/config/server.properties > ~/kafka/kafka.log 2>&1 &

我尝试使用@reboot命令在crontab -e中,但它没有启动Kafka。有些人也写了定制的init.d脚本。

还有一些自定义的init.d脚本可用(例如一个两个三个),但它们都不同,并且我对init.d不熟悉,不知道应该使用哪一个。

如何在系统启动时启动Kafka?

3个回答

25

以下是我如何在Ubuntu 14.04上配置Kafka自动启动的方法:

sudo su
cp -R ~/kafka_2.11-0.10.0.1 /opt
ln -s /opt/kafka_2.11-0.10.0.1 /opt/kafka

将以下初始化脚本复制到 /etc/init.d/kafka:

DAEMON_PATH=/opt/kafka/
PATH=$PATH:$DAEMON_PATH/bin

# See how we were called.
case "$1" in
  start)
        # Start daemon.
        echo "Starting Zookeeper";
        nohup $DAEMON_PATH/bin/zookeeper-server-start.sh -daemon /$DAEMON_PATH/config/zookeeper.properties 2> /dev/null && \
        echo "Starting Kafka";
        nohup $DAEMON_PATH/bin/kafka-server-start.sh -daemon /$DAEMON_PATH/config/server.properties 2> /dev/null
        ;;
  stop)
        # Stop daemons.
        echo "Shutting down Zookeeper";
        pid=`ps ax | grep -i 'org.apache.zookeeper.server' | grep -v grep | awk '{print $1}'`
        if [ -n "$pid" ]
          then
          kill -9 $pid
        else
          echo "Zookeeper was not Running"
        fi
        echo "Shutting down Kafka";
        pid=`ps ax | grep -i 'kafka.Kafka' | grep -v grep | awk '{print $1}'`
        if [ -n "$pid" ]
          then
          kill -9 $pid
        else
          echo "Kafka was not Running"
        fi
        ;;
  restart)
        $0 stop
        sleep 2
        $0 start
        ;;
  status)
        pid=`ps ax | grep -i 'org.apache.zookeeper.server' | grep -v grep | awk '{print $1}'`
        if [ -n "$pid" ]
          then
          echo "Zookeeper is Running as PID: $pid"
        else
          echo "Zookeeper is not Running"
        fi
        pid=`ps ax | grep -i 'kafka.Kafka' | grep -v grep | awk '{print $1}'`
        if [ -n "$pid" ]
          then
          echo "Kafka is Running as PID: $pid"
        else
          echo "Kafka is not Running"
        fi
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit 0

使用以下命令创建Kafka服务:

chmod 755 /etc/init.d/kafka
update-rc.d kafka defaults

现在你应该可以像这样启动和停止kafka服务:

sudo service kafka start
sudo service kafka status
sudo service kafka stop

如果您想稍后删除Kafka服务,请运行update-rc.d -f kafka remove


嘿,谢谢你的回答。我正想做这件事。尽管我的Ubuntu版本和Kafka版本似乎有点晚,而且我被指派执行此操作的机器上似乎没有“kafkakafka_2.11-0.10.0.1”项目在我的主目录(〜)中。这只是Kafka安装目录,无论它在哪里?只是再次确认,因为我没有在这里个人安装Kafka或启动服务器,但只是负责自动化启动时的Kafka。我对Unix也相对较新。谢谢! - ThePartyTurtle
1
是的,这就是从 https://kafka.apache.org/downloads 下载并提取 tgz 文件后得到的目录。 - Ian Downard
以上答案附加说明:如果此脚本未添加“BEGIN INIT INFO”前言,则update-rc.d实用程序将忽略该脚本以创建符号链接。请参见https://askubuntu.com/questions/877383/16-10-server-update-rc-d-not-creating-symlinks-for-vncserver - Chadwick Robbert
Ubuntu16.4提示:kafka.service:在执行/etc/init.d/kafka时失败:执行格式错误。 - linrongbin
在 Zookeeper 启动后立即启动 Kafka 是否可以?不需要延迟吗?还是要等待 Zookeeper 接受连接? - chenchuk
这个 /etc/init.d/kafka 脚本应该以 "#! /bin/sh" 开头吧? - remigiusz boguszewicz

12

下载 Kafka

cd /opt
sudo wget http://mirror.hosting90.cz/apache/kafka/2.5.0/kafka-2.5.0-src.tgz
sudo tar -zxvf kafka-2.5.0-src.tgz
sudo mv kafka-2.5.0-src kafka
sudo rm kafka-2.5.0-src.tgz
cd kafka
sudo ./gradlew jar -PscalaVersion=2.11.12

安装Zookeeper

sudo vi /etc/systemd/system/zookeeper.service

编辑zookeeper.service文件

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=root
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

启动Zookeeper

sudo systemctl enable zookeeper.service

sudo systemctl start zookeeper.service

sudo systemctl status zookeeper.service

活跃 (运行中)

安装Kafka

sudo vi /etc/systemd/system/kafka.service

编辑 kafka.service

[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=root
ExecStart=/bin/sh -c '/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties > /opt/kafka/kafka.log 2>&1'
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

启动Kafka

sudo systemctl enable kafka.service

sudo systemctl start kafka.service

sudo systemctl status kafka.service

活动(运行中)

测试 Kafka 是否正常工作

创建主题

sudo bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test-topic

发布消息到主题

sudo bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic  
> test message1
> test messate2
^C

阅读主题消息

sudo bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic test-topic
test message1
test messate2
^C

嗨,谢谢。我在重新启动后无法使kafka服务正常启动。正在尝试在Raspberry Pi 4上使其工作。错误是:ERROR [KafkaServer id=0] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) org.apache.kafka.common.KafkaException: Socket server failed to bind to 192.168.1.150:9092: Cannot assign requested address - user4292309
将设置更改为 TimeoutSec=30 Restart=on-failure,问题解决了,谢谢。 - user4292309
主题创建命令已更改为 sudo ./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-topic - undefined

7

一个简单的方法是使用systemd。需要注意的是,在启动时,像JAVA_HOME这样的环境变量尚未加载,因此我们应该将它们引入到系统中。一种好的解决方案是创建一个名为profile的文件,并添加所有必要的变量:

# /home/kafka/profile
JAVA_HOME=/opt/jdk8
KAFKA_HOME=/opt/kafka

假设您已经将Kafka安装在路径/opt/kafka上,为了使Kafka在Ubuntu启动后自动运行(在Ubuntu 16.04和CentOS7上测试过,我猜它可以在任何支持systemd的发行版上工作),请执行以下命令:

sudo nano /etc/systemd/system/kafka.service  # open file to add service informations

现在将以下内容添加到文件中。
[Unit]
Description=Kafka Daemon
Wants=syslog.target

# suppose you have a service named zookeeper that it start zookeeper and we want Kafka service run after the zookeeper service
After=zookeeper.service

[Service]    
Type=forking

# the user whom you want run the Kafka start and stop command under
User=kafka    

# the file path that contains envirnment variables
EnvironmentFile=/home/kafka/profile

# the directory that the commands will run there   
WorkingDirectory=/home/kafka/ 

# Kafka server start command
ExecStart=/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# Kafka server stop command
ExecStop=/opt/kafka/bin/kafka-server-stop.sh -daemon

TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意:由于Kafka在启动时需要连接Zookeeper,因此我们需要一个Zookeeper服务,并将Kafka服务设置为在Zookeeper服务启动后运行。

在保存kafka.service文件后,只需运行以下命令创建Kafka服务的链接,它将在每次重新启动操作系统时启动:

sudo systemctl enable kafka

现在,您可以使用以下命令启动Kafka服务:
sudo systemctl start kafka.service

并检查服务的状态:

sudo systemctl status kafka.service

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接