Руководство по установке Apache Kafka с помощью Docker
Обзор
Docker - один из самых популярных движков, используемых в индустрии программного обеспечения для создания, упаковки и развертывания различных приложений.
В этом руководстве мы узнаем, как выполнить настройку Apache Kafka с помощью Docker.
Важно отметить, что начиная с версии 2.8.0, Apache Kafka поддерживает режим, который не зависит от ZooKeeper. Кроме того, начиная с версии Confluent Platform 7.5, ZooKeeper считается устаревшим, поэтому в этой статье мы работаем с Kafka 7.4.4.
Установка в случае использовании одного узла
Использование одного узла Kafka способно удовлетворить большинство потребностей локальной разработки, поэтому давайте начнем именно с этого варианта.
Настройка docker-compose.yml
Чтобы запустить сервер Apache Kafka, сначала нужно запустить сервер Zookeeper.
Мы можем настроить эту зависимость в файле docker-compose.yml, который гарантирует, что сервер Zookeeper всегда запускается до сервера Kafka и останавливается только после него.
Давайте создадим простой файл docker-compose.yml с двумя сервисами, а именно zookeeper и kafka:
$ cat docker-compose.yml
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.4.4
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:7.4.4
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
В этом случае сервер Zookeeper прослушивает порт=2181 для службы kafka, которая определена в том же контейнере. Однако для любого другого клиента, запущенного на хосте, он будет открыт через порт 22181.
Аналогично, служба kafka открывается для хост-приложений через порт 29092, но на самом деле она работает с портом 9092 в контейнерной среде, настроенной с помощью свойства KAFKA_ADVERTISED_LISTENERS.
Запуск сервера Kafka
Давайте запустим сервер Kafka, развернув контейнеры с помощью команды docker-compose:
$ docker-compose up -dCreating network"kafka_default"with the default driverCreating kafka_zookeeper_1 ...doneCreating kafka_kafka_1 ...done
Теперь давайте воспользуемся командой nc, которая позволит нам убедиться в том, что оба сервера прослушивают правильные порты:
$ nc -zv localhost 22181Connection to localhost port 22181 [tcp/*] succeeded!$ nc -zv localhost 29092Connection to localhost port 29092 [tcp/*] succeeded!
Кроме того, во время запуска контейнеров мы можем проверить и логии, а также убедиться в том, что сервер Kafka работает должным образом:
$ docker-compose logs kafka | grep -i startedkafka_1 | [2024-02-26 16:06:27,352] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)kafka_1 | [2024-02-26 16:06:27,354] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)kafka_1 | [2024-02-26 16:06:27,365] INFO [KafkaServerid=1] started (kafka.server.KafkaServer)
Итак, мы успешно установили Kafka и можем приступать к работе.
Подключение с помощью Kafka Tool
Наконец, для того, чтобы установить соединение с нашим только что созданным сервером Kafka, давайте воспользуемся утилитой Kafka Tool . Чуть позже мы визуализируем эту настройку:
В частности нам понадобится специальное свойство Bootstrap подключаться к серверу Kafka, прослушивающему порт 29092 с хост-машины.
Наконец, мы должны иметь возможность визуализировать соединение:
Записи для тем и консюмеров пусты, так как это совершенно новая настройка. Как только у нас появится несколько тем, мы сможем визуализировать данные по разделам. Более того, если к нашему серверу Kafka подключатся консюмеры, мы сможем просмотреть и их данные.
Настройка кластера Kafka
Для создания более стабильной среды нам понадобится более сложная настройка. Поэтому давайте расширим наш файл docker-compose.yml для создания многоузлового кластера Kafka.
Настройка docker-compose.yml
Кластерная установка для Apache Kafka должна иметь избыточность как для серверов Zookeeper, так и для серверов Kafka.
Поэтому давайте добавим конфигурацию еще одного узла для служб Zookeeper и Kafka:
$ cat docker-compose.yml
---
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:7.4.4
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:7.4.4
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:7.4.4
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:7.4.4
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1Важно убедиться в том, что имена сервисов и KAFKA_BROKER_ID уникальны для всех сервисов.
Более того, каждый сервис должен открывать уникальный порт для хост-машины. Хотя zookeeper-1 и zookeeper-2 слушают порт 2181, они открывают его хосту через порты 22181 и 32181, соответственно. Та же логика применима к службам kafka-1 и kafka-2, которые прослушивают порты 29092 и 39092 соответственно.
Запуск кластера Kafka
Давайте запустим кластер с помощью команды docker-compose:
$ docker-compose up -dCreating network"kafka_default"with the default driverCreating kafka_zookeeper-1_1 ...doneCreating kafka_zookeeper-2_1 ...doneCreating kafka_kafka-2_1 ...doneCreating kafka_kafka-1_1 ...done
Как только кластер будет запущен, воспользуйтесь инструментом Kafka Tool для подключения к кластеру и укажите разделенные запятыми значения для серверов Kafka и соответствующих портов:
Наконец, давайте посмотрим на несколько узлов брокера, доступных в кластере:
Заключение
В этой статье для создания одноузловой и многоузловой конфигураций Apache Kafka мы использовали технологию Docker, а для подключения и визуализации деталей настроенного сервера-брокера - инструмент Kafka Tool.








