[Kafka] Установка Kafka

ЦЕЛЬ

Установить и сконфигурировать Kafka на ОС Linux.

СПОСОБЫ УСТАНОВКИ

Kafka в данном примере будет развернута в виде Docker-контейнера. Для работы Kafka нам потребуется Zookeeper, который также будет развернут с помощью Docker. Таким образом, получится два контейнера. Существует ряд способов работы с многоконтейнерными системами:

  • Разворачивать и настраивать каждый контейнер отдельно
  • Использовать Kubernetes
  • Использовать Docker-compose

Работать с контейнерами отдельно вручную достаточно неудобно. Использовать Kubernetes в данном случае нет необходимости, т.к. основное преимущество Kubernetes - возможность оркестрации контейнерами, установленными на разных серверах. В данном же случае мы планируем развернуть оба контейнера на одной физической машине, поэтому вполне достаточно будет использовать docker-compose.

PREREQUISITES

Перед началом работы нужно убедиться, что у Вас на машине установлены:

  • Docker
  • Docker-Compose

Для проверки наличия инструментов, можно выполнить в консоли:

docker --version
docker-compose --version

В случае отсутствия какого-то из этих инструментов, их нужно установить (это остается за рамками инструкции)

Создание docker-compose конфигурации

В произвольном месте создадим файл docker-compose.sh со следующим содержимым:

version: '3.3'
volumes:
  zksingle-ksingle_kafka1-data:
  zksingle-ksingle_zoo1-data:
  zksingle-ksingle_zoo1-log:

services:
  zoo1:
    image: confluentinc/cp-zookeeper:6.2.1
    hostname: zoo1
    container_name: zoo1
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_SERVERS: zoo1:2888:3888
    volumes:
      - type: volume
        source: zksingle-ksingle_zoo1-data
        target: /data
      - type: volume
        source: zksingle-ksingle_zoo1-log
        target: /datalog

  kafka1:
    image: confluentinc/cp-kafka:6.2.1
    hostname: kafka1
    user: "appuser:appuser"
    ports:
      - "9092:9092"
      - "9999:9999"
    environment:
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_JMX_PORT: 9999
      KAFKA_JMX_HOSTNAME: ${DOCKER_HOST_IP:-127.0.0.1}
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
    volumes:
      - type: volume
        source: zksingle-ksingle_kafka1-data
        target: /var/lib/kafka/data
    depends_on:
      - zoo1

Разберем основное содержимое файла.

Блок services конфигурирует два нужных нам контейнера:

  • zoo1
  • kafka1

Тег image означает название образа в Docker-хабе

Теги hostname и container_name означают название хоста контейнера и непосредственно имя самого контейнера.

ports задает маппинг внутреннего порта контейнера и порта нашей физической машины, на которой развернут контейнер.

volumes - задает правила, по которым директории в файловой системе контейнера монтируются к папкам в файловой системе хоста.

environment - задает конфигурационные параметры для работы программы (в нашем случае - zookeeper и kafka). Рассмотрим некоторые из них:

  • KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" - определяет, как Кафке приконнектиться к Zookeeper-у, который необходим для ее работы.

  • KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" - настройка, говорящая о том, что топики в Кафке будут создаваться автоматически при первой попытке отправки/получения сообщения.

ЗАПУСК КОНТЕЙНЕРОВ

Из директории с созданным docker-compose.yml, запускаем файл следующей командой:

sudo docker-compose -f docker-compose.yml up -d

Убедимся, что контейнеры действительно запустились. Для этого отобразим список контейнеров:

docker ps -a

Если вы увидите список запущенных контейнеров, значит результат достигнут. Kafka установлена и теперь доступна по адресу localhost:9092

СПРАВКА DOCKER

# Отобразить список образов
docker images

# Отобразить список контейнеров
docker ps -a

# Развернуть контейнеры, описанные в docker-compose.yml.
# Флаг -f используется, чтобы обозначить имя docker-compose файла
# Флаг -d означает запуск в фоновом режиме
sudo docker-compose -f docker-compose.yml up -d

# Остановить и удалить контейнеры и volumes
sudo docker-compose down --volumes

# Удалить все образы
sudo docker images prune

# Войти в файловую систему контейнера 
# (например, под названием kafka_kafka1_1)
docker exec -it kafka_kafka1_1 /bin/sh

# Посмотреть логи контейнера с ID-ом 69f4f804bf48
docker logs 69f4f804bf48