Изучаем Apache Kafka с нуля. Урок 12. kafka-metadata-quorum.sh

Изучаем Apache Kafka с нуля. Урок 12. kafka-metadata-quorum.sh

 

В уроке 11 мы разобрали kafka-cluster.sh — как получить cluster ID от работающего брокера и как корректно вывести брокер из KRaft-кластера через команду unregister. После вывода брокера логично проверить, что кворум не пострадал и кластер продолжает работать нормально. Именно для этого существует утилита следующего урока.

kafka-metadata-quorum.sh — инструмент для проверки состояния Raft-кворума в KRaft-режиме. Она показывает, кто сейчас лидер контроллеров, насколько отстают фолловеры и нет ли проблем с синхронизацией метаданных.

Умение читать вывод этой утилиты — обязательный навык для администратора Kafka. В курсе «Администрирование кластера Kafka» мы разбираем мониторинг кворума в контексте реальных сценариев: плановые работы, потеря нода, диагностика split-brain.

 

Apache Kafka для инженеров данных

Код курса
DEVKI
Ближайшая дата курса
24 августа, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800

Что такое Raft-кворум и зачем его мониторить

В KRaft-режиме роль ZooKeeper выполняет встроенный алгоритм Raft. Несколько нодов с ролью контроллера выбирают лидера, который ведёт лог метаданных. Остальные контроллеры — это фолловеры: они реплицируют лог и готовы взять управление в случае падения лидера.

Пока всё это работает штатно, брокеры об этом не знают — они просто получают обновления метаданных. Но если фолловер начинает отставать, или в кластере не набирается кворум для принятия решений, операции с метаданными начинают зависать. Создать новый топик не получится. Увеличить партиции — тоже.

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

  • Плановое обслуживание. Перед остановкой контроллер-ноды убедитесь, что кворум выживет без неё.
  • Диагностика подвисших операций. Если создание топика зависло — первым делом смотрите на кворум.
  • После восстановления после сбоя. Убедитесь, что восставший нод догнал лидера и лаг ушёл в ноль.

Проверить всё это можно одной утилитой — kafka-metadata-quorum.sh.

 

Подкоманды kafka-metadata-quorum.sh

У утилиты одна рабочая подкоманда — describe. Режим работы задаётся флагом: что именно нужно показать.

Флаг Что показывает Когда использовать
—status Сводка по кворуму: лидер, эпоха, high watermark, максимальный лаг Быстрая проверка — всё ли в порядке
—replication Детальное состояние каждого нода кворума: офсет, лаг, время последнего ответа Диагностика — кто именно отстаёт и насколько

Оба флага работают с одним обязательным параметром — —bootstrap-server. Утилита подключается к любому живому брокеру и получает от него информацию о кворуме.

 

Apache Kafka для инженеров данных

Код курса
DEVKI
Ближайшая дата курса
24 августа, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800

 

Шаг 1. Быстрая проверка через describe —status

Флаг —status — это первое, что запускают при диагностике. Одна команда, несколько секунд, сразу видно общую картину.

kafka-metadata-quorum.sh describe --status \
  --bootstrap-server localhost:9092

Вывод будет выглядеть примерно так:

ClusterId:              xtzWnoMyEkahzrAFKnMzmg
LeaderId:               1
LeaderEpoch:            5
HighWatermark:          12438
MaxFollowerLag:         0
MaxFollowerLagTimeMs:   -1
CurrentVoters:          [1,2,3]
CurrentObservers:       []

Разберём каждое поле по порядку.

  • ClusterId. UUID кластера — тот самый, что записан в meta.properties и выдаётся командой kafka-cluster.sh cluster-id.
  • LeaderId. Node ID текущего лидера Raft-кворума. Это контроллер, который принимает решения по метаданным прямо сейчас.
  • LeaderEpoch. Счётчик смены лидера. Каждый раз, когда кворум выбирает нового лидера, эпоха растёт на 1. Если эпоха быстро растёт — лидеры сменяются слишком часто, и это проблема.
  • HighWatermark. Офсет в логе метаданных, до которого все участники кворума подтвердили запись. Все операции ниже этой отметки гарантированно зафиксированы.
  • MaxFollowerLag. Максимальное отставание любого фолловера от лидера в записях лога. Ноль — норма. Больше нуля — кто-то не успевает.
  • MaxFollowerLagTimeMs. То же самое, но в миллисекундах. Значение -1 означает, что лаг нулевой и время не измеряется.
  • CurrentVoters. Node ID нодов, которые участвуют в голосовании кворума. Обычно это три контроллера.
  • CurrentObservers. Node ID нодов, которые реплицируют лог метаданных, но не голосуют. В большинстве стандартных конфигураций этот список пустой.

Самые важные поля при быстрой проверке — MaxFollowerLag и LeaderEpoch. Если лаг ноль и эпоха не скачет — кворум здоров.

 

Шаг 2. Детальная диагностика через describe —replication

Флаг —status показывает агрегированные цифры. Если что-то не так, нужно понять — кто конкретно отстаёт. Для этого есть —replication.

kafka-metadata-quorum.sh describe --replication \
  --bootstrap-server localhost:9092

Вывод — таблица с отдельной строкой для каждого нода кворума:

NodeId  LogEndOffset  Lag  LastFetchTimestamp    LastCaughtUpTimestamp  Status
1       12438         0    1746194832000        1746194832000          Leader
2       12438         0    1746194832105        1746194832105          Follower
3       12438         0    1746194832210        1746194832210          Follower

Что означает каждая колонка.

  • NodeId. Идентификатор ноды контроллера — тот же, что в server.properties в параметре node.id.
  • LogEndOffset. Последний офсет в логе метаданных этой ноды. У лидера он самый актуальный.
  • Lag. Разница между LogEndOffset лидера и данной ноды. Ноль — нода в полной синхронизации.
  • LastFetchTimestamp. Unix timestamp последнего fetch-запроса этой ноды к лидеру. По нему видно, живёт ли нода и общается ли с лидером.
  • LastCaughtUpTimestamp. Время, когда нода последний раз была полностью в синхронизации с лидером. Если оно давно в прошлом, а лаг растёт — нода не справляется.
  • Status. Роль ноды: Leader, Follower или Observer.

Флаг —replication особенно важен перед плановым обслуживанием. Убедитесь, что все ноды в статусе Follower имеют Lag = 0 до того, как останавливать лидера или любой другой контроллер.

 

Apache Kafka: администрирование кластера

Код курса
KAFKA
Ближайшая дата курса
13 июля, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800

 

Практические сценарии диагностики

Рассмотрим несколько ситуаций, с которыми сталкиваются на практике.

Сценарий 1. Фолловер отстал после перезапуска

После перезапуска контроллер-ноды она некоторое время догоняет лидера. Пока лаг не ушёл в ноль, лучше не трогать другие ноды кворума.

# Проверено: Apache Kafka 4.2.0, Ubuntu 22.04

# Следить за лагом в цикле с интервалом 5 секунд
watch -n 5 "kafka-metadata-quorum.sh describe --replication \
  --bootstrap-server localhost:9092"

Как только колонка Lag покажет ноль для всех нодов, нода вернулась в строй. Только после этого продолжайте плановые работы.

Сценарий 2. Проверка перед остановкой контроллера

Перед тем как остановить один из трёх контроллеров, убедитесь, что оставшихся двух хватит для кворума. При трёх нодах кворум — это большинство, то есть двое. Остановить одного — безопасно. Двух одновременно — нет.


# Проверить состояние перед остановкой
kafka-metadata-quorum.sh describe --status \
  --bootstrap-server localhost:9092

# Убедиться, что MaxFollowerLag = 0
# Убедиться, что в CurrentVoters ровно три ноды
# Только потом останавливать один контроллер

Сценарий 3. Рост LeaderEpoch как сигнал проблемы

Если при каждом запуске —status значение LeaderEpoch заметно выросло по сравнению с прошлой проверкой — кворум нестабилен. Лидеры сменяются слишком часто. Это может быть связано с сетью, дисковой задержкой или неправильными таймаутами в конфигурации.

# Запросить эпоху и сохранить
EPOCH=$(kafka-metadata-quorum.sh describe --status \
  --bootstrap-server localhost:9092 | grep LeaderEpoch | awk '{print $2}')
echo "LeaderEpoch: $EPOCH"

Если эпоха растёт быстро — смотрите логи контроллеров. Обычно там видно, какая нода инициирует перевыборы и по какой причине.Raft-кворум Kafka KRaft: репликация метаданных и high watermark

 

Что kafka-metadata-quorum.sh не умеет

Утилита только читает состояние — никаких изменений она вносить не может. Вот что нужно делать другими инструментами.

  • Принудительная смена лидера. Это делается через kafka-leader-election.sh (урок 21) — но там речь о лидерах партиций, а не контроллеров. Смена лидера контроллеров происходит автоматически через Raft.
  • Изменение состава кворума. Добавить или убрать контроллер нельзя на горячую через CLI. Это конфигурационное изменение с перезапуском.
  • Просмотр содержимого лога метаданных. Для этого есть kafka-metadata-shell.sh (урок 13) — она позволяет буквально зайти внутрь лога и читать записи.
  • Проверка версий протокола. За это отвечает kafka-broker-api-versions.sh (урок 25).

Если нужно получить состояние кворума программно, а не через CLI, — можно использовать Java AdminClient: метод describeMetadataQuorum() возвращает тот же набор данных в виде объекта. Это актуально для написания своих health-check скриптов и систем мониторинга.

Что дальше

Мы разобрали kafka-metadata-quorum.sh: научились читать вывод —status и —replication, понимать значение каждого поля и использовать утилиту для диагностики реальных ситуаций.

Следующий урок — kafka-metadata-shell.sh. Это интерактивный шелл для работы с логом метаданных KRaft изнутри. Там можно буквально зайти в кластер и посмотреть, какие записи хранятся в __cluster_metadata. Очень полезно при глубокой отладке. Смотрите урок 13. kafka-metadata-shell.sh.

Отдельный cheatsheet по всем флагам kafka-metadata-quorum.sh — в бонусном файле к этому уроку.

Если хотите разобраться с мониторингом кворума в продакшн-контексте — сценарии rolling restart, split-brain и плановый вывод нодов — это тема курса «Администрирование кластера Kafka».

Источники

Все уроки курса

Тема Ссылка
1 Установка Kafka с Zookeeper https://bigdataschool.ru/blog/news/lesson1-kafka-zookeeper-install/
2 Установка Kafka в режиме KRaft https://bigdataschool.ru/blog/news/lesson2-kafka-kraft-install/
3 Docker KRaft. Однонодовый кластер https://bigdataschool.ru/blog/news/lesson3-kafka-docker-single/
4 Docker KRaft. 3-нодовый кластер https://bigdataschool.ru/blog/news/lesson4-kafka-docker-cluster/
5 Утилиты bin/. Переменные окружения и основы https://bigdataschool.ru/blog/news/lesson5-kafka-bin-intro/
6 kafka-topics.sh. Управление топиками https://bigdataschool.ru/blog/news/lesson6-kafka-topics/
7 kafka-console-producer.sh https://bigdataschool.ru/blog/news/lesson7-kafka-console-producer/
8 kafka-console-consumer.sh https://bigdataschool.ru/blog/news/lesson8-kafka-console-consumer/
9 kafka-server-start.sh / kafka-server-stop.sh https://bigdataschool.ru/blog/news/lesson9-kafka-server-start-stop/
10 kafka-storage.sh https://bigdataschool.ru/blog/news/lesson10-kafka-storage/
11 kafka-cluster.sh https://bigdataschool.ru/blog/news/lesson11-kafka-cluster/
12 kafka-metadata-quorum.sh https://bigdataschool.ru/blog/news/lesson12-kafka-metadata-quorum/
13 kafka-metadata-shell.sh https://bigdataschool.ru/blog/news/lesson13-kafka-metadata-shell/
14 kafka-features.sh https://bigdataschool.ru/blog/news/lesson14-kafka-features/
15 kafka-configs.sh https://bigdataschool.ru/blog/news/lesson15-kafka-configs/
16 kafka-log-dirs.sh https://bigdataschool.ru/blog/news/lesson16-kafka-log-dirs/
17 kafka-dump-log.sh https://bigdataschool.ru/blog/news/lesson17-kafka-dump-log/
18 kafka-delete-records.sh https://bigdataschool.ru/blog/news/lesson18-kafka-delete-records/
19 kafka-consumer-groups.sh https://bigdataschool.ru/blog/news/lesson19-kafka-consumer-groups/
20 kafka-streams-application-reset.sh https://bigdataschool.ru/blog/news/lesson20-kafka-streams-reset/
21 kafka-leader-election.sh https://bigdataschool.ru/blog/news/lesson21-kafka-leader-election/
22 kafka-reassign-partitions.sh https://bigdataschool.ru/blog/news/lesson22-kafka-reassign-partitions/
23 kafka-replica-verification.sh https://bigdataschool.ru/blog/news/lesson23-kafka-replica-verification/
24 kafka-acls.sh https://bigdataschool.ru/blog/news/lesson24-kafka-acls/
25 kafka-broker-api-versions.sh https://bigdataschool.ru/blog/news/lesson25-kafka-broker-api-versions/
26 kafka-get-offsets.sh https://bigdataschool.ru/blog/news/lesson26-kafka-get-offsets/
27 kafka-verifiable-producer/consumer.sh https://bigdataschool.ru/blog/news/lesson27-kafka-verifiable/
28 kafka-producer-perf-test.sh https://bigdataschool.ru/blog/news/lesson28-kafka-producer-perf/
29 kafka-consumer-perf-test.sh https://bigdataschool.ru/blog/news/lesson29-kafka-consumer-perf/
30 kafka-mirror-maker.sh https://bigdataschool.ru/blog/news/lesson30-kafka-mirror-maker/
31 connect-standalone.sh https://bigdataschool.ru/blog/news/lesson31-kafka-connect-standalone/
32 connect-distributed.sh https://bigdataschool.ru/blog/news/lesson32-kafka-connect-distributed/
33 kcat. Альтернативный CLI https://bigdataschool.ru/blog/news/lesson33-kcat/