본문 바로가기
AMQP/Kafka

KRaft 사용하여 Kafka 컨테이너 띄우기

by Bill Lab 2025. 3. 7.
728x90

1. KRaft 란?

    : Kafka 의 기존 외부 의존성을 제거하고 Kafka 자체적으로 metadata 를 관리하기 위해 개발 됨

     (기존에는 ZooKeeper 서버에 접속하여 관리하는 구조로써, ZooKeeper 를 대신하여 사용)

 

Confluent 공식 사이트

 

2. 왜 사용해야 할까?

KRaft는 2021년 아파치 Kafka 2.8 버전과 같이 공개되었으며, Apache Kafka 3.7 버전이 Zookeeper 모드를 지원하는 마지막 버전이고, 이후 Kafka 4.0 버전의 경우는 KRaft 모드로만 사용 가능

 

3. 사용방법

     : KRaft 모드를 사용하려면 주키퍼가 필요 없으며, 대신 Kafka의 자체 메타데이터 관리와 컨트롤러가 처리

 

4. Quorum

     : 분산 시스템에서 결정을 내리거나 작업을 수행하기 위한 최소한의 참여자 수 이며, 리더와 팔로워의 동기화, 컨트롤러의 결정 등에 중요한 역할을 하며, 이는 시스템의 일관성과 가용성을 보장하는 데 필요

      (KAFKA_CONTROLLER_QUORUM_VOTERS 필드로 핸들링 가능)

 

5. 주요 옵션

     - KAFKA_PROCESS_ROLES: 'broker,controller'

        : Kafka 노드가 broker와 controller 역할을 동시처리 

         (KRaft 모드에서 모든 Kafka 노드는 컨트롤러 역할)

     

     - KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:29093,2@kafka-2:29093,3@kafka-3:29093

        : KRaft 모드에서 컨트롤러의 quorum을 설정하는 데 사용

   

     - KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

        : Kafka 브로커들이 서로 통신하는 내부 리스너의 이름을 설정

 

     - KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER

       : Kafka가 컨트롤러와 통신하는 리스너의 이름을 설정

 

 

6. Docker Compose file

services:
  kafka-1:
    container_name: kafka-1
    image: confluentinc/cp-kafka:latest
    ports:
      - "9092:9092"
    volumes:
      - ./data/kafka-1:/var/lib/kafka/data
    networks:
      - kafka-net
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:29092,EXTERNAL://localhost:9092
      KAFKA_LISTENERS: INTERNAL://:29092,CONTROLLER://:29093,EXTERNAL://0.0.0.0:9092
      KAFKA_PROCESS_ROLES: "broker,controller"
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:29093,2@kafka-2:29094,3@kafka-3:29095
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      CLUSTER_ID: "clusterid"

  kafka-2:
    container_name: kafka-2
    image: confluentinc/cp-kafka:latest
    ports:
      - "9093:9093"
    volumes:
      - ./data/kafka-2:/var/lib/kafka/data
    networks:
      - kafka-net
    environment:
      KAFKA_NODE_ID: 2
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:29093,EXTERNAL://localhost:9093
      KAFKA_LISTENERS: INTERNAL://:29093,CONTROLLER://kafka-2:29094,EXTERNAL://0.0.0.0:9093
      KAFKA_PROCESS_ROLES: "broker,controller"
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:29093,2@kafka-2:29094,3@kafka-3:29095
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      CLUSTER_ID: "clusterid"

  kafka-3:
    container_name: kafka-3
    image: confluentinc/cp-kafka:latest
    ports:
      - "9094:9094"
    volumes:
      - ./data/kafka-3:/var/lib/kafka/data
    networks:
      - kafka-net
    environment:
      KAFKA_NODE_ID: 3
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:29094,EXTERNAL://localhost:9094
      KAFKA_LISTENERS: INTERNAL://:29094,CONTROLLER://kafka-3:29095,EXTERNAL://0.0.0.0:9094
      KAFKA_PROCESS_ROLES: "broker,controller"
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:29093,2@kafka-2:29094,3@kafka-3:29095
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      CLUSTER_ID: "clusterid"

networks:
  kafka-net:
    driver: bridge

 

파일명을 : docker-compose-kraft.yml 로 했을 시

아래 명령어를 입력하면 실행된다! (로컬 환경 기준)

 

docker-compose -f docker-compose-kraft.yml up -d

 

다음에는 두개의 동일한 이미지를 Zookeeper 사용 시와 KRaft 사용 시 부하 테스트를 실시했을때 어떤 성능차이를 보이는지 테스트 해볼 예정

728x90