이전 포스팅에서 Kafka에 대한 이론을 짧게 다뤘습니다. 기존에 설치된 Kafka를 사용해서 Spring boot에서도 연결했지만, 이번에는 도커에서 카프카를 설정하는 방법에 대해 공부하려고 합니다. Kafka 이론에 대해 적은 포스팅은 아래에 첨부해 놨습니다.
[Kafka] Apache Kafka에 대해서 알아보기 - 컴도리돌이
아파치 카프카는 마이크로서비스와 같은 현대적인 아키텍처에서 매우 유용하게 활용되는 오픈소스 메시지 스트리밍 플랫폼입니다. 현재 여러 IT 서비스와 플랫폼에서 표준처럼 사용되고 있지
comdolidol-i.tistory.com
Kafka는 메시지 브로커로, 대규모의 데이터를 처리하는 데 최적화되어 있으며, Zookeeper가 이를 지원합니다. Zookeeper는 Kafka의 클러스터를 관리하고, 브로커 간의 조율 및 메타데이터 저장소 역할을 합니다. 이 작업을 시작하려면 먼저 docker-compose.yml 파일을 작성해야 합니다. 아래는 Kafka와 Zookeeper를 설정하기 위한 docker-compose.yml 파일 코드입니다.
version: '3.8'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.5.0
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:7.5.0
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
depends_on:
- zookeeper
이 설정에서 zookeeper는 Confluent의 Zookeeper 이미지를 기반으로 하며, 기본 포트 2181을 사용합니다. ZOOKEEPER_CLIENT_PORT는 클라이언트 요청을 처리하는 포트를 설정하며, ZOOKEEPER_TICK_TIME은 Zookeeper의 내부 heartbeat 주기를 밀리초 단위로 설정합니다. Kafka 서비스는 Confluent Kafka 이미지를 사용하며, KAFKA_BROKER_ID는 각 브로커를 고유하게 식별하는 ID입니다. KAFKA_ZOOKEEPER_CONNECT는 Zookeeper와 Kafka를 연결하며, KAFKA_LISTENERS는 Kafka가 바인딩될 네트워크 인터페이스를 정의합니다. KAFKA_ADVERTISED_LISTENERS는 클라이언트가 접속할 때 참조하는 주소를 지정하며, KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR는 오프셋 데이터를 복제하는 브로커의 수를 정의합니다. 마지막으로 depends_on은 Kafka 서비스가 Zookeeper에 의존함을 나타냅니다.
이제 docker-compose.yml 파일이 있는 디렉터리로 이동하여, 다음 명령어를 실행하여 컨테이너를 실행시킵니다. 이 명령어는 Zookeeper와 Kafka 컨테이너를 백그라운드에서 실행하며, 상태를 확인하려면 docker-compose ps를 입력하여 컨테이너의 상태를 확인할 수 있습니다.
docker-compose up -d
실행 상태를 확인하려면 다음 명령어를 확인해 주면 돼요.
docker-compose ps
Kafka 설치가 완료되면 동작 여부를 확인하기 위해 간단한 테스트를 진행할 수 있습니다. 먼저 Kafka 컨테이너에 접속하기 위해 다음 명령어를 입력합니다.
docker exec -it kafka bash
그런 다음 테스트용 토픽을 생성해 줍니다.
kafka-topics --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
이 명령은 test-topic이라는 이름의 토픽을 생성하며, 파티션 수는 1이고 복제 계수는 1로 설정합니다. 파티션은 Kafka의 데이터를 분산 처리하기 위한 기본 단위이며, 복제 계수는 데이터 복원력을 보장하기 위해 복제본의 수를 지정합니다.
토픽 생성 후 프로듀서를 실행하여 메시지를 보낼 수 있습니다.
kafka-console-producer --topic test-topic --bootstrap-server localhost:9092
그리도 또 다른 터미널에서 컨슈머를 실행시킵니다.
kafka-console-consumer --topic test-topic --bootstrap-server localhost:9092 --from-beginning
이 명령은 test-topic의 모든 메시지를 처음부터 읽어옵니다. 이렇게 함으로써 메시지가 성공적으로 전송되고 수신되는지 확인할 수 있어요.
이제 프로듀서에서 메시지를 보내 컨슈머에 정상적으로 메시지가 수신되는지 확인해 볼게요. 🤓
정상적으로 수신되는 것까지 확인했네요 👍
실제 운영 환경에서는 replication-fcator를 2 이상으로 설정하고, advertised_listeners를 클러스터 환경에 맞게 조정해야 해요. 또한 다중 브로커 설정이 필요한 경우 docker-compose.yml에 추가 Kafka 서비스를 정의해야 하며, 각 브로커의 broker.id와 포트를 고유하게 설정해야 합니다.
이처럼 Docker Compose를 활용하면 Kafka와 Zookeeper를 손쉽게 설정하고 테스트할 수 있으며, Kafka의 내부 동작 원리와 설정 값을 조정하여 다양한 요구 사항을 맞게 확장할 수 있습니다.