Изучаем Apache Kafka с нуля. Урок 23. kafka-replica-verification.sh

Изучаем Apache Kafka с нуля. Урок 23. kafka-replica-verification.sh

 

В уроке 22 мы разобрались с kafka-reassign-partitions.sh: генерировали план переноса партиций, запускали его с троттлингом и проверяли статус через —verify. После того как переназначение завершилось — данные физически переехали, реплики поднялись на новых брокерах.

Но как убедиться, что данные во всех репликах одинаковые? Что ни одна реплика не отстала и не разошлась с лидером по содержимому? Для этого в стандартной поставке Kafka есть отдельный инструмент — kafka-replica-verification.sh. Он читает данные с каждой реплики напрямую и сравнивает смещения.

Тема мониторинга репликации подробно разбирается в курсе «Администрирование кластера Kafka» — там же практика настройки алертов на under-replicated partitions и интеграция с Prometheus.

 

Что делает kafka-replica-verification.sh

Утилита работает иначе, чем большинство инструментов из bin/. Она не просто смотрит на метаданные — она сама подключается к каждому брокеру, у которого есть реплика нужного топика, и запрашивает данные через Fetch API. Потом сравнивает смещения: что лидер отдаёт на определённый момент времени и что отдают фолловеры.

Вывод появляется периодически — по умолчанию раз в 30 секунд — и показывает, насколько каждая реплика отстала от лидера. Если реплики синхронизированы, лаг равен нулю. Если нет — утилита покажет, в каком именно топике и партиции есть расхождение и на сколько сообщений.

Как использовать kafka-replica-verification для процесса верификации репликации топиков

Важная особенность: kafka-replica-verification.sh работает как непрерывный процесс. Она не завершается сама по себе — нужно либо прерывать вручную через Ctrl+C, либо ограничивать количество итераций снаружи. Это делает её скорее инструментом мониторинга в реальном времени, чем разовой проверкой.


Флаги и параметры

Набор флагов у утилиты небольшой, но у каждого есть нюансы, которые влияют на результат.

Флаг По умолчанию Описание
—bootstrap-server Адрес брокера для начального подключения. Обязательный.
—topics-include .* Regex-фильтр топиков для проверки. Если не указан — проверяются все топики.
—fetch-size 1048576 (1 МБ) Размер данных, запрашиваемых за одну операцию Fetch. Влияет на нагрузку на брокеры.
—max-wait-ms 1000 Максимальное время ожидания ответа от брокера в миллисекундах.
—time -1 Временная точка для проверки: -1 — latest (конец лога), -2 — earliest (начало лога).
—report-interval-ms 30000 Интервал между выводами отчёта в миллисекундах. 30 секунд по умолчанию.

Флаг —topics-include принимает Java-совместимое регулярное выражение. Например, orders.* покроет все топики, начинающиеся на «orders». Без фильтра утилита пойдёт во все топики кластера, включая внутренние — это создаёт заметную нагрузку на больших кластерах.

Устаревший флаг —topic-white-list в Kafka 4.x уже убран — используйте только —topics-include.

 

Первый запуск и вывод утилиты

Запустим проверку на топике orders с интервалом 10 секунд — чтобы не ждать полминуты до первого вывода:

# Проверяем реплики топика orders каждые 10 секунд
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders" \
  --report-interval-ms 10000

Если реплики синхронизированы, вывод будет выглядеть примерно так:

2025-04-01 12:00:10,123: verification process is started.
2025-04-01 12:00:20,456: max lag is 0 for partition orders-0 at offset 18432 among 3 partitions monitored

Здесь важны два числа: max lag is 0 — реплики не отстают, и among 3 partitions monitored — утилита действительно видит все три партиции топика. Если число партиций неожиданно маленькое, проверьте regex в —topics-include.

Если есть отставание, сообщение изменится:

2025-04-01 12:00:20,789: max lag is 1247 for partition orders-2 at offset 19200 among 3 partitions monitored

Это значит, что реплика партиции orders-2 отстаёт на 1247 сообщений от лидера на смещении 19200. Это не обязательно катастрофа — реплика могла временно отстать из-за нагрузки и сейчас догоняет. Но если лаг не уменьшается между итерациями — это сигнал разбираться.

 

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

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

 

Типичные сценарии использования

Проверка после переназначения партиций

После того как kafka-reassign-partitions.sh —verify сообщил об успешном завершении, переназначение формально закончено. Но это не гарантирует, что все реплики уже полностью синхронизированы — в ISR они могут попасть чуть позже. Дополнительная проверка через kafka-replica-verification.sh даёт уверенность, что данные действительно совпадают:

# Запускаем с коротким интервалом и смотрим на динамику лага
# Ctrl+C для остановки после нескольких итераций
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders|payments" \
  --report-interval-ms 5000

Если через несколько итераций лаг остаётся нулём — реплики в порядке.

Проверка конкретной группы топиков по regex

На production-кластерах удобно проверять только нужный набор топиков, не создавая лишнюю нагрузку. Regex в —topics-include даёт нужную гибкость:

# Проверяем только топики с префиксом prod- (production-окружение)
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "prod-.*" \
  --report-interval-ms 15000

# Проверяем несколько конкретных топиков через или (|)
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders|payments|inventory" \
  --report-interval-ms 10000

Проверка с начала лога

По умолчанию утилита смотрит на конец лога (latest). Если нужно убедиться в согласованности данных с начала — используйте флаг —time -2. Это полезно после восстановления брокера из резервной копии или при подозрении на потерю исторических данных:

# Проверяем реплики с начала лога (earliest)
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders" \
  --time -2 \
  --report-interval-ms 10000

Ограничение нагрузки через fetch-size

На кластере с большими топиками стоит уменьшить —fetch-size, чтобы проверка не создавала заметной нагрузки. Стандартный мегабайт — разумное значение, но для чувствительных production-систем в пиковые часы можно снизить до 256 КБ:

# Уменьшаем fetch-size для снижения нагрузки в пиковые часы
kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders" \
  --fetch-size 262144 \
  --report-interval-ms 60000

 

Как интерпретировать результат

Вывод утилиты лаконичный — одна строка на итерацию с максимальным лагом среди всех проверяемых партиций. Нужно понимать, что именно означает каждое поле.

Разберём строку вывода по частям:

2025-04-01 12:05:30,123: max lag is 0 for partition orders-1 at offset 45231 among 6 partitions monitored
  • max lag is 0 — максимальный лаг среди всех реплик всех проверяемых партиций. Именно максимальный, а не средний. Если хотя бы одна реплика отстаёт — вы это увидите.
  • for partition orders-1 — партиция, у которой максимальный лаг на этой итерации. При нулевом лаге это просто последняя проверенная партиция.
  • at offset 45231 — смещение, по состоянию на которое проводилось сравнение.
  • among 6 partitions monitored — сколько партиций попало под проверку с учётом фильтра по топику. Проверьте это число — оно должно совпадать с ожидаемым количеством партиций.

Если лаг ненулевой и не уменьшается между итерациями — переходите к kafka-log-dirs.sh (урок 16) для детального анализа состояния реплик на каждом брокере.

Ограничения и когда использовать другие инструменты

У kafka-replica-verification.sh есть несколько ограничений, которые важно знать:

  • Нет вывода по отдельным брокерам. Утилита показывает только максимальный лаг в целом, без разбивки по тому, какой именно брокер отстаёт. Для детализации нужен kafka-log-dirs.sh с флагом —topic-list.
  • Нет исторических данных. Это инструмент для наблюдения в реальном времени, а не для анализа прошлого. Для мониторинга с историей подключайте Prometheus + JMX Exporter.
  • Не видит ISR напрямую. Утилита сравнивает смещения, но не показывает напрямую, какие реплики входят в ISR. Для этого лучше подходит kafka-topics.sh —describe (урок 6).
  • Создаёт реальную нагрузку. Fetch-запросы идут к брокерам напрямую. На кластере с сотнями топиков без фильтра это может создать заметный сетевой трафик.

Если нужно быстро проверить статус ISR и under-replicated partitions без Fetch-нагрузки, используйте kafka-topics.sh —describe —under-replicated-partitions — это легковесный запрос к метаданным:

# Быстрая проверка under-replicated partitions через kafka-topics.sh
kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --under-replicated-partitions

Пустой вывод этой команды означает, что в данный момент under-replicated партиций нет — все реплики в ISR.

 

Запуск на ограниченное время

Поскольку утилита работает непрерывно, для автоматизации удобно обернуть её в timeout. Например, для проверки в рамках CI/CD-пайплайна или скрипта обслуживания кластера:

# Запускаем проверку на 60 секунд, выводим результат в файл
timeout 60 kafka-replica-verification.sh \
  --bootstrap-server localhost:9092 \
  --topics-include "orders|payments" \
  --report-interval-ms 10000 \
  | tee /tmp/replica-check-$(date +%Y%m%d_%H%M).log

# Ищем ненулевой лаг в выводе
grep -v "max lag is 0" /tmp/replica-check-*.log | grep "max lag"

Если grep ничего не нашёл — все итерации показали нулевой лаг. Если нашёл строки с ненулевым лагом — их стоит изучить подробнее.

 

Альтернативы и дополнение к утилите

В реальном production-мониторинге kafka-replica-verification.sh обычно не используется как единственный инструмент. Вот что работает рядом с ней или вместо неё в зависимости от задачи:

  • JMX-метрика ReplicaManager/UnderReplicatedPartitions. Самый надёжный способ непрерывного мониторинга. Экспортируется через JMX, легко подключается к Prometheus через kafka-jmx-exporter. Алерт на значение > 0 — стандартная практика.
  • kafka-topics.sh —describe —under-replicated-partitions. Быстрый ситуационный снимок без дополнительной нагрузки. Не видит величину лага, но показывает конкретные топики и брокеры.
  • kafka-log-dirs.sh —topic-list <топик>. Даёт размер и смещения по каждой партиции на каждом брокере. Хорошо для детального расследования (урок 16).
  • kcat -L. Показывает метаданные включая ISR для всех партиций. Быстрый и удобный для spot-проверки (урок 33).

Для разовой диагностики после обслуживания кластера kafka-replica-verification.sh удобна тем, что работает с любым JDK и не требует дополнительных зависимостей — она уже есть в стандартном bin/.

 

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

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

 

Что дальше

В уроке 24 переходим к kafka-acls.sh — инструменту управления списками контроля доступа. Тема актуальная: без правильно настроенных ACL любой клиент с доступом к кластеру может читать и писать в любой топик.

Референсные ссылки

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

Тема URL
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/