Изучаем Apache Kafka с нуля. Урок 16. kafka-log-dirs.sh

Изучаем Apache Kafka с нуля. Урок 16. kafka-log-dirs.sh

 

В уроке 15 мы разобрали kafka-configs.sh — утилиту для управления динамическими конфигурациями топиков, брокеров и квот. Там мы меняли retention.ms, max.message.bytes и другие параметры без перезапуска кластера. Но одно дело выставить срок хранения, другое — понять, сколько места реально занимают данные прямо сейчас.

Именно тут нужна kafka-log-dirs.sh. Она показывает, сколько байт занимает каждая партиция на каждом брокере, в каких директориях лежат логи и насколько реплики отстают от лидера. Это первый инструмент, который открывают при проблемах с диском или перед тем, как запустить переназначение партиций.

Если вы занимаетесь администрированием кластеров Kafka в продакшене, дисковый аудит — ежедневная практика. В курсе «Администрирование кластера Kafka» разбирают полный цикл: от мониторинга лог-директорий до планирования балансировки партиций под нагрузкой.

 

Что делает kafka-log-dirs.sh

 

kafka-log-dirs.sh — утилита для инспекции лог-директорий брокеров Apache Kafka. Она запрашивает у брокеров метаданные о размещении партиций: в какой директории лежит каждая партиция, сколько байт она занимает, отстаёт ли реплика от лидера и является ли директория «будущей» при переназначении.

Утилита выводит результат в JSON. Вся информация о состоянии лог-директорий собрана в одном запросе к кластеру — без прямого доступа к файловой системе брокеров.

Вот что именно видно в выводе для каждой партиции.

  • logDir. Путь к директории с логами на брокере, например /var/kafka-logs.
  • size. Размер партиции в байтах — сумма всех сегментов лога, включая индексные файлы.
  • offsetLag. Насколько эта реплика отстаёт от лидера в офсетах. У лидера всегда 0. Ненулевое значение у фолловера — сигнал проблем с репликацией.
  • isFuture. Признак «будущей» директории при переносе партиции в другой путь. Пока переназначение идёт — true. После завершения исчезает из вывода.
  • error. Если лог-директория недоступна или повреждена, здесь будет сообщение об ошибке вместо списка партиций.

Базовая структура ответа строится по принципу: один брокер — один или несколько logDir — список партиций в каждом.

 

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

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

 

Синтаксис и основные флаги

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

Флаг Что делает Обязательный
—bootstrap-server Адрес брокера для подключения, host:port да
—broker-list Список ID брокеров через запятую: 0,1,2. Без этого флага запрашиваются все брокеры нет
—topic-list Список топиков через запятую. Без этого флага возвращаются все топики нет

 

Шаг 1. Смотрим лог-директории всех брокеров

Самый простой запуск — без фильтрации. Утилита опросит все брокеры кластера и вернёт полную картину по всем топикам и партициям.

# Полный вывод лог-директорий всех брокеров
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  2>/dev/null

Вывод будет длинным, если топиков много. Редирект 2>/dev/null скрывает информационные сообщения о подключении, которые Kafka пишет в stderr — в продакшене это удобно при парсинге.

 

Шаг 2. Фильтруем по топику и брокеру

На практике интересует конкретный топик или конкретный брокер, а не весь кластер. Флаги —topic-list и —broker-list работают независимо и можно использовать оба вместе.

# Смотрим только топик orders на брокере 0
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  --broker-list 0 \
  --topic-list orders \
  2>/dev/null
# Несколько топиков одновременно
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  --topic-list orders,payments,events \
  2>/dev/null

 

Шаг 3. Читаем JSON-вывод

Результат возвращается в виде однострочного JSON. Для удобного чтения передайте его в python3 -m json.tool или в jq.

# Форматированный вывод через jq
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  --topic-list orders \
  2>/dev/null | jq .

Типичный ответ для одного брокера с двумя партициями выглядит так.

{
  "version": 1,
  "brokers": [
    {
      "broker": 0,
      "logDirs": [
        {
          "logDir": "/var/kafka-logs",
          "error": null,
          "partitions": [
            {
              "partition": "orders-0",
              "size": 1048576,
              "offsetLag": 0,
              "isFuture": false
            },
            {
              "partition": "orders-1",
              "size": 524288,
              "offsetLag": 0,
              "isFuture": false
            }
          ]
        }
      ]
    }
  ]
}

Поле version: 1 — это версия формата ответа, а не версия Kafka. Оно появилось давно и пока не менялось.

 

Шаг 4. Считаем суммарный размер топика

Размер каждой партиции указан в байтах. Чтобы получить суммарный размер топика по всему кластеру — сложите size для всех реплик-лидеров. Учтите: реплики занимают то же место, что и лидер, поэтому брать нужно только по одному экземпляру каждой партиции.

Быстрый способ — jq: извлечь все значения size и сложить.

# Суммарный размер всех сегментов топика orders на всех брокерах (включая реплики)
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  --topic-list orders \
  2>/dev/null \
  | jq '[.. | .size? | numbers] | add'

Результат — суммарный объём в байтах, включая реплики. Разделите на фактор репликации топика, чтобы получить объём «чистых данных».

 

Шаг 5. Мониторинг переназначения партиций через isFuture

Поле isFuture — самый важный признак при работе с kafka-reassign-partitions.sh (урок 22). Когда вы переносите партицию на другой брокер или в другую директорию, Kafka сначала копирует данные в «будущее» расположение. В этот момент в выводе kafka-log-dirs.sh появляется дополнительная запись с isFuture: true.

{
  "partition": "orders-0",
  "size": 892416,
  "offsetLag": 15234,
  "isFuture": true
}

Ненулевой offsetLag здесь норма — новая реплика догоняет лидера. Переназначение завершено, когда запись с isFuture: true исчезла из вывода. Это надёжнее, чем полагаться только на статус от kafka-reassign-partitions.sh —verify.

# Проверяем, остались ли будущие директории (isFuture: true)
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  2>/dev/null \
  | jq '[.. | .isFuture? | select(. == true)] | length'

Если команда вернула 0 — переназначение завершено для всех партиций кластера.

 

Шаг 6. Обнаружение офлайн-директорий

Если лог-директория недоступна — например, диск упал или смонтирован с ошибкой — Kafka не возвращает список партиций, а заполняет поле error. Брокер при этом остаётся живым и обслуживает данные из других директорий (если они есть).

# Найти все директории с ошибками
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  2>/dev/null \
  | jq '.brokers[].logDirs[] | select(.error != null) | {broker: .logDir, error: .error}'

Пример вывода при проблеме с диском.

{
  "broker": "/var/kafka-logs-2",
  "error": "KafkaStorageException: Log directory /var/kafka-logs-2 is offline"
}

Это сигнал для немедленного действия — партиции из этой директории недоступны на данном брокере, и нагрузка переехала на реплики.

 

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

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

 

Практический сценарий. Дисковый аудит перед балансировкой

 

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

Сначала смотрим суммарный объём данных на каждом брокере.

# Суммарный размер данных по каждому брокеру
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  2>/dev/null | jq '
    .brokers[] |
    {
      broker: .broker,
      totalBytes: [.logDirs[].partitions[].size] | add
    }
  '

Затем выявляем самые «тяжёлые» партиции — кандидаты на вынос.

# Топ-10 партиций по размеру на брокере 0
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  --broker-list 0 \
  2>/dev/null | jq '
    [.brokers[0].logDirs[].partitions[]] |
    sort_by(-.size) |
    .[:10] |
    .[] |
    {partition: .partition, sizeMB: (.size / 1048576 | floor)}
  '

После этого аудита у вас есть конкретные цифры для решения: какие партиции переносить, куда, и насколько это уменьшит нагрузку на диск.

Альтернативы kafka-log-dirs.sh

kafka-log-dirs.sh даёт данные через API брокера. Есть и другие способы получить похожую информацию, каждый со своими плюсами.

  • Прямая проверка файловой системы. Команда du -sh /var/kafka-logs/topic-partition/ на сервере брокера покажет точный размер с учётом файловой системы. Минус — нужен SSH-доступ к каждому брокеру.
  • JMX-метрики. Метрика kafka.log:type=Log,name=Size,topic=X,partition=N в реальном времени. Подходит для интеграции с Prometheus через jmx_exporter.
  • AKHQ / Kafka UI. Графические интерфейсы отображают размеры партиций в браузере. Удобно, но требует отдельного развёртывания.
  • kafka-metadata-shell.sh. Из урока 13 — позволяет просматривать метаданные партиций, но не возвращает размеры на диске.

Из всех вариантов kafka-log-dirs.sh остаётся единственным штатным CLI-инструментом, который дёшево и без SSH-доступа показывает размеры партиций прямо из скрипта.

 

Что дальше

В следующем уроке разберём kafka-dump-log.sh — утилиту для чтения содержимого лог-сегментов Kafka напрямую с диска. Это инструмент отладки: он покажет, что именно хранится в бинарных файлах Kafka, включая заголовки сообщений, офсеты и временные метки. Пригодится, когда нужно разобраться с потерянными сообщениями или понять структуру хранения.

 

Ссылки

 

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

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