Apache Kafka - быстрый старт

2023.02.27
Кратко рассмотрим Apache kafka, а именно: процесс установки и конфигурирования, запуск в единственном экземпляре, работа с API и через веб-интерфейс

Как бы не хотелось, но и мне пришлось познакомиться с распределенным брокером сообщений Apache Kafka. Изначально стартовать работать с этим ПО оказалось достаточно быстро. Процесс эксплуатации покажет какого оно в обслуживании.

В данной статье мы развернем Kafka в единственном экземпляре на хосте, посмотрим API и веб-интерфейс. А в следующей статье есть обзор на книгу Kafka в действии со сборником цитат и некотоырми разъяснениями.

В статье могут встречаться новые термины, теоретическую часть мы разберем позже при обзоре книги "Kafka в действии".

Установка

Сначала нужно установить jdk:

$ sudo apt install default-jdk

Создадим отдельного пользователя без привелегий, от имени которого будем запускать Kafka:

$ sudo adduser username

Далее идем на страницу скачивания Apache Kafka и качаем последнюю версию. На момент написания статьи это 3.4.0. Я качал от имени нового юзера в его домашнюю директорию:

$ curl -LO https://dlcdn.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz
$ tar -xvzf kafka_2.13-3.4.0.tgz
$ mv kafka_2.13-3.4.0 kafka

Файловая структура:

Конфигурация и запуск

Команды ниже позволяют запустить Kafka в единственном (не кластерном) экземпляре.

В конфиге config/kraft/server.properties необходимо обратить внимание на 2 директивы:

Но для начала давайте взглянем какая нагрузка на нашу машину без Kafka:

Нагрузка на vps без Kafka

В документации есть инструкция по запуску Kafka с KRaft (встроенный механизм кворума, замена ZooKeeper, который начал вырезатсья с 2.8.0):

# генерация идентификатора кластера
$ KAFKA_CLUSTER_ID="$(./bin/kafka-storage.sh random-uuid)"

# инициализация хранилища кластера в соответствии с настройками
$ ./bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties

# запуск Kafka
$ ./bin/kafka-server-start.sh config/kraft/server.properties

Теперь посмотрим на нагрузку с запущенной Kafka без нагрузки:

Нагрузка на vps с запущенной Kafka

Kafka требовательна к ресурсам, даже в режиме без нагрузки.

Автозагрузка

Создадим файл конфиг в systemd:

$ sudo nano /etc/systemd/system/kafka.service

И положим в него следующее:

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

[Service]
Type=simple
User=username
ExecStart=/home/username/kafka/bin/kafka-server-start.sh /home/username/kafka/config/kraft/server.properties
ExecStop=/home/username/kafka/bin/kafka-server-stop.sh
TimeoutSec=30
Restart=always
RestartSec=20s

[Install]
WantedBy=multi-user.target

Запустим демона:

$ sudo systemctl start kafka

Проверим статус работы демона:

$ sudo systemctl status kafka
* kafka.service
     Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-03-03 22:25:46 MSK; 14s ago
   Main PID: 66566 (java)
      Tasks: 88 (limit: 4648)
     Memory: 333.7M
     CGroup: /system.slice/kafka.service
             `-66566 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:MaxInlineLevel=15 -Djava.awt.headless=true -Xlog:>

Если есть ошибки то смотрим:

$ journalctl -xe

Kafka API

Рассмотрим минимально необходимое API для рабоыт с Kafka.

В директории с Kafka есть директория bin которая содержит bash файлы для работы с Kafka API.

Список топиков:

$ ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

Создать топик с тремя разделами:

$ ./bin/kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --create \
    --topic helloworld \
    --partitions 3

Информация о топике:

$ ./bin/kafka-topics.sh \
    --bootstrap-server localhost:9092 \
    --describe kinaction_helloworld
Topic: kinaction_helloworld     TopicId: Q0PsvP9eSbSCL7UHliHiBA PartitionCount: 3       ReplicationFactor: 1    Configs: segment.bytes=1073741824
        Topic: helloworld     Partition: 0    Leader: 1       Replicas: 1     Isr: 1
        Topic: helloworld     Partition: 1    Leader: 1       Replicas: 1     Isr: 1
        Topic: helloworld     Partition: 2    Leader: 1       Replicas: 1     Isr: 1

Удаление топика:

$ ./bin/kafka-topics.sh \
    --bootstrap-server localhost:9094 \
    --delete \
    --topic helloworld

Узнать cluster-id:

$ ./bin/kafka-cluster.sh cluster-id \
    --bootstrap-server localhost:9092 \
    --config config/kraft/server.properties

Убрать брокера c id 1 из кластера:

$ ./bin/kafka-cluster.sh unregister \
    --bootstrap-server localhost:9092 \
    --config config/kraft/server.properties \
    --id 1

Веб-интерфейс

Для работы с Apache Kafka есть несколько продуктов, предоставляющих веб-интерфейс. Один из наиболее интересных для меня kafka-ui, образ для docker здесь, инструкция по запуску в docker compose здесь.

В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps