업무 기록/ETC

Windows 환경에서 Kafka와 Docker download및 실행과 테스트

code2772 2025. 4. 25. 14:02
728x90
반응형

 

Windows 환경에서는 Kafka가 기본적으로 Linux/Unix 환경에 최적화되어 있기 때문에, Docker와 WSL을 활용하면 네이티브에 가까운 성능을 얻을 수 있습니다.

 

1. Docker에서 Kafka를 실행하는 이유

Docker를 사용하여 Kafka를 실행하는 데는 여러 가지 중요한 이유가 있습니다:

  • 환경 일관성: Docker는 어떤 환경(개발, 테스트, 프로덕션)에서도 동일한 설정으로 Kafka를 실행할 수 있게 해줍니다.
  • 쉬운 설치: 복잡한 설치 과정 없이 이미지를 내려받아 바로 실행할 수 있습니다.
  • 격리성: Kafka와 의존성 있는 서비스들이 호스트 시스템에 영향을 주지 않습니다.
  • 리소스 효율성: 전체 VM을 사용하는 것보다 적은 리소스로 실행 가능합니다.
  • 빠른 시작/중지: 컨테이너를 빠르게 시작하고 종료할 수 있습니다.
  • 버전 관리: 다양한 버전의 Kafka를 쉽게 테스트할 수 있습니다.

 

2. Kafka와 ZooKeeper 설명

Apache Kafka란?

Apache Kafka는 분산 스트리밍 플랫폼으로, 다음과 같은 특징을 가집니다:

  • 높은 처리량의 실시간 데이터 스트림 처리
  • 내결함성과 확장성이 뛰어난 분산 아키텍처
  • 메시지를 디스크에 저장하여 데이터 손실 방지
  • 생산자(Producer)와 소비자(Consumer) 간의 느슨한 결합
  • 토픽(Topic)과 파티션(Partition) 개념을 통한 병렬 처리 지원

 

ZooKeeper란?

Apache ZooKeeper는 분산 애플리케이션을 위한 조정 서비스로, Kafka의 필수 구성 요소입니다:

  • 브로커(서버) 목록 관리
  • 토픽 구성 정보 관리
  • 클러스터의 리더 선출 처리
  • 브로커 상태 모니터링
  • 컨슈머 그룹의 오프셋 관리(이전 버전에서)

 

설치

docker-compose.yml 파일로 설정하면 따로 Kafka나 ZooKeeper를 직접 다운로드하고 설치할 필요가 없습니다. Docker가 자동으로 필요한 이미지를 다운로드하고 설정합니다.

Kafka Docker 이미지

confluentinc/cp-kafka는 Confluent(Kafka 개발에 중심적인 기업)에서 제공하는 Kafka Docker 이미지로, 다음과 같은 특징이 있습니다:

  • 최적화된 설정으로 사전 구성됨
  • 추가 모니터링 및 관리 도구 포함
  • 엔터프라이즈 환경에서의 사용을 위해 테스트됨
  • 정기적으로 업데이트 및 보안 패치 제공

ZooKeeper Docker 이미지

confluentinc/cp-zookeeper는 Confluent에서 제공하는 ZooKeeper Docker 이미지로, Kafka와 함께 사용하기 위해 최적화되어 있습니다.

3. Kafka 설치 및 설정 단계

Docker Desktop 설치

  1. Docker Desktop을 Windows에 설치

https://www.docker.com/

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

  1. WSL2 통합 기능 활성화
    • Docker Desktop 설정 → Resources → WSL Integration → Ubuntu 활성화

Kafka 환경 구성 (Docker Compose)

docker-compose.yml 파일 생성:

docker-compose.yml 파일로 설정하면 따로 Kafka나 ZooKeeper를 직접 다운로드하고 설치할 필요가 없습니다. Docker가 자동으로 필요한 이미지를 다운로드하고 설정합니다.

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181      # 클라이언트 연결 포트
      ZOOKEEPER_TICK_TIME: 2000        # 기본 시간 단위(밀리초)
    ports:
      - "2181:2181"

  kafka:
    image: confluentinc/cp-kafka:latest
    container_name: kafka
    depends_on:
      - zookeeper                      # ZooKeeper가 먼저 시작되어야 함
    ports:
      - "9092:9092"                    # 외부에서 접근 가능한 포트
    environment:
      KAFKA_BROKER_ID: 1               # 브로커 식별자
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181  # ZooKeeper 연결 정보
      # 두 가지 리스너 설정: 내부(컨테이너 간) 및 외부(호스트에서) 접근용
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1  # 단일 브로커 설정

 

 

 

 

Docker Compose로 컨테이너 실행:

docker-compose up -d

 

컨테이너 실행 확인:

docker ps

 

4. Kafka 기본 사용법

 

토픽(Topic) 관리

토픽 생성

docker exec -it kafka kafka-topics --create --topic test-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1

  • -replication-factor 1: 각 파티션의 복제본 수 (단일 브로커 환경에서는 1)
  • -partitions 1: 토픽의 파티션 수 (병렬 처리 가능 수준)

 

토픽 목록 확인

docker exec -it kafka kafka-topics --list --bootstrap-server localhost:9092

 

토픽 상세 정보 조회

docker exec -it kafka kafka-topics --describe --topic test-topic --bootstrap-server localhost:9092

  • 파티션 수, 복제 설정, 리더 브로커 등의 정보 표시

 

메시지 생산 및 소비

메시지 생산하기 (Producer)

docker exec -it kafka kafka-console-producer --broker-list localhost:9092 --topic test-topic

  • 메시지 입력 후 Enter 키로 전송
  • 각 메시지는 지정된 토픽에 저장됨
  • Ctrl+C로 종료

 

메시지 소비하기 (Consumer)

docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --from-beginning

  • -from-beginning: 토픽의 처음부터 모든 메시지를 읽음
  • 이 옵션이 없으면 소비자가 시작된 이후의 새 메시지만 표시
  • 메시지를 실시간으로 수신하여 표시
  • Ctrl+C로 종료

 

5. 고급 테스트 방법

파티션 테스트

 

여러 파티션이 있는 토픽 생성:

docker exec -it kafka kafka-topics --create --topic partitioned-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1

 

 

키를 지정한 메시지 전송:

docker exec -it kafka kafka-console-producer --broker-list localhost:9092 --topic partitioned-topic --property "parse.key=true" --property "key.separator=:"

  • 메시지 입력 형식: key:value
  • 동일한 키를 가진 메시지는 항상 동일한 파티션으로 전송됨

 

컨슈머 그룹 테스트

여러 터미널에서 같은 그룹 ID로 컨슈머 실행:

# 터미널 1, 2, 3에서 각각 실행
docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic partitioned-topic --group test-group

  • 동일한 그룹의 소비자들은 파티션을 분담하여 메시지 처리
  • 각 파티션은 한 번에 그룹 내 하나의 소비자만 처리 가능

 

컨슈머 그룹 정보 확인:

# 그룹 목록 조회
docker exec -it kafka kafka-consumer-groups --bootstrap-server localhost:9092 --list

# 특정 그룹 상세 정보
docker exec -it kafka kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group test-group

  • 오프셋(읽은 위치), 지연(lag), 파티션 할당 정보 등 확인 가능

 

6. 명령어 분석

docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --from-beginning

  • docker exec: Docker 컨테이너에서 명령어 실행
  • it: 대화형 터미널 모드로 실행 (입력과 출력을 직접 다룸)
  • kafka: 명령을 실행할 컨테이너 이름
  • kafka-console-consumer: Kafka에서 제공하는 콘솔 기반 소비자 도구
  • -bootstrap-server localhost:9092: 연결할 Kafka 브로커 주소
  • -topic test-topic: 메시지를 읽을 토픽 이름
  • -from-beginning: 토픽에 저장된 모든 메시지를 처음부터 읽음

 

7. 종료 및 정리

컨테이너 중지

docker-compose down

  • 컨테이너만 중지하고 제거 (데이터는 볼륨에 유지)

컨테이너 및 볼륨 완전 제거

docker-compose down -v

  • 컨테이너와 관련 볼륨까지 모두 제거 (모든 데이터 삭제)

Kafka와 Docker를 함께 사용하면 복잡한 분산 시스템을 간편하게 설정하고 실행할 수 있으며, 특히 Windows 환경에서 최적의 성능과 호환성을 얻을 수 있습니다.

반응형