Как автоматически запустить Kafka при запуске системы в Ubuntu?

У Кафки есть официальный способ (например, init.d script), чтобы запустить Kafka при запуске системы?

Единственный официальный способ запуска 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 при запуске системы?

Ответ 1

Вот как я настраиваю Kafka для автоматического запуска на Ubuntu 14.04:

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

Скопируйте следующий init script в /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.

Ответ 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, и я настроил сервис Kafka на запуск после запуска сервиса zookeeper.

Теперь, после сохранения файла kafka.service, просто запустите следующую команду, чтобы создать ссылку службы Kafka, и она будет запускаться при каждой перезагрузке ОС:

sudo systemctl enable kafka

Теперь вы можете запустить сервис Kafka с помощью команды:

sudo systemctl start kafka.service

и проверьте статус услуги:

sudo systemctl status kafka.service

Ответ 3

Скачать Кафка

cd /opt
wget http://mirror.dkm.cz/apache/kafka/2.2.1/kafka_2.11-2.2.1.tgz
sudo tar -zxvf kafka_2.11-2.2.1.tgz
sudo rm kafka_2.11-2.2.1.tgz
sudo mv kafka_2.11-2.2.1 kafka
cd kafka

Установить 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

активный (работает)

Установить Кафку

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

Старт Кафка

sudo systemctl enable kafka.service

sudo systemctl start kafka.service

sudo systemctl status kafka.service

активный (работает)

Тест Кафка работает

создать тему

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