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 설치
- Docker Desktop을 Windows에 설치
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
- 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 환경에서 최적의 성능과 호환성을 얻을 수 있습니다.
'업무 기록 > ETC' 카테고리의 다른 글
KISA K-Shield Spring 프레임워크 시큐어코딩 SonarQube 소나큐브 (정적 분석 도구, ISMS) (2) | 2025.05.02 |
---|---|
vscode marketplace download extension 버튼 없어짐 : VSIX 없어진 다운로드 버튼?? (2) | 2025.04.11 |
스트랭글러 패턴(Strangler Pattern): 레거시 시스템 현대화의 지혜와 어원 (1) | 2025.04.11 |
웹 애플리케이션에서 특수문자와 유니코드 문자 처리 시 발생하는 XSS 이슈 (0) | 2025.03.31 |
대용량 데이터 처리 방식 과 흐름 (0) | 2025.02.23 |