【问题标题】:How to automatically start Kafka upon system startup in Ubuntu?如何在 Ubuntu 系统启动时自动启动 Kafka?
【发布时间】:2016-04-03 09:51:12
【问题描述】:

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

我见过的唯一官方启动Kafka的方法是:

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

我尝试在crontab -e 中使用@reboot 任务,但它没有启动Kafka。有些人还写了自定义的init.d

也有可用的自定义 init.d 脚本(例如 onetwothree),但是它们都是不同的,我对 init.d 不够熟悉,无法理解要实现哪一个(如果有的话) .

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

【问题讨论】:

    标签: ubuntu apache-kafka init.d


    【解决方案1】:

    下载卡夫卡

    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
    • 设置:TimeoutSec=30 Restart=on-failure 已排序,干杯。
    【解决方案2】:

    一种简单的方法是使用 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
    

    【讨论】:

      【解决方案3】:

      以下是我在 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 也比较陌生。谢谢!
      • 是的,这就是你从kafka.apache.org/downloads下载并解压tgz文件后得到的目录
      • 上述答案的附录:除非BEGIN INIT INFO 前导码添加到此脚本中,否则 update-rc.d 实用程序将忽略该脚本以创建符号链接。见askubuntu.com/questions/877383/…
      • Ubuntu16.4 说:kafka.service:在步骤执行失败产卵/etc/init.d/kafka:执行格式错误
      • 在 zookeeper 之后立即启动 kafka 可以吗?不需要延迟?还是等待 zookeeper 接受连接?
      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 2011-11-11
      • 2015-08-07
      • 2018-03-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多