Изучаем Apache Kafka с нуля. Урок 22. kafka-reassign-partitions.sh

Изучаем Apache Kafka с нуля. Урок 22. kafka-reassign-partitions.sh

 

В уроке 21 мы разбирали kafka-leader-election.sh — инструмент для управления лидерами партиций после сбоев и перезапусков брокеров. Там вопрос стоял просто: вернуть лидерство туда, где оно должно быть по конфигурации.

Сегодня задача масштабнее — физически переместить партиции между брокерами. Это нужно при добавлении нового брокера в кластер, выводе старого из эксплуатации или выравнивании нагрузки на диски. Утилита kafka-reassign-partitions.sh — основной инструмент для этого в стандартной поставке Kafka.

Тема переназначения партиций подробно разбирается в практической части курса «Администрирование кластера Kafka» — там же работа с Cruise Control и стратегии балансировки в production.

 

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

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

 

Зачем переназначать партиции

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

Основные сценарии, когда нужна переназначение партиций:

  • Масштабирование вширь. Добавили новый брокер в кластер — нужно раскидать на него часть партиций, чтобы он реально участвовал в работе.
  • Вывод брокера из эксплуатации. Перед тем как выключить брокер, все его партиции нужно перенести на оставшихся участников.
  • Балансировка дисков. Если один лог-каталог заполнился сильнее других, можно переместить партиции между директориями на том же брокере.
  • Повышение фактора репликации. Изменить количество реплик для существующего топика можно только через переназначение.

Во всех этих случаях используется один и тот же инструмент — kafka-reassign-partitions.sh — и один и тот же трёхфазный процесс.

 

Три фазы переназначения

 

Переназначение в Kafka всегда проходит три фазы: генерация плана, выполнение, проверка. Пропускать фазы нельзя — логика утилиты построена вокруг JSON-файла с планом, который передаётся между шагами. Как эффективно переназначить партиции в Apache Kafka - бесплатный урок


Фаза 1. Генерация плана

Флаг —generate принимает список топиков и список целевых брокеров, после чего предлагает оптимальное распределение партиций. Утилита ничего не меняет — только выводит два JSON-блока: текущее распределение и предложенное новое.

Перед вызовом нужно подготовить файл с топиками:

{
  "topics": [
    {"topic": "orders"},
    {"topic": "payments"}
  ],
  "version": 1
}

Сохраните его, например, как topics-to-move.json. Теперь запускаем генерацию плана:

# Генерируем план переназначения для топиков orders и payments
# на брокеры с ID 1, 2, 3 (включая только что добавленный брокер 3)
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --topics-to-move-json-file /tmp/topics-to-move.json \
  --broker-list "1,2,3" \
  --generate

Вывод будет содержать два JSON-блока. Первый — Current partition replica assignment — это текущее состояние, его нужно сохранить как резервную копию. Второй — Proposed partition reassignment configuration — это план, который нужно сохранить в файл для следующей фазы.

# Генерируем план и сразу сохраняем предложенное назначение в файл
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --topics-to-move-json-file /tmp/topics-to-move.json \
  --broker-list "1,2,3" \
  --generate 2>/dev/null \
  | tail -1 > /tmp/reassign-plan.json

Фаза 2. Выполнение

Флаг —execute принимает JSON-план и запускает фактический перенос данных. Это асинхронная операция: команда возвращает управление сразу, а репликация идёт в фоне.

# Запускаем переназначение по плану
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --execute

После этой команды Kafka начинает копировать сегменты логов на новые брокеры. Скорость зависит от объёма данных и сетевой пропускной способности. Без троттлинга утилита использует всю доступную полосу — это может повлиять на production-трафик.

Фаза 3. Проверка

Флаг —verify запрашивает статус выполнения по тому же JSON-файлу и показывает, какие партиции уже перенесены, а какие ещё в процессе.

# Проверяем статус переназначения
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --verify

В выводе каждая партиция получает один из статусов: Completed, Still in progress или Failed. Когда все партиции показывают Completed, переназначение завершено. После этого —verify автоматически снимает троттлинг (если он был установлен через —throttle).

 

Флаги kafka-reassign-partitions.sh

 

Флаг Фаза Описание Обязательный
—bootstrap-server все Адрес брокера в формате host:port да
—generate 1 Сгенерировать план переназначения (ничего не меняет) один из трёх*
—execute 2 Запустить переназначение по JSON-плану один из трёх*
—verify 3 Проверить статус текущего или завершённого переназначения один из трёх*
—cancel 2 Отменить активное переназначение нет
—list любая Показать активные переназначения в кластере нет
—topics-to-move-json-file 1 JSON-файл со списком топиков для —generate с —generate
—broker-list 1 Через запятую: ID целевых брокеров для —generate с —generate
—reassignment-json-file 2, 3 JSON-план для —execute, —verify, —cancel с —execute/verify/cancel
—throttle 2 Лимит скорости репликации в байтах в секунду нет
—additional 2 Добавить партиции к уже идущему переназначению нет
—preserve-throttles 3 Не снимать троттлинг автоматически после —verify нет
—timeout 2 Таймаут ожидания ответа от брокеров (мс, по умолчанию 10000) нет

* Один из трёх режимов — —generate, —execute или —verify — обязателен в каждом вызове утилиты.

 

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

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

 

Формат JSON-плана назначений

JSON-план — центральный элемент работы с утилитой. Понимать его структуру важно, потому что иногда приходится редактировать план вручную, а не принимать автогенерированный вариант целиком.

{
  "version": 1,
  "partitions": [
    {
      "topic": "orders",
      "partition": 0,
      "replicas": [3, 1],
      "log_dirs": ["any", "any"]
    },
    {
      "topic": "orders",
      "partition": 1,
      "replicas": [1, 2],
      "log_dirs": ["any", "any"]
    },
    {
      "topic": "payments",
      "partition": 0,
      "replicas": [2, 3],
      "log_dirs": ["/data/kafka-logs", "any"]
    }
  ]
}

Ключевые поля:

  • replicas — список ID брокеров в нужном порядке. Первый брокер становится preferred replica (лидером по умолчанию).
  • log_dirs — пути к лог-директориям на каждом брокере из списка replicas. Значение «any» означает, что Kafka выберет директорию сама. Конкретный путь используется для балансировки дисков на одном брокере.

Количество элементов в replicas и log_dirs должно совпадать. Порядок важен: replicas[0] соответствует log_dirs[0].

Шаг 1. Добавляем брокер и перебалансируем данные

Типичный production-сценарий: в кластере было 2 брокера с ID 1 и 2, добавили брокер с ID 3. Нужно перенести часть партиций на него.

# 1. Готовим список топиков для балансировки
cat > /tmp/topics-to-move.json << 'EOF' {"topics": [{"topic": "orders"}, {"topic": "payments"}], "version": 1} EOF # 2. Генерируем план на все три брокера, сохраняем текущее состояние и план kafka-reassign-partitions.sh \ --bootstrap-server localhost:9092 \ --topics-to-move-json-file /tmp/topics-to-move.json \ --broker-list "1,2,3" \ --generate 2>/dev/null > /tmp/reassign-output.txt

# Сохраняем текущее состояние (резервная копия)
head -1 /tmp/reassign-output.txt > /tmp/current-assignment.json

# Сохраняем новый план
tail -1 /tmp/reassign-output.txt > /tmp/reassign-plan.json

# 3. Проверяем план перед выполнением (опционально)
cat /tmp/reassign-plan.json | python3 -m json.tool

Перед тем как запускать —execute, сверьте план: убедитесь, что брокер 3 действительно появился в списке реплик и что фактор репликации не изменился случайно.

# 4. Запускаем переназначение с троттлингом 50 MB/s
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --throttle 52428800 \
  --execute

# 5. Проверяем статус через несколько минут
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --verify

Шаг 2. Троттлинг — контроль скорости переноса

Без ограничения скорости переназначение может занять всю сетевую полосу между брокерами. В production-кластере это означает задержки для реальных продьюсеров и консьюмеров. Флаг —throttle задаёт лимит в байтах в секунду.

Ориентир Значение —throttle Когда использовать
10 MB/s 10485760 Рабочие часы, высокая нагрузка на кластер
50 MB/s 52428800 Стандартный баланс скорость/нагрузка
200 MB/s 209715200 Ночное окно обслуживания
без лимита -1 (не указывать флаг) Только dev/test-окружения

Если переназначение уже запущено без троттлинга, его можно добавить на ходу — повторите —execute с тем же файлом плана и нужным значением —throttle. Это не перезапускает переназначение, а только обновляет лимит.

# Добавляем троттлинг к уже запущенному переназначению
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --throttle 10485760 \
  --execute

После завершения переназначения (когда —verify покажет Completed для всех партиций) троттлинг снимается автоматически. Если этого не произошло — вызовите —verify ещё раз без флага —preserve-throttles.

Шаг 3. Отмена переназначения

Если переназначение нужно остановить — например, оно влияет на production сильнее, чем ожидалось — используйте флаг —cancel.

# Отменяем активное переназначение
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/reassign-plan.json \
  --cancel

Важно понимать: отмена не откатывает уже перенесённые данные. Партиции, которые успели переехать на новые брокеры, останутся там. Полный откат к исходному состоянию потребует запуска —execute с файлом current-assignment.json, который вы сохранили на шаге генерации плана. Вот почему резервная копия текущего назначения — не опциональный шаг.

# Откат к исходному распределению после отмены
kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file /tmp/current-assignment.json \
  --throttle 52428800 \
  --execute

Мониторинг через kafka-log-dirs.sh

Флаг —verify показывает статус на уровне партиций, но не даёт деталей по объёму перенесённых данных. Для этого удобнее использовать kafka-log-dirs.sh (урок 16) и смотреть на поле isFuture.

Пока переназначение идёт, в выводе kafka-log-dirs.sh партиция появляется дважды: один раз с текущим расположением (isFuture: false) и один раз с новым (isFuture: true). Когда запись с isFuture: true исчезает — партиция полностью перенесена.

# Считаем, сколько партиций ещё в процессе переноса
kafka-log-dirs.sh \
  --bootstrap-server localhost:9092 \
  2>/dev/null \
  | jq '[.. | .isFuture? | select(. == true)] | length'

Если команда вернула 0 — переназначение завершено для всех партиций во всём кластере, независимо от того, что показывает —verify. Это более надёжная проверка на финальном этапе.

Проверить, что брокер 3 получил партиции, можно через kafka-topics.sh:

# Смотрим, как распределились партиции после переназначения
kafka-topics.sh \
  --bootstrap-server localhost:9092 \
  --describe --topic orders

 

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

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

 

Что нельзя сделать через kafka-reassign-partitions.sh

Утилита мощная, но у неё есть границы. Часть задач администрирования партиций придётся решать другими инструментами.

  • Изменить количество партиций. Это делается только через kafka-topics.sh с флагом —alter —partitions. kafka-reassign-partitions.sh работает только с уже существующими партициями.
  • Автоматически оптимизировать балансировку. Утилита не знает о реальной нагрузке на партиции — только о их расположении. Для умной балансировки с учётом трафика нужен Cruise Control или аналоги.
  • Переназначить партиции внутренних топиков. Системные топики типа __consumer_offsets лучше не трогать через эту утилиту без острой необходимости.
  • Следить за прогрессом в реальном времени. Нет ни progress bar, ни процентов. Только периодические вызовы —verify или мониторинг через kafka-log-dirs.sh.

Для production-кластеров с большим объёмом данных рекомендуется рассмотреть Cruise Control — он умеет планировать переназначения с учётом нагрузки, темпа сети и реплагируемых объёмов, плюс предоставляет REST API для автоматизации.

Что дальше

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

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

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

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