Раздел 26 · Data Engineering

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

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы разобрали топики, партиции и брокеры в песочнице. Песочница удобна, но это симулятор. Сегодня запустим настоящую Kafka у себя на компьютере, создадим топик для «Гонца», запишем в него заказы и прочитаем их обратно. Понадобится только Docker.

Тестовая кухня

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

Kafka из одного брокера в Docker это домашняя кухня. В продакшене у «Гонца» будет кластер из нескольких брокеров, но команды, топики и сообщения там те же самые.

Запуск

Kafka распространяется официальным образом Docker apache/kafka. Одна команда запускает брокер версии 4.3.1 и пробрасывает порт 9092, на котором Kafka принимает клиентов:

docker run -d --name kafka -p 9092:9092 apache/kafka:4.3.1

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

docker logs kafka | grep "Kafka Server started"
[2026-10-11 17:02:17,355] INFO [KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer)

Обрати внимание на слово KafkaRaftServer. С версии 4.0 Kafka управляет кластером сама, через встроенный протокол KRaft. Раньше для этого нужен был отдельный сервис ZooKeeper, и в старых инструкциях ты ещё встретишь его. Сейчас он не нужен: один контейнер это целый кластер из одного брокера. Как KRaft устроен, разберём в уроке про внутреннее устройство.

Где лежат команды

Вместе с Kafka поставляются консольные утилиты: скрипты в папке /opt/kafka/bin внутри контейнера. Каждой утилите нужно сказать, к какому брокеру подключаться, через флаг --bootstrap-server localhost:9092. Запускать их будем через docker exec:

docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

Пока топиков нет, и команда ничего не напечатает. Дальше в уроке для краткости пишем команды без docker exec -it kafka /opt/kafka/bin/, но в терминале этот префикс нужен.

Топик

Создаём топик orders на три партиции:

kafka-topics.sh --bootstrap-server localhost:9092 --create --topic orders --partitions 3
Created topic orders.

Смотрим, что получилось:

kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders
Topic: orders	TopicId: 8P3mkw3qTEup0oTW-a8eQw	PartitionCount: 3	ReplicationFactor: 1	Configs: min.insync.replicas=1,segment.bytes=1073741824
	Topic: orders	Partition: 0	Leader: 1	Replicas: 1	Isr: 1	Elr: 	LastKnownElr: 
	Topic: orders	Partition: 1	Leader: 1	Replicas: 1	Isr: 1	Elr: 	LastKnownElr: 
	Topic: orders	Partition: 2	Leader: 1	Replicas: 1	Isr: 1	Elr: 	LastKnownElr: 

Брокер один, поэтому лидер всех трёх партиций это брокер 1, и копия у каждой партиции одна: ReplicationFactor: 1. TopicId у тебя будет другой, Kafka выдаёт его случайно. Elr и LastKnownElr пока пустые, это служебные списки для выбора лидера, нам они не понадобятся.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.