Команды Kafka
Команды ниже используют нейтральный локальный адрес. В рабочем окружении endpoint, TLS/SASL и файл клиентской конфигурации приходят извне; секреты не передаю прямо в командной строке.
export BOOTSTRAP_SERVER=localhost:9092
export TOPIC_NAME=orders
export GROUP_NAME=billingТопики
kafka-topics --bootstrap-server "$BOOTSTRAP_SERVER" \
--create --topic "$TOPIC_NAME" \
--partitions 3 --replication-factor 1
kafka-topics --bootstrap-server "$BOOTSTRAP_SERVER" --list
kafka-topics --bootstrap-server "$BOOTSTRAP_SERVER" \
--describe --topic "$TOPIC_NAME"Увеличить число партиций можно, уменьшить — нельзя:
kafka-topics --bootstrap-server "$BOOTSTRAP_SERVER" \
--alter --topic "$TOPIC_NAME" --partitions 6После такого изменения распределение ключей может измениться, поэтому это не просто операция масштабирования.
Отправка и чтение
kafka-console-producer \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--topic "$TOPIC_NAME"
kafka-console-consumer \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--topic "$TOPIC_NAME" \
--from-beginning--from-beginning влияет на чтение при отсутствии подходящего committed offset; он не “перематывает” существующую группу сам по себе. Для наблюдения за конкретной группой:
kafka-console-consumer \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--topic "$TOPIC_NAME" \
--group "$GROUP_NAME"
kafka-consumer-groups \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--describe --group "$GROUP_NAME"Сброс offset
Сначала останавливаю потребителей группы и делаю dry run:
kafka-consumer-groups \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--group "$GROUP_NAME" \
--topic "$TOPIC_NAME" \
--reset-offsets --to-earliest --dry-runТолько после проверки результата заменяю --dry-run на --execute. Сброс способен повторно запустить бизнес-операции, поэтому до него проверяю идемпотентность.
Конфигурация защищённого клиента
kafka-topics \
--bootstrap-server "$BOOTSTRAP_SERVER" \
--command-config ./client.properties \
--listСам client.properties не коммичу, если в нём есть credentials. В репозитории допустим шаблон без значений.
Типичные сбои
- Запустить destructive-команду не на том кластере из-за старой переменной.
- Считать replication factor
1приемлемым для отказоустойчивого production. - Сбросить offset при работающей группе и получить конфликт или неожиданный rebalance.
- Удалить топик вместо очистки тестовых данных.
- Передать пароль параметром и оставить его в shell history.
Вопросы для собеседования
Как увидеть consumer lag? Описать consumer group и сравнить current offset с log end offset по партициям.
Почему --from-beginning иногда не читает старые сообщения? У группы уже есть committed offsets.
Можно ли уменьшить число партиций командой alter? Нет; обычно создают новый топик и мигрируют поток.
Зачем сначала --dry-run при reset offsets? Увидеть новые позиции до изменения состояния группы.
См. Kafka, Kafka Broker, Кейс конфигурация Kafka в разных окружениях.