С развитием микросервисной архитектуры появляются новые инструменты, которые облегчают и упрощают работу с микросервисными приложениями. Одним из таких инструментов является Apache Kafka — популярная платформа и система для обработки потоковых данных и обмена сообщениями в режиме реального времени. Ее используют различные компании по всему миру для построения масштабируемых систем передачи сообщений, аналитики данных и для интеграции с микросервисными приложениями.
Kafka, будучи основным сервисом в архитектуре приложений, требует наличия мониторинга. Без должного мониторинга кластер может столкнуться со сбоями в работе, что может привести к потере данных или утечкам информации. Сегодня мы подробно разберем, как организовать мониторинг Apache Kafka.
Архитектура Apache Kafka
Прежде чем приступать к процессу организации мониторинга и защиты Kafka, разберем архитектуру программы.
Kafka — это распределенная система, которая состоит из нескольких ключевых компонентов:
- Брокеры — физические или виртуальные серверы (хосты), которые принимают, хранят и обрабатывают сообщения. Каждый брокер отвечает за определенные партиции топиков.
- Топики — логические категории, в которые поступают сообщения. Топики делятся на партиции для параллельной обработки.
- Производители (Producers) — источники данных или же, более простым языком, клиенты, отправляющие данные в топики.
- Потребители (Consumers) — клиенты, которые читают данные из топиков, часто объединенные в группы для распределения нагрузки.
- ZooKeeper — используется для координации брокеров, а также хранит метаданные и конфигурацию. Начиная с версии 3.3+ появляется возможность работы без ZooKeeper благодаря KRaft (протокол для хранения метаданных и управления ими внутри Kafka). Главная особенность KRaft заключается в устранении зависимости Apache Kafka от внешнего сервиса ZooKeeper.
Сообщения в Kafka представляют собой пары ключ-значение, которые записываются в партиции в виде логов. Потребители читают эти сообщения, отслеживая свое положение в логе. Такая архитектура обеспечивает высокую пропускную способность, но делает систему уязвимой к сбоям, если не уделять внимания мониторингу и безопасности.
Мониторинг
Kafka часто играет роль центрального компонента в инфраструктуре больших приложений, особенно при использовании в микросервисной архитектуре. Например, он может передавать миллионы событий в секунду между несколькими системами или базами данных. Любая задержка, сбой или потеря данных может привести к серьезным последствиям включая как финансовые потери, так и потери данных. В связи с этим необходимо выстроить мониторинг Kafka, который будет решать такие задачи как:
- Контроль производительности. Производительность брокера снижается при появлении случаев задержки в доставке сообщений или перегрузки самого брокера сообщений. Эти действия замедляют всю цепочку обработки данных.
- Контроль целостности данных. При контроле целостности данных удается минимизировать проблемы, связанные с потерей сообщений, дублированием или повреждением данных.
- Планирование масштабирования. Мониторинг помогает понять, когда нужно добавить брокеры (горизонтальное масштабирование) или увеличить ресурсы сервера (вертикальное масштабирование).
Ключевые метрики для мониторинга
Эффективный мониторинг требует отслеживания метрик на всех уровнях системы. Рассмотрим основные категории и примеры.
1. Метрики брокеров
- Входящий и исходящий трафик. Показывает, сколько данных брокер принимает и отправляет. Если значения приближаются к лимитам сети или дисков, это сигнал к масштабированию.
- Задержка при выполнении запросов. Среднее время обработки запросов от клиентов. Рост задержки может указывать на нехватку ресурсов.
- Количество активных соединений. Аномально высокое число соединений может быть признаком атаки или некорректной работы клиентов.
- Использование ресурсов. Процент загрузки CPU, оперативной памяти и дискового пространства.
2. Метрики топиков и партиций
- Размер логов. Общий объём данных в топике. Если он растет бесконтрольно, стоит пересмотреть политику очистки.
- Количество сообщений. Скорость поступления данных. Резкие скачки могут указывать на пиковые нагрузки.
- Смещение. Позиция последнего записанного сообщения и позиция, до которой дочитали потребители.
3. Метрики потребителей и производителей
- Consumer Lag. Отставание потребителей от производителей. Например, если lag превышает 10 000 сообщений, это может означать, что потребители не успевают обрабатывать данные.
- Producer Request Rate. Частота запросов от производителей. Падение этого показателя может сигнализировать о сбоях на стороне отправителей.
- Fetch Latency. Время, необходимое потребителю для получения данных. Высокие значения указывают на проблемы с сетью или брокерами.
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Практическая настройка мониторинга для Kafka
Разберем настройку мониторинга для Kafka на практике.
Предварительные требования
Нам понадобится один сервер или одна виртуальная машина с любым предустановленным дистрибутивом Linux. В данной статье в качестве примера мы будем использовать дистрибутив Ubuntu версии 24.04.
Сервер должен соответствовать следующим требованиям:
-
Минимум 4 ГБ оперативной памяти. Данный объем подойдет только для настройки и тестового использования Apache Kafka и не предназначен для решения высокоресурсных задач. Для более серьезных задач необходимо минимум 8 ГБ оперативной памяти.
-
Минимум одноядерный процессор для базовой конфигурации. Для выполнения реальных задач (например, для работы с большим объемом данных, для работы с математическими и научными вычислениями) рекомендуется 4-ядерный процессор.
-
Наличие публичного IP-адреса, который можно арендовать на этапе создания сервера в разделе «Сеть».
Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе рекомендуем выбрать регион с минимальным пингом для быстрой передачи данных. Остальные параметры можно оставить без изменений.
Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.
Установка и запуск Apache Kafka
Для начала установим Kafka, используя следующие шаги:
1) Обновляем индекс репозиториев и устанавливаем пакет OpenJDK 11, который необходим для запуска Kafka:
2) Проверяем что Java была успешно установлена путем вывода ее версии:

Если в ответ команда вернула версию, то Java успешно установлена в системе.
3) Далее с помощью утилиты wget скачиваем архив с программой (используемая версия — 3.9.0):
4) Разархивируем скачанный архив при помощи команды:
На выходе появится директория с именем kafka_2.13-3.9.0. Переместим ее в директорию /opt/kafka:
5) Далее для удобного управления Kafka создадим systemd-юниты. Начнем с Zookeeper. При помощи любого текстового редактора создаем файл zookeeper.service:
Используем следующее содержимое:

Сохраняем изменения и выходим из файла.
Также создаем systemd-файл для kafka:
Содержимое будет следующим:
6) Перечитываем конфигурационные файлы демонов при помощи команды:
7) Запускаем сначала Zookeeper:
И проверяем его статус:

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Zookeeper.
Далее запускаем Kafka:
И также проверяем статус:

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Kafka.
8) Дополнительно создадим отдельного пользователя, которого далее назначим владельцем всех файлов и директорий, используемых Kafka:
9) Задаем необходимые права:
Тестирование установки
После того как оба сервиса — ZooKeeper и Kafka — были запущены, проверим работоспособность Kafka.
Все команды ниже необходимо выполнять из директории /opt/kafka. Перейти в нее можно так:
1) Создадим новый топик с именем new-topic1:

При успешном создании топика в терминале будет выведено сообщение «Created topic new-topic1».
2) Также выполним команду для вывода всех топиков в текущем инстансе Kafka:

Ранее созданный топик с именем new-topic1 был успешно создан.
3) Далее проверим работоспособность производителя (Producer). Запускаем производителя при помощи команды:
4) Отправим тестовое сообщение:

5) Не закрывая текущую сессию SSH, открываем новую сессию и переходим в директорию /opt/kafka:
Запускаем потребителя (Consumer) при помощи команды:

Если все работает правильно, то мы увидим ранее отправленное сообщение.
Установка Prometheus
1) Создаем пользователя с именем prometheus:
2) Создаем директории, где будут храниться конфигурационные файлы Prometheus:
3) Назначаем владельцем директории /var/lib/prometheus пользователя prometheus:
4) Переходим в директорию /tmp:
И скачиваем архив с программой при помощи утилиты wget:
5) Разархивируем скачанный архив:
6) Переходим в появившуюся директорию:
7) Далее перемещаем директорию console конфигурационный файл prometheus.yml, бинарный файл Prometheus и конфигурационные файлы и назначаем для него владельца:
8) Дополнительно создаем systemd-юнит для Prometheus:
Используем следующее содержимое:

9) По умолчанию доступ до Prometheus разрешен только с localhost. Разрешим доступ со всех адресов. Для этого открываем на редактирование основной конфигурационный файл prometheus.yml при помощи любого текстового редактора:
В конце файла находим параметр targets в опции static_configs:

И меняем значение localhost на внешний IP-адрес сервера (внешний IP-адрес у вас будет свой):

Сохраняем изменения и выходим из файла.
10) Запускаем Prometheus, добавляем его в автозагрузку и проверяем статус:

В статусе должно отображаться active (running), что свидетельствует об успешном запуске Prometheus.
Перезапускаем демон systemd и prometheus и проверяем его статус:

Если в статусе отображается active (running), то Prometheus успешно запущен.
Переходим в браузере по IP-адресу сервера и порту 9090 (порт по умолчанию для Prometheus):

Должен открыться веб-интерфейс программы.
Установка Grafana
В связи с тем, что установить Grafana напрямую через официальный репозиторий из России нельзя, мы вручную добавим GPG ключ и воспользуемся репозиторием-зеркалом от Яндекса.
1) Создаем файл, в котором будет храниться GPG-ключ от репозитория Grafana:
И вставляем следующий ключ:
2) Создаем директорию, в которой будет храниться ключ от репозитория:
3) Далее необходимо сконвертировать текстовый файл с ключом в поддерживаемый формат:
4) Добавляем зеркало от Яндекса:
5) Обновляем индекс пакетов и устанавливаем Grafana:
6) Запускаем сервис при помощи следующих команд:
И проверяем статус Grafana:

Если в статусе отображается active (running), то Grafana успешно запущена.
Используя IP-адрес сервера и порт 3000 (порт по умолчанию для Grafana), переходим в веб-интерфейс программы. Первоначальные логин и пароль для входа в веб-интерфейс — admin / admin. При первом входе система предложит задать новый пароль для пользователя admin:

После аутентификации откроется веб-интерфейс:

Установка JMX Exporter
JMX Exporter — это утилита, которая собирает и передает метрики из приложений, работающих на Java, в системы мониторинга, например в Prometheus. Для установки JMX Exporter необходимо выполнить следующие шаги:
1) Скачиваем утилиту из официального репозитория при помощи wget:
2) Перемещаем скаченный JAR-файл в директорию /opt/kafka/libs:
3) Открываем на редактирование файл kafka-server-start.sh:
И добавляем следующие строки в самый конец файла:

Сохраняем изменения и выходим из файла.
4) Перезапускаем Kafka при помощи команд:
Настройка JMX Exporter
Произведем настройку JMX Exporter.
1) Переходим в директорию /opt/kafka/config:
2) Создаем файл sample_jmx_exporter.yml:
И используем следующее содержимое:
Сохраняем изменения и выходим из файла.
3) Далее открываем на редактирование основной конфигурационный файл Prometheus — prometheus.yml:
Нам необходимо добавить endpoint Kafka, чтобы Prometheus смог собирать данные. Для этого в самом внизу добавляем следующий блок, где 103.88.242.227 — это внешний IP-адрес сервера (не забудьте поменять на свой внешний IP-адрес):

Сохраняем изменения и выходим из файла.
4) Перезапускаем Prometheus и проверяем его статус:

Настройка Kafka
Далее необходимо внести изменения при запуске Kafka, добавив путь до файлов Prometheus и JMX Exporter.
1) Открываем на редактирование systemd-файл Kafka:
И добавляем следующие строки в блок [Service]:

Сохраняем изменения и выходим из файла.
2) Перезапускаем Kafka и проверяем статус:

3) Переходим в веб-интерфейс Prometheus, далее в раздел «Status» и в выпадающем меню выбираем пункт «Targets»:

У нас появится новый источник данных Kafka:

Подключение метрик Prometheus к Grafana
Финальный этап заключается в добавление метрик из Prometheus в Grafana для построения визуализации с помощью графиков.
1) Переходим в веб-интерфейс Grafana. На панели слева выбираем меню «Connections», далее в выпадающем списке переходим в раздел «Data sources»:

2) В открывшемся разделе нажимаем на кнопку «Add data source»:

3) Далее выбираем Prometheus в качестве источника данных:

4) В качестве имени источника зададим Kafka (можно любое другое незанятое имя), а в качестве адреса укажем IP-адрес и порт, где расположен Prometheus:

5) Нажимаем на кнопку «Save & test»:

При успешном подключении к Prometheus будет выведено соответствующее сообщение:

Создание визуализации в Prometheus
После того как мы настроили мониторинг, самое время добавить dashboard для визуализации в Grafana.
1) На панели слева переходим в раздел «Dashboards»:

2) В открывшемся окне, нажимаем на кнопку «New» справа и в выпадающем меню выбираем «New dashboard»:

3) Далее переходим в раздел «Import dashboard»:

4) Используем номер 11962 графика, чтобы добавить его в Grafana, и нажимаем на кнопку «Load»:

В появившемся разделе можно задать имя для графика. Внизу в качестве источника данных выбираем ранее добавленный инстанс Prometheus:

Нажимаем на кнопку «Import».
Создание тестовой нагрузки
Добавленный график сейчас не отображает нагрузку. Сымитируем ее самостоятельно.
1) На сервере переходим в директорию /opt/kafka:
2) Создаем новый топик с именем test-load:
3) В Kafka имеется встроенный инструмент kafka-producer-perf-test.sh, который позволяет имитировать отправку сообщений производителем (producer). Запустим его для создания тестовой загрузки:
Команда выше сгенерирует и отправит 1000000 сообщений.
4) Также создадим нагрузку путем обработки еще 1000000 сообщений потребителем (consumer):
5) Переходим в dashboard Grafana и мы можем наблюдать за графиками:

Разверните Kafka на собственном сервере
477 ₽/мес
657 ₽/мес
Заключение
Мониторинг Apache Kafka — это сложный и комплексный процесс, который требует максимального внимания к деталям. Процесс начинается со сбора метрик, который можно организовать при помощи современных инструменты вроде Prometheus и Grafana. После того как метрики будут настроены, необходимо регулярно проверять состояние кластера на наличие возможных проблем. Грамотный мониторинг обеспечит стабильность работы. Apache Kafka — это мощный инструмент, который раскроет свой потенциал только при правильной настройке и эксплуатации.
