TokyoAJ

도쿄아재

SPRINGBOOT 2025.04.09

[Kafka] Docker Compose로 Kafka 멀티 브로커 클러스터 구성하기 (+ Kafka UI까지!)

Kafka를 운영 환경에서 사용하다 보면 단일 브로커 구조로는 부족할 때가 많습니다. 이럴 땐 멀티 브로커(Multi-Broker) 구성이 필요합니다. 이 글에서는 Zookeeper + Kafka 3브로커 + Kafka UI를 Docker Compose 하나로 구성하는 방법을 정리해보겠습니다.


기본 구성 설명

이번 예제에서는 총 5개의 컨테이너를 구성합니다.

서비스명설명
zookeeper-0Kafka 클러스터를 관리하는 Zookeeper 인스턴스
kafka-0첫 번째 Kafka 브로커
kafka-1두 번째 Kafka 브로커
kafka-2세 번째 Kafka 브로커
kafka-uiKafka 상태를 시각화하는 Kafka UI


docker-compose.yml 상세 설명

아래는 전체 docker-compose.yml 내용이며, 각 설정의 의미를 하나씩 설명하겠습니다.


1. Zookeeper 설정

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

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 설정도 동일한 원리입니다.

  1. kafka-1: 내부 포트 9093, 외부 포트 9095
  2. kafka-2: 내부 포트 9094, 외부 포트 9096
  3. 각각 브로커 ID는 1, 2로 다르게 설정해야 클러스터가 제대로 구성됩니다.


3. Kafka UI 설정

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 파일을 작성합니다.

터미널에서 다음 명령어로 컨테이너를 실행합니다

docker-compose up -d

Kafka UI 접속:

  1. 브라우저에서 http://localhost:9988 로 접속
  2. 각 브로커가 잘 연결되어 있는지 확인


Docker확인


추가 팁

  1. 멀티 브로커 구성을 테스트할 땐 토픽 생성 시 replication factor를 2 이상으로 설정해보세요.
  2. 클러스터로 작동하는지 확인하려면 메시지를 하나의 브로커에 보내고, 다른 브로커에서 확인할 수 있는지도 테스트하면 좋습니다.
  3. EXTERNAL://localhost:9094 설정은 로컬 개발에 맞춰져 있으므로, 실제 운영 환경에서는 도메인/IP를 변경해야 합니다.


종료 및 정리

테스트 후 리소스를 정리하려면 아래 명령어를 사용하세요

docker-compose down


마무리

이렇게 간단한 설정으로도 Kafka 클러스터를 도커 환경에서 쉽게 구성할 수 있습니다. 실제 운영 전 테스트나 개발 환경 구성에 딱 좋습니다. Kafka UI까지 연동해두면 모니터링도 훨씬 수월하니 꼭 함께 구성해보세요!


전체설정파일

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 클러스터의 부트스트랩 서버


댓글