1. Обзор
Docker — один из самых популярных контейнерных движков, используемых в индустрии программного обеспечения для создания, упаковки и развертывания приложений.
В этом руководстве мы узнаем, как настроить Apache Kafka с помощью Docker.
2. Настройка одного узла
Настройка брокера Kafka с одним узлом удовлетворит большинство потребностей локальной разработки , поэтому давайте начнем с изучения этой простой настройки.
2.1. docker-compose.yml
Конфигурация
Чтобы запустить сервер Apache Kafka, нам сначала нужно запустить сервер Zookeeper .
Мы можем настроить эту зависимость в файле docker-compose.yml
, что гарантирует, что сервер Zookeeper всегда будет запускаться раньше сервера Kafka и останавливаться после него.
Давайте создадим простой файл docker-compose.yml
с двумя сервисами, а именно zookeeper
и kafka
:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
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
.
2.2. Запустите сервер Кафка
Давайте запустим сервер Kafka, запустив контейнеры с помощью команды docker-compose
:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1 ... done
Теперь воспользуемся командой nc
, чтобы убедиться, что оба сервера прослушивают соответствующие порты :
$ nc -z localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -z localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!
Кроме того, мы также можем проверить подробные журналы во время запуска контейнеров и убедиться, что сервер Kafka работает:
$ docker-compose logs kafka | grep -i started
kafka_1 | [2021-04-10 22:57:40,413] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1 | [2021-04-10 22:57:40,418] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1 | [2021-04-10 22:57:40,447] INFO [SocketServer brokerId=1] Started data-plane acceptor and processor(s) for endpoint : ListenerName(PLAINTEXT) (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,448] INFO [SocketServer brokerId=1] Started socket server acceptors and processors (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,458] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
После этого наша установка Kafka готова к использованию.
2.3. Подключение с помощью инструмента Kafka
Наконец, давайте воспользуемся графической утилитой Kafka Tool , чтобы установить соединение с нашим недавно созданным сервером Kafka , а позже мы визуализируем эту настройку:
Мы должны отметить, что нам нужно использовать свойство серверов Bootstrap
для подключения к серверу Kafka, прослушивающему порт 29092
для хост-компьютера.
Наконец, мы должны визуализировать соединение на левой боковой панели:
Таким образом, записи для тем и потребителей пусты, потому что это новая настройка. После создания тем мы должны иметь возможность визуализировать данные по разделам. Более того, если к нашему серверу Kafka подключены активные потребители, мы также можем просмотреть их данные.
3. Настройка кластера Kafka
Для более стабильной среды нам понадобится устойчивая установка. Давайте расширим наш файл docker-compose.yml
, чтобы создать установку кластера Kafka с несколькими узлами.
3.1. docker-compose.yml
Конфигурация
Настройка кластера для Apache Kafka должна иметь избыточность как для серверов Zookeeper, так и для серверов Kafka.
Итак, добавим конфигурацию еще по одной ноде для сервисов Zookeeper и Kafka:
---
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
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:latest
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
соответственно.
3.2. Запустите кластер Kafka
Давайте раскрутим кластер с помощью команды docker-compose
:
$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper-1_1 ... done
Creating kafka_zookeeper-2_1 ... done
Creating kafka_kafka-2_1 ... done
Creating kafka_kafka-1_1 ... done
Когда кластер запущен, давайте воспользуемся Kafka Tool для подключения к кластеру, указав через запятую значения для серверов Kafka и соответствующих портов:
Наконец, давайте взглянем на несколько узлов брокера, доступных в кластере:
4. Вывод
В этой статье мы использовали технологию Docker для создания одноузловых и многоузловых установок Apache Kafka.
Мы также использовали Kafka Tool для подключения и визуализации сведений о настроенном сервере брокера.