Kafka를 운영 환경에서 사용하다 보면 단일 브로커 구조로는 부족할 때가 많습니다. 이럴 땐 멀티 브로커(Multi-Broker) 구성이 필요합니다. 이 글에서는 Zookeeper + Kafka 3브로커 + Kafka UI를 Docker Compose 하나로 구성하는 방법을 정리해보겠습니다.
기본 구성 설명 이번 예제에서는 총 5개의 컨테이너를 구성합니다.
서비스명 설명 zookeeper-0 Kafka 클러스터를 관리하는 Zookeeper 인스턴스 kafka-0 첫 번째 Kafka 브로커 kafka-1 두 번째 Kafka 브로커 kafka-2 세 번째 Kafka 브로커 kafka-ui Kafka 상태를 시각화하는 Kafka UI
docker-compose.yml 상세 설명 아래는 전체 docker-compose.yml 내용이며, 각 설정의 의미를 하나씩 설명하겠습니다.
1. Zookeeper 설정 Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL services:
zookeeper-0:
image: bitnami/zookeeper:3.8
container_name: zookeeper-0
ports:
- 2181:2181 # Zookeeper 클라이언트 포트
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
Kafka는 기본적으로 Zookeeper를 통해 클러스터 구성을 관리합니다.
익명 로그인을 허용(ALLOW_ANONYMOUS_LOGIN=yes)하여 간편하게 테스트할 수 있도록 합니다.
2. Kafka 브로커 설정 (3개 브로커) 브로커는 총 3개(kafka-0, kafka-1, kafka-2)를 구성합니다. 각 브로커는 고유한 BROKER_ID를 가져야 하며, 외부 접근이 가능하도록 EXTERNAL 리스너를 지정합니다.
kafka-0 Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL kafka-0:
image: bitnami/kafka:3.5
container_name: kafka-0
ports:
- 9094:9094
environment:
- KAFKA_BROKER_ID=0
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:9092,EXTERNAL://localhost:9094
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-0:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
내부 통신은 PLAINTEXT://kafka-0:9092, 외부 접속은 EXTERNAL://localhost:9094로 설정합니다.
KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT는 브로커 간 통신에 사용할 리스너를 지정합니다.
kafka-1, kafka-2 설정도 동일한 원리입니다. kafka-1: 내부 포트 9093, 외부 포트 9095 kafka-2: 내부 포트 9094, 외부 포트 9096 각각 브로커 ID는 1, 2로 다르게 설정해야 클러스터가 제대로 구성됩니다.
3. Kafka UI 설정 Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
depends_on:
- kafka-0
- kafka-1
- kafka-2
ports:
- 9988:8080
environment:
- KAFKA_CLUSTERS_0_NAME=local
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9092,kafka-1:9093,kafka-2:9094
provectuslabs/kafka-ui는 Kafka를 시각적으로 모니터링할 수 있게 해주는 편리한 도구입니다.
브라우저에서 http://localhost:9988로 접속하면, topic/consumer group/메시지 흐름을 쉽게 확인할 수 있습니다.
실행 방법 docker-compose.yml 파일을 작성합니다.
터미널에서 다음 명령어로 컨테이너를 실행합니다
Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL docker-compose up -d
Kafka UI 접속:
브라우저에서 http://localhost:9988 로 접속 각 브로커가 잘 연결되어 있는지 확인
Docker확인
추가 팁 멀티 브로커 구성을 테스트할 땐 토픽 생성 시 replication factor를 2 이상으로 설정해보세요. 클러스터로 작동하는지 확인하려면 메시지를 하나의 브로커에 보내고, 다른 브로커에서 확인할 수 있는지도 테스트하면 좋습니다. EXTERNAL://localhost:9094 설정은 로컬 개발에 맞춰져 있으므로, 실제 운영 환경에서는 도메인/IP를 변경해야 합니다.
종료 및 정리 테스트 후 리소스를 정리하려면 아래 명령어를 사용하세요
Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL docker-compose down
마무리 이렇게 간단한 설정으로도 Kafka 클러스터를 도커 환경에서 쉽게 구성할 수 있습니다. 실제 운영 전 테스트나 개발 환경 구성에 딱 좋습니다. Kafka UI까지 연동해두면 모니터링도 훨씬 수월하니 꼭 함께 구성해보세요!
전체설정파일 Plain Bash C++ C# CSS Diff HTML/XML Java JavaScript Markdown PHP Python Ruby SQL services:
zookeeper-0:
image: bitnami/zookeeper:3.8
container_name: zookeeper-0
ports:
- 2181:2181 # Zookeeper의 클라이언트 포트
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka-0:
image: bitnami/kafka:3.5
container_name: kafka-0
ports:
- 9094:9094 # 외부에서 접근 가능한 Kafka 포트
environment:
- KAFKA_BROKER_ID=0
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:9092,EXTERNAL://localhost:9094
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-0:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
depends_on:
- zookeeper-0
kafka-1:
image: bitnami/kafka:3.5
container_name: kafka-1
ports:
- 9095:9095 # 외부에서 접근 가능한 Kafka 포트
environment:
- KAFKA_BROKER_ID=1
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9093,EXTERNAL://:9095
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-1:9093,EXTERNAL://localhost:9095
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-0:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
depends_on:
- zookeeper-0
kafka-2:
image: bitnami/kafka:3.5
container_name: kafka-2
ports:
- 9096:9096 # 외부에서 접근 가능한 Kafka 포트
environment:
- KAFKA_BROKER_ID=2
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9094,EXTERNAL://:9096
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-2:9094,EXTERNAL://localhost:9096
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-0:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
depends_on:
- zookeeper-0
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
depends_on:
- kafka-0 # kafka-0 서비스에 의존
- kafka-1 # kafka-1 서비스에 의존
- kafka-2 # kafka-2 서비스에 의존
ports:
- 9988:8080 # Kafka UI에 접근 가능한 포트
environment:
- KAFKA_CLUSTERS_0_NAME=local # Kafka 클러스터 이름
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9092,kafka-1:9093,kafka-2:9094 # Kafka 클러스터의 부트스트랩 서버
댓글