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

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

 

В уроке 14 мы разобрали kafka-features.sh — утилиту для управления feature-флагами кластера и версией метаданных KRaft. Там же стало понятно, что Kafka хранит в метаданных не только версии функций, но и переопределённые конфигурации топиков и брокеров. Посмотреть эти конфигурации в режиме read-only можно через kafka-metadata-shell.sh из урока 13 — раздел /configs/.

Но читать мало. Нужно уметь менять конфигурации на ходу — без перезапуска брокеров и без правки статических файлов server.properties. Именно для этого существует kafka-configs.sh.

Эта утилита — один из главных инструментов в арсенале администратора Kafka. В курсе «Администрирование кластера Kafka» управлению конфигурациями уделен отдельный блок: там разбирают приоритеты конфигов, как они применяются в реальных кластерах и почему статический server.properties — это крайний случай, а не норма.

 

Что такое утилита kafka-configs.sh и как она устроена

kafka-configs.sh управляет динамическими конфигурациями кластера Kafka. Это не те настройки, что прописаны в server.properties на диске. Это конфигурации, которые хранятся в метаданных кластера и применяются без перезапуска.

Утилита работает с пятью типами объектов — так называемыми entity.

  • topics. Конфигурации конкретного топика: срок хранения, максимальный размер сообщения, политика очистки и другие параметры уровня топика.
  • brokers. Динамические конфигурации брокера: настройки репликации, лимиты по трафику, логгирование и прочее, что можно изменить без рестарта.
  • broker-loggers. Уровни логирования для конкретного брокера — полезно при диагностике без выключения ноды.
  • users. Квоты для пользователей SASL/ACL: лимиты на скорость продьюсинга и консьюминга.
  • clients. Квоты для клиентских идентификаторов — по client.id, не по имени пользователя.

Каждая операция строится из трёх обязательных частей: действие (—describe или —alter), тип объекта (—entity-type) и способ подключения к кластеру (—bootstrap-server).

Опции выбора для работы с утилитой kafka_config.sh


Шаг 1. Описание конфигурации топика

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

# Посмотреть переопределённые конфигурации топика orders
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --entity-type topics \
  --entity-name orders

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

# Все параметры топика, включая унаследованные от брокера
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --entity-type topics \
  --entity-name orders \
  --all

Вывод покажет три типа значений: DEFAULT_CONFIG — параметр взят с брокера, STATIC_BROKER_CONFIG — задан в server.properties, DYNAMIC_TOPIC_CONFIG — переопределён для этого топика явно.

Dynamic configs for topic orders are:
  retention.ms=604800000 sensitive=false synonyms={DYNAMIC_TOPIC_CONFIG:retention.ms=604800000, DEFAULT_CONFIG:log.retention.ms=86400000}
  max.message.bytes=5242880 sensitive=false synonyms={DYNAMIC_TOPIC_CONFIG:max.message.bytes=5242880, DEFAULT_CONFIG:message.max.bytes=1048588}

 

Шаг 2. Изменение конфигурации топика

 

Операция —alter применяет изменение немедленно — без перезапуска брокера. Для добавления или изменения параметров используется флаг —add-config.

# Установить срок хранения 7 дней для топика orders
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type topics \
  --entity-name orders \
  --add-config retention.ms=604800000

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

# Изменить сразу несколько параметров топика
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type topics \
  --entity-name orders \
  --add-config retention.ms=604800000,max.message.bytes=5242880,compression.type=lz4

После успешного применения утилита выводит короткое подтверждение без деталей. Проверить результат стоит отдельным —describe.

 

Шаг 3. Сброс параметра к значению по умолчанию

 

Чтобы убрать переопределение и вернуть параметр к дефолту брокера, используется —delete-config. После этого топик начнёт использовать значение из настроек брокера.

# Удалить переопределение retention.ms - топик вернётся к дефолту брокера
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type topics \
  --entity-name orders \
  --delete-config retention.ms

Важный момент — —delete-config не сбрасывает значение в ноль и не «удаляет» параметр полностью. Он просто убирает переопределение уровня топика. Параметр продолжает работать, но теперь берётся с уровня брокера.

 

Шаг 4. Работа с конфигурациями брокера

 

Динамические конфигурации брокера меняются похожим образом, только —entity-type указывается как brokers, а —entity-name — это числовой идентификатор брокера.

# Посмотреть динамические конфигурации брокера 1
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --entity-type brokers \
  --entity-name 1

Для изменений на уровне всего кластера сразу — без указания конкретного брокера — используется флаг —entity-default. Это удобно, когда нужно применить настройку ко всем брокерам одной командой.

# Установить лимит репликации для всех брокеров кластера
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type brokers \
  --entity-default \
  --add-config leader.replication.throttled.rate=10485760

Лимиты репликации особенно нужны при переносе партиций — чтобы не положить сеть на продакшне, пока Kafka перебрасывает данные между брокерами.

 

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

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

 

Шаг 5. Управление логгерами брокера

Тип сущности broker-loggers отвечает только за уровни логирования. Это отдельный механизм от обычных конфигов брокера — он меняет уровень log4j-логгера в реальном времени.

# Посмотреть текущие уровни логгеров для брокера 1
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --entity-type broker-loggers \
  --entity-name 1
# Временно включить DEBUG для репликации на брокере 1
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type broker-loggers \
  --entity-name 1 \
  --add-config kafka.server.ReplicaManager=DEBUG

После диагностики уровень стоит вернуть обратно — DEBUG генерирует огромный объём логов и ощутимо нагружает брокер.

 

Шаг 6. Квоты для пользователей и клиентов

Квоты в Kafka ограничивают скорость продьюсинга и консьюминга для конкретного принципала или клиента. Это один из стандартных инструментов управления нагрузкой в многотенантных кластерах.

# Установить квоту для пользователя alice: продьюсинг 1 MB/s, консьюминг 2 MB/s
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type users \
  --entity-name alice \
  --add-config producer_byte_rate=1048576,consumer_byte_rate=2097152
# Установить квоту по client.id для клиентского приложения
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type clients \
  --entity-name analytics-service \
  --add-config consumer_byte_rate=5242880

Квоты можно комбинировать: задать сначала для пользователя, потом для связки пользователь + клиент. В этом случае применяется более специфичное правило.

# Квота для конкретной связки user=alice, client.id=analytics-service
kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter \
  --entity-type users \
  --entity-name alice \
  --entity-type clients \
  --entity-name analytics-service \
  --add-config producer_byte_rate=524288

Посмотреть все квоты для пользователя или клиента можно тем же —describe. А чтобы снять квоту — —delete-config с нужным ключом.

 

Часто используемые параметры топиков

Ниже — параметры, которые на практике меняются чаще всего. Все они применяются через —add-config при —entity-type topics.

  • retention.ms. Срок хранения сообщений в миллисекундах. Значение -1 означает «хранить вечно». По умолчанию берётся из log.retention.ms брокера.
  • retention.bytes. Максимальный размер лога партиции в байтах. После превышения старые сегменты удаляются. По умолчанию -1 (без ограничений).
  • max.message.bytes. Максимальный размер одного сообщения для этого топика. Важно согласовывать с fetch.max.bytes на консьюмере.
  • cleanup.policy. Политика очистки: delete (удалять по времени/объёму) или compact (сжимать, оставляя последнее значение по ключу). Можно указать оба через запятую: compact,delete.
  • compression.type. Тип сжатия: gzip, snappy, lz4, zstd или producer (сжатие задаётся продьюсером).
  • min.insync.replicas. Минимальное число реплик в ISR для подтверждения записи. Критичный параметр для надёжности — меняйте с пониманием последствий.
  • segment.ms. Максимальное время жизни активного сегмента лога до принудительного закрытия. Влияет на частоту сброса на диск и работу compaction.

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

 

Admin API как альтернатива

Всё, что делает kafka-configs.sh, можно сделать через Kafka Admin API программно. Утилита — это просто обёртка над теми же API-вызовами.

Для чтения конфигураций используется метод describeConfigs(), для изменения — alterConfigs() или более гибкий incrementalAlterConfigs(), который позволяет добавлять и удалять параметры атомарно в одном вызове.

// Пример: изменение конфигурации топика через AdminClient (Java)
AdminClient admin = AdminClient.create(props);

Map<ConfigResource, Collection<AlterConfigOp>> updates = new HashMap<>();
ConfigResource resource = new ConfigResource(ConfigResource.Type.TOPIC, "orders");

updates.put(resource, List.of(
    new AlterConfigOp(
        new ConfigEntry("retention.ms", "604800000"),
        AlterConfigOp.OpType.SET
    )
));

admin.incrementalAlterConfigs(updates).all().get();

Когда использовать утилиту, а когда API — зависит от задачи. kafka-configs.sh удобнее для ручных операций и скриптов на bash. AdminClient нужен, если управление конфигурациями встроено в приложение или CI/CD-пайплайн.

 

Типичные ошибки и как их избежать

Несколько вещей, на которых часто спотыкаются при первом знакомстве с утилитой.

  • Опечатка в имени параметра. Kafka не предупреждает о неизвестных ключах — она просто сохраняет их в метаданных, и они никогда не применяются. Всегда проверяйте результат через —describe после —alter.
  • Несогласованность min.insync.replicas и replication.factor. Если выставить min.insync.replicas=3 для топика с двумя репликами, запись в топик станет невозможной. Брокер будет отклонять сообщения с ошибкой NotEnoughReplicasException.
  • Путаница между entity-type brokers и broker-loggers. Это разные типы. Логгеры не влияют на поведение брокера, только на объём и детальность логов.
  • Применение —entity-default без понимания приоритетов. Конфиг уровня «все брокеры» перекрывается конфигом конкретного брокера. Если для брокера 2 задан параметр явно, cluster-default его не затронет.

Хорошая практика — после любого —alter делать —describe —all и убеждаться, что параметр отображается с нужным уровнем (DYNAMIC_TOPIC_CONFIG или DYNAMIC_BROKER_CONFIG).

 

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

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

 

Что дальше

В уроке 16 разберём kafka-log-dirs.sh — утилиту для анализа размеров и расположения лог-директорий партиций. Это прямое продолжение темы: после того как вы поменяли retention.bytes через kafka-configs.sh, именно kafka-log-dirs.sh поможет проверить, освободилось ли место на диске.

Референсы

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

Тема Ссылка
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/