Данную статью посвящаю тем, кто начинает изучать Kafka и собирается установить ее для тестирования в среде Windows. Так как, практика — лучший способ глубокого понимания теории, то приступим.
Устанавливать будем именно Kafka, а не Confluent:
Начинать лучше от простого к сложному
Для Kafka много разных компонентов от сторонних разработчиков. Пробуйте свою конфигурацию.
Отсутствует необходимость в платных подписках.
Лучшее понимание внутренней работы системы.
С учетом того, что разработчики Kafka с версии 4.3 исключили из дистрибутива ZooKeeper, устанавливать мы будем версию Kafka с внутренним консенсус-протоколом KRaft (Kafka Raft).
Также развернем Kafka с тремя брокерами, как в настоящем продакшн, чтобы как можно лучше понять особенности работы этого брокера. Данное решение обеспечит:
Отказоустойчивость (при падении одного брокера кластер останется работоспособным).
Балансировку нагрузки (партиции распределятся между узлами).
Практическое понимание работы распределенного брокера сообщений.
Сразу обращу ваше внимание на важный момент: Kafka успешно запускается в среде Windows, и вы сможете создать свой первый топик. Однако при дальнейшем использовании могут возникнуть проблемы с совместимостью. Например, Windows может заблокировать log- и index- файлы Kafka при попытке удалить топик.
Чтобы избежать проблем с совместимостью при работе Kafka в Windows, воспользуемся Windows Subsystem for Linux (WSL). Это решение позволяет запустить Kafka в нативной Linux-среде прямо в Windows, что обеспечивает стабильную работу всех функций системы, включая создание и удаление топиков, а также корректную работу с файлами журналов:
WSL актуален для Windows 10 и выше
Позволяет избежать критических ошибок
Обеспечивает полноценную работу всех компонентов Kafka
Не требует установки виртуальных машин
Даст возможность получить практику работы с Linux
Устанавливаем WSL
Итак, приступим. Начнем с установки WSL2.
Откройте PowerShell от имени администратора и выполните:
PowerShell
wsl -install
Указываем пользователя, пароль.
По окончании установки у вас появится возможность выбрать терминал Ubuntu в приложениях Windows (меню «Пуск») или в терминале Windows PowerShell. Также вы сможете работать с файловой системой Ubuntu, используя стандартные инструменты Windows, например проводник Windows.
Доступ к файловой системе Linux осуществляется через каталог \\wsl$\Ubuntu

Далее, для краткости, будем обозначать терминал Ubuntu как Bash (Bourne Again SHell). Также для удобства мы с вами будем использовать Bash-скрипты — это файлы с расширением .sh, содержащие набор команд. Они являются эквивалентом BAT-файлов в Windows.

Если вы только начинаете свое знакомство с Linux и работаете с командной оболочкой Bash, вам регулярно будет встречаться команда sudo. Эта команда предоставляет временные права администратора (root) для выполнения конкретных задач, подобно тому, как в Windows вы используете учётную запись с правами администратора для внесения изменений в систему.
Далее установим доступные обновления для нашей Linux-среды, для чего выполните команду:
Bash
sudo apt update && sudo apt upgrade -y
Флаги:
y - означает «yes», автоматически подтверждает все запросы, которые система могла бы задать во время обновления.
Устанавливаем Java
Apache Kafka написана на Java и Scala и для ее работы, а также работы компонентов Kafka нам необходимо установить Java. Kafka официально поддерживает несколько версий Java:
Java 8 (устаревшая, не рекомендуется к использованию)
Java 11 (LTS-версия)
Java 17 (LTS-версия)
Мы с вами установим Java17, как наиболее современную LTS-версию:
Bash
sudo apt install openjdk-17-jdk -yПроверим установку:
Bash
java -versionВ ответ получим примерно такой результат:

Завершив настройку WSL, переходим к следующему этапу — установке и настройке Kafka.
Устанавливаем Apache Kafka
Устанавливать предлагаю версию 4.0.0. На самом деле выбор конкретной версии не принципиален, вы можете поменять ее на другую. Важно, чтобы версия поддерживала работу с внутренним консенсус-протоколом Kraft.
Скачиваем архив с Kafka
Bash
sudo wget https://dlcdn.apache.org/kafka/4.0.0/kafka_2.13-4.0.0.tgz -O /tmp/kafka.tgz
Элементы командной строки:
O - указывает путь сохранения файла
tmp - временная директория для загрузки
Затем распакуем и переместим файлы в /opt/kafka:
Bash
sudo tar -xzf /tmp/kafka.tgz -C /opt/ # Распаковываем архив в /opt/
sudo mv /opt/kafka_2.13-4.0.0 /opt/kafka # Перемещаем в /opt/kafka
sudo chown -R $USER:$USER /opt/kafka # Даем права нашему пользователю
Элементы командной строки:
tar -xzf - распаковывает архив
C - указывает целевую директорию
chown - изменяет владельца файлов
$USER - переменная, содержащая имя текущего пользователя. Команда sudo chown -R $USER:$USER автоматически подставит имя вашего пользователя.
Создание и настройка кластера
Следующий этап — создание и настройка кластера, состоящего из трёх узлов.
Для развёртывания кластера Apache Kafka необходимо настроить три сервера (брокера): server1, server2 и server3. Каждому брокеру потребуется индивидуальный конфигурационный файл.
Создадим директорию kraft в папке /opt/kafka/config/ и разместим в ней следующие конфигурационные файлы: server1.properties, server2.properties, server3.properties:
Bash
mkdir -p /opt/kafka/config1/kraft/
sudo touch /opt/kafka/config1/kraft/server1.properties
sudo touch /opt/kafka/config1/kraft/server2.properties
sudo touch /opt/kafka/config1/kraft/server3.properties
Элементы командной строки:
p – создает каталоги, включая родительские, если они отсутствуют.
Проверьте, все файлы должны быть сохранены в кодировке UTF-8 с форматом конца строки LF.
После этого настроим режим работы брокеров, определив базовые параметры, необходимые для функционирования системы. В дальнейшем вы сможете расширить и модифицировать конфигурацию в соответствии с конкретными требованиями вашего проекта.
Чтобы определить IP-адрес WSL, выполните следующую команду:
Bash
hostname -I
Элементы командной строки:
I— флаг утилитыhostname, который выводит все IPv4-адреса, назначенные сетевым интерфейсами системы.
Замените <ваш_IP> на IP-адрес, полученный командой hostname -I:
server1.properties
process.roles=broker,controller
node.id=1
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT:// <ваш_IP>:9092
controller.quorum.voters=1@<ваш_IP>:9093,2@<ваш_IP>:9095,3@<ваш_IP>:9097
controller.listener.names=CONTROLLER
log.dirs=/var/lib/kafka/broker1
num.partitions=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2server2.properties
process.roles=broker,controller
node.id=2
listeners=PLAINTEXT://:9094,CONTROLLER://:9095
advertised.listeners=PLAINTEXT:// <ваш_IP>:9094
controller.quorum.voters=1@<ваш_IP>:9093,2@<ваш_IP>:9095,3@<ваш_IP>:9097
controller.listener.names=CONTROLLER
log.dirs=/var/lib/kafka/broker2
num.partitions=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2server3.properties
process.roles=broker,controller
node.id=3
listeners=PLAINTEXT://:9096,CONTROLLER://:9097
advertised.listeners=PLAINTEXT:// <ваш_IP>:9096
controller.quorum.voters=1@<ваш_IP>:9093,2@<ваш_IP>:9095,3@<ваш_IP>:9097
controller.listener.names=CONTROLLER
log.dirs=/var/lib/kafka/broker3
num.partitions=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2Параметры, указанные в конфигурационных файлах, можно разделить на несколько групп:
1.Режим работы узла
process.roles – определяет роли узла. Возможны комбинации: только broker, только controller, или обе роли (в режиме KRaft):
broker– отвечает за хранение данных и обработку клиентских запросовcontroller– управляет метаданными кластера (лидеры партиций и другие метаданные)
node.id – уникальный идентификатор узла в кластере (например, ваш брокер имеет ID=1).
2.Сетевые настройки
listeners – интерфейсы и порты для подключений:
PLAINTEXT://:9092– порт для клиентских подключений (продюсеры/консьюмеры), без шифрования.CONTROLLER://:9093– порт для внутренней коммуникации контроллеров (Raft-трафик).
advertised.listeners – адрес, который брокер сообщает клиентам (должен быть доступен извне).
controller.listener.names – указывает, какой listener используется для Raft-коммуникации (CONTROLLER).
3.Кворум контроллеров (Kraft)
controller.quorum.voters - определяет состав Raft-кворума для управления метаданными:
Формат:
node_id@host:port. В нашем случае указаны 3 узла с одним IP, но разными портами (9093, 9095, 9097) – это эмулирует кластер на одной машине (например, для тестирования).
4.Хранение данных
log.dirs - директория для хранения: данных топиков, логов коммитов (Kraft), методанных кластера
5.Настройки топиков
num.partitions – количество партиций по умолчанию для новых топиков.
offsets.topic.replication.factor – фактор репликации для внутреннего топика __consumer_offsets (хранение смещений потребителей).
transaction.state.log.replication.factor – фактор репликации для топика транзакций.
transaction.state.log.min.isr – минимальное число реплик (In-Sync Replicas) для записи в топик транзакций.
6.Как это работает вместе?
Узел запускается как брокер + контроллер (ID=1).
Клиенты подключаются к порту 9092 брокера ID=1 (через advertised.listeners).
Контроллеры общаются между собой через порт 9093 (Raft-протокол).
Данные хранятся в
/var/lib/kafka/broker1.Кворум из 3 узлов (на одном IP, но разных портах) обеспечивает отказоустойчивость метаданных.
Запуск кластера Kafka
Надеюсь, предыдущие шаги не вызвали у вас сложности и можно приступить к финальному шагу – запуску кластера Kafka
1.Подготовка переменных
Для удобства зададим переменные:
Bash
KAFKA_HOME=/opt/kafka
BROKER1_CONF=$KAFKA_HOME/config/kraft/server1.properties
BROKER2_CONF=$KAFKA_HOME/config/kraft/server2.properties
BROKER3_CONF=$KAFKA_HOME/config/kraft/server3.properties
CLUSTER_ID=my-kafka-cluster-123 #уникальный идентификатор кластера2.Форматирование хранилища Kafka для каждого брокера
Следующее, что нужно сделать перед первым запуском кластера - отформатировать хранилище. Данная процедура инициализации метаданных является обязательной для работы Kafka в режиме KRaft.
Операция выполняется однократно и требует последовательного запуска команд для каждого брокера в том же терминале, где были определены переменные окружения.
Bash
# Брокер 1
sudo $KAFKA_HOME/bin/kafka-storage.sh format \
-t $CLUSTER_ID \
-c $BROKER1_CONF \
--ignore-formatted
Элементы командной строки:
t - задаёт Cluster ID (обязательный параметр)
c - указывает конфигурационный файл (обязательный параметр)
Bash
# Брокер 2
sudo $KAFKA_HOME/bin/kafka-storage.sh format \
-t $CLUSTER_ID \
-c $BROKER2_CONF \
--ignore-formattedBash
# Брокер 3
sudo $KAFKA_HOME/bin/kafka-storage.sh format \
-t $CLUSTER_ID \
-c $BROKER3_CONF \
--ignore-formatted3.Создание каталогов для хранения логов внутри WSL
Чтобы Kafka работала корректно — особенно в окружении с несколькими брокерами — важно заранее организовать чёткую файловую структуру. Ниже приведены ключевые директории и их назначение.
Папка |
Назначение |
Что хранит |
Пример содержимого |
/var/lib/kafka/ |
Данные топиков |
Сообщения Kafka и метаданные партиций |
|
/var/log/kafka/ |
Логи брокера |
Логи работы Kafka |
|
/opt/kafka/logs/ |
Логи скриптов |
Логи ваших скриптов |
Логи продюсеров, консьюмеров, кастомные скрипты |
Более развернутую структуру хранения логов и топиков можно посмотреть ниже, под спойлером. Она может со временем измениться в зависимости от требований разработчиков Kafka.
Пока же важно понять базовую организацию — она позволит быстро находить нужные файлы, анализировать проблемы и управлять кластером.
Структура хранения логов и топиков



В окне того же терминала выполняем:
Bash
mkdir -p /var/lib/kafka/{broker1,broker2,broker3} # data_dir для брокеров
mkdir -p /var/log/kafka/{broker1,broker2,broker3} # логи Kafka
mkdir -p /opt/kafka/logs #логи пользователя
Элементы командной строки:
p — создать все недостающие родительские директории.
4.Настройка прав доступа
Далее назначим права доступа на директории Kafka, чтобы процесс мог работать от имени вашего пользователя, не требуя постоянного использования sudo.
Bash
sudo chown -R $USER:$USER /var/lib/kafka/
sudo chown -R $USER:$USER /var/log/kafka/
sudo chown -R $USER:$USER /opt/kafka/logs
Элементы командной строки:
-R $USER:$USER – меняет владельца на текущего пользователя, а именно:
меняет владельца папки
меняет владельца всех файлов внутри папки
меняет владельца всех подпапок и их содержимого
$USER содержит имя твоего пользователя
5.Запуск брокеров
И наконец — пожалуй, один из самых ответственных и долгожданных моментов: запуск кластера Kafka.
Команду выполняем в том же терминале, где заданы переменные:
Bash
sudo chown -R $USER:$USER /var/lib/kafka/
sudo chown -R $USER:$USER /var/log/kafka/
sudo chown -R $USER:$USER /opt/kafka/logs
Элементы командной строки:
& — запуск в фоне
Скрипты для запуска кластера
Надеюсь, первый запуск кластера прошёл без затруднений. Учитывая, что кластер используется в тестовых целях, рекомендую создать скрипт для его очистки и повторной инициализации, позволяющий выполнить настройку одним действием.
Форматирование кластера
Для повторного форматирования и очистки создадим в папке /opt/kafka/ текстовый файл format-cluster.sh. Помним про необходимость придерживаться кодировки UTF-8 и форматом конца строки LF (Unix-стиль).
Bash
sudo touch /opt/kafka/format-cluster.shСкопируйте в файл содержимое скрипта.
format-cluster.sh
#!/bin/bash
# Конфигурация
KAFKA_HOME="/opt/kafka"
CLUSTER_ID="my-kafka-cluster-123"
DATA_DIR="/var/lib/kafka"
LOG_DIR="$KAFKA_HOME/logs"
LOCK_DIR="/var/lock/kafka"
# Функция очистки
cleanup() {
echo "[1/5] Очистка старых данных..."
pkill -f "kafka-server-start" || true
rm -rf "$DATA_DIR"/{broker1,broker2,broker3}
rm -rf "$LOCK_DIR"/{broker1,broker2,broker3}
mkdir -p "$DATA_DIR"/{broker1,broker2,broker3}
mkdir -p "$LOCK_DIR"/{broker1,broker2,broker3}
mkdir -p "$LOG_DIR"
}
# Функция форматирования
format_storage() {
echo "[2/5] Форматирование хранилищ..."
for id in {1..3}; do
echo "Форматирование брокера $id"
"$KAFKA_HOME/bin/kafka-storage.sh" format \
-t "$CLUSTER_ID" \
-c "$KAFKA_HOME/config/kraft/server$id.properties" \
--ignore-formatted || {
echo "[ОШИБКА] Форматирование брокера $id не удалось"
exit 1
}
done
}
cleanup
format_storageДайте права на выполнение:
Bash
sudo chmod +x /opt/kafka/format-cluster.shПосле этого можете запускать ваш скрипт:
Bash
/opt/kafka/format-cluster.shОсторожно! Скрипт удалит все данные кластера без возможности восстановления. Используйте только в тестовых целях и при необходимости полного сброса.
Запуск кластера
Аналогичным образом создайте в директории /opt/kafka/ скрипт run-cluster.sh:
Bash
sudo touch /opt/kafka/run-cluster.shСкопируйте в файл содержимое скрипта и сохраните изменения.
run-cluster.sh
/opt/kafka/run-cluster.sh
Дайте права на выполнение:
Bash
sudo chmod +x /opt/kafka/run-cluster.shПосле этого можете запускать ваш скрипт:
Bash
/opt/kafka/run-cluster.shУправление топиками
Далее приведу примеры основных операций по созданию и администрированию топиков. Основная утилита Kafka для работы с топиками — kafka-topics.sh.
Для начала достаточно освоить три сценария её использования:
Создание топика
Просмотр списка топиков
Получение информации о конкретном топике
Полный список доступных флагов и опций можно получить, выполнив в терминале команду:
/opt/kafka/bin/kafka-topics.sh --help
Обратите внимание, знак обратного слеша (\) в командной строке используется как символ продолжения строки. Он позволяет разбить длинную команду на несколько физических строк для лучшей читаемости. В противном случае все флаги команды нужно указать в одну строку. Каждый флаг команды начинается с (--)
Пример:
# С использованием \
команда \
--флаг1 \
--флаг
# Без использования \
команда --флаг1 --флаг2
Создать топик
Команда для создания нового топика с заданными параметрами
/opt/kafka/bin/kafka-topics.sh \
--create \
--bootstrap-server localhost:9092 \
--topic test-topic \
--partitions 1 \
--replication-factor 3 \
create — указывает на операцию создания нового топика
bootstrap-server — адрес и порт сервера Kafka для подключения (например, localhost:9092)
topic — имя создаваемого топика (в примере: test-topic)
partitions — количество партиций в топике (1 в данном случае)
replication-factor — фактор репликации (количество копий данных, 3 в примере)
Посмотреть список топиков
Получение списка всех существующих топиков
/opt/kafka/bin/kafka-topics.sh \
--list \
--bootstrap-server localhost:9092
list — команда для вывода списка всех существующих топиков
bootstrap-server — адрес сервера Kafka для подключения
Информация о топике
Получение детальной информации о конкретном топике
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--describe --topic test-topic
bootstrap-server — адрес сервера Kafka
describe — команда для получения детальной информации о топике
topic — имя топика, для которого требуется информация
Работа с данными
Теперь перейдём к примерам работы с данными в Kafka. Чтобы протестировать обмен сообщениями через созданный кластер, запустим консольного продюсера и консьюмера. В арсенале Kafka для этого есть утилиты:kafka-console-producer.sh и kafka-console-consumer.sh.
Полный список флагов этих утилит можно посмотреть, запустив их с опцией --help. Пока же рассмотрим только базовые возможности.
Запуск продюсера
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic test-topic
bootstrap-server — адрес и порт Kafka-брокера для подключения (например, localhost:9092).
topic <имя топика> — топик, в который будут отправляться сообщения
Запуск потребителя
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic test-topic \
--from-beginning
bootstrap-server — адрес и порт Kafka-брокера для подключения (например, localhost:9092).
topic <имя топика> — топик, на сообщения которого нужно подписаться потребителю
from-beginning - необязательный флаг, который указывает потребителю читать все сообщения с самого начала топика. Без этого флага потребитель начинает чтение с последнего оффсета (т.е. только новые сообщения, приходящие после запуска).
Теперь вы можете отправить сообщение из консоли продюсера (производителя) в консоль консьюмера (потребителя).
Устанавливаем UI интерфейс
Чтобы сделать кластер удобным в использовании и приблизить его по функциональности к облачным решениям, добавим веб-интерфейс на основе Kafka UI.
Существует множество инструментов для управления Kafka (например, Conduktor, Kafka Tool, Redpanda Console), но мы выберем Kafka UI, так как он:
предоставляет широкие возможности мониторинга и управления
не требует лицензии
легко интегрируется через Docker или отдельный сервис
Для этого с GitHub скачиваем Java-приложение Kafka UI, например в папку /opt/kafka/ui/: https://github.com/provectus/kafka-ui/releases
Bash
sudo mkdir -p /opt/kafka/ui && sudo wget -O /opt/kafka/ui/kafka-ui-api-v0.7.2.jar https://github.com/provectus/kafka-ui/releases/download/v0.7.2/kafka-ui-api-v0.7.2.jarДалее повторим уже знакомые нам действия для создания скрипта, который запустит наш Kafka UI.
В корневой директории /opt/kafka/ создайте скрипт run-kafka-ui.sh:
Bash
sudo touch /opt/kafka/run-kafka-ui.shСкопируйте в файл содержимое скрипта и сохраните изменения.
run-kafka-ui.sh
#!/bin/bash
KAFKA_UI_JAR="/opt/kafka/ui/kafka-ui-api-v0.7.2.jar"
KAFKA_BROKERS="localhost:9092,localhost:9094,localhost:9096"
WEB_PORT="8080"
echo "Kafka UI будет доступен по адресу: http://localhost:$WEB_PORT"
java -jar "$KAFKA_UI_JAR" \
--kafka.clusters.0.name=WSL_Kafka_Cluster \
--kafka.clusters.0.bootstrapServers="$KAFKA_BROKERS" \
--server.port="$WEB_PORT"Сделайте скрипт исполняемым:
Bash
sudo chmod +x /opt/kafka/run-kafka-ui.shТеперь вы можете запустить Kafka UI одной командой:
Bash
/opt/kafka/run-kafka-ui.shПосле запуска сервиса перейдите в браузере по адресу: http://localhost:8080
Если всё настроено верно, откроется веб-интерфейс Kafka UI
Остановка брокеров
Как и положено, после завершения работы с кластером необходимо корректно его остановить. Это особенно важно в режиме KRaft, где метаданные хранятся непосредственно в самой Kafka: некорректное завершение может привести к потере данных или проблемам при перезапуске.
Для этой задачи Kafka предоставляет специальный инструмент — скрипт kafka-server-stop.sh. Он безопасно останавливает брокер, выполняя синхронизацию и сохранение текущего состояния.
Важно: останавливайте брокеры в обратном порядке по отношению к их запуску, чтобы избежать нарушения кворума контроллера.
Bash
KAFKA_HOME=/opt/kafka
BROKER1_CONF=$KAFKA_HOME/config/kraft/server1.properties
BROKER2_CONF=$KAFKA_HOME/config/kraft/server2.properties
BROKER3_CONF=$KAFKA_HOME/config/kraft/server3.properties
$KAFKA_HOME/bin/kafka-server-stop.sh $BROKER3_CONF
sleep 3
$KAFKA_HOME/bin/kafka-server-stop.sh $BROKER2_CONF
sleep 3
$KAFKA_HOME/bin/kafka-server-stop.sh $BROKER1_CONFСкрипт для остановки брокера
Как и при запуске, для удобства остановки кластера создадим собственный скрипт.
Чтобы повысить надёжность, добавим в него автоматический переход к принудительной остановке, если стандартный способ завершения брокеров не сработал за отведённое время.
Следующие шаги вам уже хорошо знакомы:
В корневой директории /opt/kafka/ создайте скрипт kafka-server-stop.sh:
Bash
/opt/kafka/run-kafka-ui.sh
Скопируйте в файл содержимое скрипта и сохраните изменения.
kafka-server-stop.sh
/opt/kafka/run-kafka-ui.shСделайте скрипт исполняемым:
Bash
/opt/kafka/run-kafka-ui.shТеперь вы можете остановить Kafka одной командой:
Bash
/opt/kafka/run-kafka-ui.shЗаключение
Вот и все!
Мы разобрали основные шаги для установки Apache Kafka на Windows в режиме KRaft без использования ZooKeeper.
Теперь у вас есть рабочая лаборатория, где можно экспериментировать: создавать топики, запускать продюсеров и консьюмеров, тестировать отказоустойчивость и изучать поведение кластера.
Дальше вы можете:
Углубить знания: изучить работу с разными типами данных (Avro, Protobuf), поэкспериментировать с настройками очистки логов (log retention) и сжатия.
Расширить экосистему: попробовать подключить такие инструменты, как ksqlDB, Kafka Connect или UI-просмотрщики типа AKHQ, для большего удобства.
Не бойтесь менять конфигурации, пробовать новые инструменты и дополнять стек — именно так формируется настоящее понимание Kafka. Помните: никакая документация не заменит практики.
В следующей статье подробно разберём с вами, как работают продюсеры, консьюмеры и сами сообщения — от отправки до доставки.