Предыстория

Буквально недавно я начал создавать свой аналог сервиса Discord, используя веб-сокеты и передавая сообщения через очередь. В один из моментов мне понадобилось проверить, корректно ли проходят сообщения в этой очереди. Тогда я осознал, как неудобно каждый раз заходить в docker контейнер и вручную вводить команду для просмотра всех сообщений в топиках. После дня анализа и советов от моего коллеги, опытного DevOps-инженера Паши, я пришел к выводу, что kafka-ui от команды provectus — это наилучший и наиболее удобный инструмент для визуализации данных в Kafka.

Docker-Compose

Для начала давайте настроем наш docker-compose под современные реалии kafka. Для этого у нас будет использоваться 2 основных образа

  1. zookeeper

  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 где вам нужно заполнить следующие поля:

  1. Cluster name - Можете указать просто как "Kafka Cluster"

  2. Bootstrap Servers - Суда вам внужно вписать PLAINTEXT://kafka:29092 ну или другое наименование в зависимости от вашей конфигурации параметра "KAFKA_ADVERTISED_LISTENERS" в kafka image. Соотвественно если у вас поднято несколько реплик кафки, вам нужно их всех вписать. Apache рекомендуют иметь 3 ноды с kafka на вашем проекте.

  3. Metrics

    1. metrics type -> JMX

    2. port -> 9997 ну или как вы указали в своей конфигурации

После этого ваш Kafka кластер должен отобразиться в вашем GUI. Выглядит это примерно так:

Функционал

Самое важное в данном сервисе как по мне это функционал по просмотру топика внутри вашей кафки. Для этого нам нужно перейти во вкладку Topics и далее перейти во вкладку messages где мы сможем лицезреть полную информацию по каждому сообщению и фильтр для поиска специфичный сообщений.

Так же вы можете просматривать ваших consumer'ов и их группы во вкладке consumers.

Для просмотра конфигурации вам нужно перейти во вкладку Brokers и выбрать нужный вам брокер

Далее переходим во вкладку Metrics и просматриваем всю нужную нам информацию.

Итог

В процессе создания своего аналога сервисов Discord я столкнулся с необходимостью мониторить свою очередь сообщений в Kafka. Я искал удобный инструмент для этого, и благодаря совету моего коллеги Паши, DevOps инженера, я обратил внимание на kafka-ui от команды provectus. Этот интерфейс позволил мне легко отслеживать все сообщения в топиках без необходимости вручную входить в docker контейнер. Особо хочу отметить удобство и функциональность kafka-ui: просмотр сообщений в топиках, мониторинг consumer'ов и их групп, а также возможность просмотра конфигурации и метрик брокера. Используя этот инструмент, я значительно упростил процесс работы и диагностики своей системы. Если кто-то из вас работает с Kafka, рекомендую обратить внимание на kafka-ui!

Комментарии (9)


  1. b00
    08.08.2023 21:23

    Мой ассоциативный ряд:
    Java -> Idea -> BigDataTool -> Kafka


    1. aleksandy
      08.08.2023 21:23

      А где в статье упомянуто, что автор писал на яве? А так-то, конечно, да, всё в одном месте.


      1. b00
        08.08.2023 21:23
        +1

        После дня анализа и советов от моего коллеги, я пришел к выводу, что хаб и тег Java вызывают ассоциации с Java.


        1. aleksandy
          08.08.2023 21:23

          Действительно. :) Да кто на них смотрит, эти тэги?


        1. LordBarov Автор
          08.08.2023 21:23

          kafka-ui это Java приложение, поэтому я Java и отметил) В целом мне кажется все что касается Apache можно отнести к Java


  1. Evgenym
    08.08.2023 21:23
    +1

    Попробуйте еще Redpanda Console. Мне она показалась поинтереснее и ресурсов ест меньше.


    1. OkGoLove
      08.08.2023 21:23

      Там пермиссии только в enterprise версии, что расстраивает.


    1. Haarolean
      08.08.2023 21:23

      Возможно, я предвзят, но как только появляется необходимость в функционале отличном от "посмотреть сообщения" kowl уже не очень: половина фич в платной версии.


  1. Haarolean
    08.08.2023 21:23

    Привет, спасибо за упоминание kafka-ui!

    >Однако, стартовый шаблон для связки Kafka, ZooKeeper и kafka-ui на официальном сайте отсутствует

    На самом деле, у нас все же есть один компот с включенным zookeper'ом, в остальных примерах kafka работает в kraft режиме, где zookeeper не нужен.