Перейти к содержанию

Руководство по настройке Apache Kafka с помощью Docker

Docker – один из самых популярных контейнерных движков, используемых в индустрии программного обеспечения для создания, упаковки и развертывания приложений.

В этом руководстве узнаем, как настроить Apache Kafka с помощью Docker.

Настройка одного узла (ноды)

Настройка брокера Kafka с одним узлом удовлетворит большинство потребностей локальной разработки, поэтому начнем с изучения этой простой настройки.

Конфигурация 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.

Запуск сервера Kafka

Запустим сервер 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 готова к использованию.

Подключение с помощью Kafka Tool

Наконец, воспользуемся утилитой с графическим интерфейсом Kafka Tool, чтобы установить соединение с недавно созданным сервером Kafka, а позже визуализируем эту настройку:

Следует отметить, что нужно использовать свойство Bootstrap servers для подключения к серверу Kafka, прослушивающему порт 29092 для хост-компьютера.

Наконец, можно визуализировать соединение на левой боковой панели:

Таким образом, записи для топиков и потребителей пусты, потому что это новая настройка. После создания топиков можно визуализировать данные по разделам. Более того, если к серверу Kafka подключены активные потребители, можно просмотреть их данные.

Настройка кластера Kafka

Для более стабильного окружения понадобится устойчивая установка. Расширим файл docker-compose.yml, чтобы создать установку кластера Kafka с несколькими узлами.

Конфигурация 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 соответственно.

Запуск кластера 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 и соответствующих портов:

Наконец, взглянем на несколько узлов брокера, доступных в кластере:

Заключение

В этой статье мы использовали технологию Docker для создания одноузловых и многоузловых установок Apache Kafka.

Мы также использовали Kafka Tool для подключения и визуализации сведений о настроенном сервере брокера.

Оригинал