[Docker] Docker에서 Kafka 실행하기 와 다른 Docker Container 간 통신 에서 단일 kafka broker 설정을 통해 kafka를 실행하였습니다.
이번에는 멀티 kafka broker 설정을 통해 kafka를 실행하는 방법을 알아보도록 하겠습니다.
단일 broker kafka는 아래와 같이 설정하였습니다.
version: "3"
volumes:
kafka_data:
driver: local
services:
kafka:
image: 'bitnami/kafka:3.6.1'
ports:
- '9092:9092'
environment:
- KAFKA_CFG_NODE_ID=0
#- KAFKA_CFG_BROKER_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
volumes:
- "kafka_data:/bitnami/kafka"
Kafka 클러스터의 배포 모드(기존 Zookeeper 기반 또는 최신 KRaft 모드)에 따라 각각 KAFKA_CFG_BROKER_ID 또는 KAFKA_CFG_NODE_ID를 사용해줍니다.
KAFKA_CFG_BROKER_ID: 이 환경 변수는 전통적으로 Kafka 클러스터 내의 Kafka 브로커에 대한 고유 식별자를 설정하는 데 사용됩니다. 클러스터에서 각 Kafka 브로커에는 다른 브로커와 구별하기 위해 고유한 Broker.id가 있어야 합니다. 이 ID는 클러스터 관리, 주제 파티션 할당 및 브로커 간의 리더십 선택에 중요합니다.
KAFKA_CFG_NODE_ID: 이 환경 변수는 최신 버전이며 KIP-500의 일부로 Kafka 2.8에 도입된 Kafka의 KRaft(Kafka Raft Metadata 모드)와 특히 관련이 있습니다. KRaft 모드에서 Kafka는 클러스터 메타데이터 관리를 위해 Zookeeper에 대한 종속성을 제거하는 것을 목표로 합니다. KAFKA_CFG_NODE_ID는 KRaft 모드에서 실행되는 Kafka 클러스터 내의 노드(브로커 또는 컨트롤러)에 대한 고유 식별자 역할을 합니다. 기본적으로 Zookeeper를 사용하지 않는 클러스터의 broker.id를 대체합니다.
docker compose 파일을 아래와 같이 수정해줍니다.
version: "3.5"
networks:
shared_network:
name: my_network
driver: bridge
volumes:
kafka_data0:
driver: local
kafka_data1:
driver: local
kafka_data2:
driver: local
services:
kafka0:
image: 'bitnami/kafka:3.6.1'
ports:
- '10000:9094'
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=0
- KAFKA_KRAFT_CLUSTER_ID=HsDBs9l6UUmQq7Y5E6bNlw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka0:9093,1@kafka1:9093,2@kafka2:9093
- KAFKA_CFG_PROCESS_ROLES=controller,broker
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka0:9092,EXTERNAL://127.0.0.1:10000
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=2
volumes:
- "kafka_data0:/bitnami/kafka"
networks:
- shared_network
kafka1:
image: 'bitnami/kafka:3.6.1'
ports:
- '10001:9094'
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=1
- KAFKA_KRAFT_CLUSTER_ID=HsDBs9l6UUmQq7Y5E6bNlw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka0:9093,1@kafka1:9093,2@kafka2:9093
- KAFKA_CFG_PROCESS_ROLES=controller,broker
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092,EXTERNAL://127.0.0.1:10001
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=2
volumes:
- "kafka_data1:/bitnami/kafka"
networks:
- shared_network
kafka2:
image: 'bitnami/kafka:3.6.1'
ports:
- '10002:9094'
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=2
- KAFKA_KRAFT_CLUSTER_ID=HsDBs9l6UUmQq7Y5E6bNlw
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka0:9093,1@kafka1:9093,2@kafka2:9093
- KAFKA_CFG_PROCESS_ROLES=controller,broker
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka2:9092,EXTERNAL://127.0.0.1:10002
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
- KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=2
volumes:
- "kafka_data2:/bitnami/kafka"
networks:
- shared_network
KAFKA_CFG_ 로 시작하는 모든 환경 변수는 해당 Apache Kafka 키에 맵핑됩니다. 예를 들어, auto.create.topics.enable을 구성하려면 KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE을 사용하면 됩니다.
KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=2 : 자동 생성되는 topic의 replication factor를 2으로 설정합니다.
참고자료
https://github.com/ArminShoeibi/KafkaDockerCompose/blob/main/docker-compose-cluster.yml
https://breezymind.com/silicon-mac-kafka-cluster-docker-compose/
https://hub.docker.com/r/bitnami/kafka
https://devocean.sk.com/blog/techBoardDetail.do?ID=164016
https://kafka.apache.org/documentation/#brokerconfigs_min.insync.replicas
'개발 > Docker' 카테고리의 다른 글
[Docker] container별 메모리 사용량 확인 방법 (0) | 2024.02.28 |
---|---|
[Docker] [Spring Boot] [Kafka] [ELK] 다른 Docker Container 간 통신 (0) | 2024.02.14 |
[Docker] Docker에서 Kafka 실행하기 (0) | 2024.02.13 |
[Docker] Dockerfile와 docker compose 파일의 차이 (1) | 2024.02.13 |
[Docker] elasticsearch exited with code 137 에러 해결 (0) | 2024.01.23 |