[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