Как бы не хотелось, но и мне пришлось познакомиться с распределенным брокером сообщений 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
Файловая структура:
bin
- bash
файлы для работы с Kafka API
, (есть директория windows
с bat
файлами)config
- конфиги для работы Kafka
с ZooKeeper
kraft
- конфиги для работы Kafka
без ZooKeeper
используя встроенную реализацию кворумаlibs
- jar
файлыlicenses
- файлы с лицензиямиlogs
- логи, не тоже самое что log.dirs
в .properties
файлахsite-docs
- директория с архивом документацииКоманды ниже позволяют запустить
Kafka
в единственном (не кластерном) экземпляре.
В конфиге config/kraft/server.properties
необходимо обратить внимание на 2 директивы:
advertised.listeners
- настройки прослушивателя, которые брокер передаст клиентам подключенным к нему, нужно указать ip
адрес сервера, на котором размещена Kafka
log.dirs
- директория логов текущего состояния кластера/брокера/контроллераНо для начала давайте взглянем какая нагрузка на нашу машину без 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
без нагрузки:
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
Рассмотрим минимально необходимое 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 здесь.