본문 바로가기

DevOps/Kafka

[Docker] Docker로 Kafka 구성하기 - 컴도리돌이

728x90
728x90

이전 포스팅에서 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의 내부 동작 원리와 설정 값을 조정하여 다양한 요구 사항을 맞게 확장할 수 있습니다. 

728x90
728x90