Предыстория
Буквально недавно я начал создавать свой аналог сервиса Discord, используя веб-сокеты и передавая сообщения через очередь. В один из моментов мне понадобилось проверить, корректно ли проходят сообщения в этой очереди. Тогда я осознал, как неудобно каждый раз заходить в docker контейнер и вручную вводить команду для просмотра всех сообщений в топиках. После дня анализа и советов от моего коллеги, опытного DevOps-инженера Паши, я пришел к выводу, что kafka-ui от команды provectus — это наилучший и наиболее удобный инструмент для визуализации данных в Kafka.
Docker-Compose
Для начала давайте настроем наш docker-compose под современные реалии kafka. Для этого у нас будет использоваться 2 основных образа
kafka
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-server:7.2.1
hostname: kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: kafka
В параметрах образа для ZooKeeper основное — это указание рабочего порта. Я также добавил параметр tick_time, который, хоть и не является обязательным, я по привычке всегда указываю. Вкратце, tick_time используется для синхронизации реплик и задания таймаутов различных операций.
По конфигурации Kafka ситуация аналогичная: основное — это рабочий порт и базовые конфигурационные параметры, связанные с ZooKeeper. Но ключевым моментом здесь является работа с JMX (Java Management Extensions). JMX — это стандартные средства для мониторинга и управления приложениями, работающими на Java. В рамках Apache Kafka, JMX позволяет мониторить различные метрики работы брокера. Для наших нужд достаточно указать порт и имя хоста для JMX, который, как вы возможно догадались, в дальнейшем будет использоваться в kafka-ui.
Последний этап — это настройка образа для kafka-ui. Ознакомившись с официальной документацией команды provectus, вы найдете множество шаблонов для kafka-ui в комбинации с другими сервисами. Однако, стартовый шаблон для связки Kafka, ZooKeeper и kafka-ui на официальном сайте отсутствует. Так что я предоставлю вам свою рабочую версию файла compose.
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-server:7.2.1
hostname: kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
- "9997:9997"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997
KAFKA_JMX_HOSTNAME: kafka
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8082:8080
environment:
DYNAMIC_CONFIG_ENABLED: true
Здесь, как вы можете увидеть, мы указываем рабочий порт, образ (image), который Docker должен загрузить, а также переменную "DYNAMIC_CONFIG_ENABLED". Она нужна, что неудивительно, для возможности изменения конфигурации вашего kafka-ui в реальном времени. С полным списком переменных окружения вы можете ознакомиться, перейдя по предоставленной ссылке.
Подключение брокера к Kafka-UI
После успешного запуска вашего docker-compose файла, вам нужно перейти на заданный вами порт для kafka-ui и увидеть следующую картину:
Теперь давайте добавим нашу kafka в kafka-ui. Для этого давайте нажмем на кнопку configure new cluster где вам нужно заполнить следующие поля:
Cluster name - Можете указать просто как "Kafka Cluster"
Bootstrap Servers - Суда вам внужно вписать PLAINTEXT://kafka:29092 ну или другое наименование в зависимости от вашей конфигурации параметра "KAFKA_ADVERTISED_LISTENERS" в kafka image. Соотвественно если у вас поднято несколько реплик кафки, вам нужно их всех вписать. Apache рекомендуют иметь 3 ноды с kafka на вашем проекте.
-
Metrics
metrics type -> JMX
port -> 9997 ну или как вы указали в своей конфигурации
После этого ваш Kafka кластер должен отобразиться в вашем GUI. Выглядит это примерно так:
Функционал
Самое важное в данном сервисе как по мне это функционал по просмотру топика внутри вашей кафки. Для этого нам нужно перейти во вкладку Topics и далее перейти во вкладку messages где мы сможем лицезреть полную информацию по каждому сообщению и фильтр для поиска специфичный сообщений.
Так же вы можете просматривать ваших consumer'ов и их группы во вкладке consumers.
Для просмотра конфигурации вам нужно перейти во вкладку Brokers и выбрать нужный вам брокер
Далее переходим во вкладку Metrics и просматриваем всю нужную нам информацию.
Итог
В процессе создания своего аналога сервисов Discord я столкнулся с необходимостью мониторить свою очередь сообщений в Kafka. Я искал удобный инструмент для этого, и благодаря совету моего коллеги Паши, DevOps инженера, я обратил внимание на kafka-ui от команды provectus. Этот интерфейс позволил мне легко отслеживать все сообщения в топиках без необходимости вручную входить в docker контейнер. Особо хочу отметить удобство и функциональность kafka-ui: просмотр сообщений в топиках, мониторинг consumer'ов и их групп, а также возможность просмотра конфигурации и метрик брокера. Используя этот инструмент, я значительно упростил процесс работы и диагностики своей системы. Если кто-то из вас работает с Kafka, рекомендую обратить внимание на kafka-ui!
Комментарии (9)
Haarolean
08.08.2023 21:23Привет, спасибо за упоминание kafka-ui!
>Однако, стартовый шаблон для связки Kafka, ZooKeeper и kafka-ui на официальном сайте отсутствует
На самом деле, у нас все же есть один компот с включенным zookeper'ом, в остальных примерах kafka работает в kraft режиме, где zookeeper не нужен.
b00
Мой ассоциативный ряд:
Java -> Idea -> BigDataTool -> Kafka
aleksandy
А где в статье упомянуто, что автор писал на яве? А так-то, конечно, да, всё в одном месте.
b00
После дня анализа и советов от моего коллеги, я пришел к выводу, что хаб и тег Java вызывают ассоциации с Java.
aleksandy
Действительно. :) Да кто на них смотрит, эти тэги?
LordBarov Автор
kafka-ui это Java приложение, поэтому я Java и отметил) В целом мне кажется все что касается Apache можно отнести к Java