Kafka

2. Kafka를 위한 도커 컴포즈 파일 설정

초코chip 2024. 10. 23. 10:23

최종본

version: "3.8"
services: 
  kafka-1: 
    image: bitnami/kafka:latest 
    ports:
      - "9092:9092" 
    environment:
      - KAFKA_CFG_NODE_ID=1
      - KAFKA_KRAFT_CLUSTER_ID=dskEtFYwT-yuV3OeubWBFw
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-1:9090,EXTERNAL://${HOSTNAME:-localhost}:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFAK_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
    volumes:
      - /Users/jang-ujin/kafka_study/volumes/server-1:/bitnami/kafka

 

도커 컴포즈 버전

  •  version: "3.8" : 도커 컴포즈의 버전을 명시. 여기서는 3.8을 사용.
  • 도커 컴포즈를 사용하면 여러 컨테이너를 실행하고 목록을 확장할 수 있음

 

서비스 정의

  • services: Kafka 브로커 서비스를 정의하는 부분

 

kafka-1 서비스

  •  kafka-1: 첫 번째 Kafka 브로커의 이름

 

이미지

  • image: bitnami/kafka:latest: 도커 이미지 정의.
    • bitnami에서 제공하는 최신 카프카 이미지를 사용하여 컨테이너를 생성

 

포트 매핑

ports: "9092:9092": 호스트 컴퓨터의 9092 포트를 컨테이너의 9092 포트에 매핑

  • 외부에서 Kafka 브로커에 접근할 수 있도록 설정

 

환경 변수 (Kafka 설정)

  • environment: 컨테이너 내에서 Kafka 서버의 동작을 설정하는 환경 변수들

 

브로커 노드, 클러스터, 컨트롤러 설정

1. KAFKA_CFG_NODE_ID=1

  • 이 브로커의 노드 ID를 1로 설정 ( 글러스터 내에서 유일해야함 )

2. KAFKA_KRAFT_CLUSTER_ID=dskEtFYwT-yuV3OeubWBFw

  • Kafka 클러스터의 ID. 여러 서버가 같은 클러스터에서 동작할 경우 동일한 클러스터 ID 사용

kafka가 설치된 bin폴더에서 해당 명령어로 유일한 클러스터 id를 만들 수 있음

3. KAFKA_CFG_PROCESS_ROLES=controller,broker

  • 이 브로커가 수행할 역할을 지정
  • 컨트롤러(클러스터 조정 및 메타데이터 관리)와 브로커(메시지 처리)를 담당

4. KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9091,2@kafka-2:9091,3@kafka-3:9091

  • 컨트롤러 쿼럼을 담당할 브로커들을 설정
    • 컨트롤러 쿼럼(CONTROLLER_QUORUM): 클러스터의 중앙 조정 역할 수행
      • 클러스터 메타데이터 관리
      • 파티션 리더 선출 및 장애 처리 - 
  • 노드ID + 호스트 이름 + 컨트롤러 간 통신에 사용하는 포트 ( 1@kafka-1:9091 )

 

리스너 설정

1. KAFKA_CFG_LISTENERS=PLAINTEXT://:9090,CONTROLLER://:9091,EXTERNAL://:9092

  • Kafka 브로커가 클라이언트(생산자, 소비자) 및 다른 브로커와 통신할 때 사용하는 네트워크 인터페이스, 포트 번호, 프로토콜을 정의하는 설정
    • 즉, 리스너는 Kafka 브로커가 어떤 포트에서 어떤 방식으로 통신할 것인지를 정의
  • 종류
    • PLAINTEXT://:9090
      • 내부 통신용 리스너로, 암호화되지 않은 일반 텍스트 방식의 통신에 사용
      • 보안이 필요하지 않은 개발 환경이나 브로커 간 통신에 사용
    • CONTROLLER://:9091
      • 컨트롤러 간 통신용 리스너
    • EXTERNAL://:9092
      • 외부 클라이언트(생산자, 소비자)가 Kafka 브로커에 접근할 때 사용하는 리스너 (호스트 포트와 동일)

 

광고 리스너

2. KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-1:9090,EXTERNAL://${HOSTNAME:-localhost}:9092

  • 광고 리스너(Advertised Listeners): Kafka 브로커가 클라이언트와 통신할 때 사용하는 네트워크 엔드포인트를 외부 클라이언트에게 알리는 역할.
    • 광고 리스너는 클라이언트에게 어떤 주소로 이 브로커에 연결할 수 있는지를 알려줌
  • 종류
    • PLAINTEXT://kafka-1:9090
    • EXTERNAL://${HOSTNAME:-localhost}:9092
      • 외부 클라이언트(생산자, 소비자)가 Kafka 브로커에 접근하기 위한 외부 통신 엔드포인트를 정의
      • ${HOSTNAME:-localhost}: 환경 변수를 통해 호스트 이름을 지정. 정의되지 않으면 기본값으로 localhost 사용

.env 파일로 환경 변수를 설정한 모습

    • host.docker.internal:Docker에서 제공하는 특수 DNS 이름으로, Docker 컨테이너가 실행되는 호스트 시스템의 내부 IP 주소
      • Docker 컨테이너 내부에서 host.docker.internal을 사용하면, 이 이름이 자동으로 호스트 컴퓨터의 IP 주소로 변환
      • 이 주소는 Docker 컨테이너 내부에서만 접근 가능

 

    • localhost가 아닌 host.docker.internal을 사용하는가?
      • Docker 컨테이너는 하나의 컴퓨터(호스트 컴퓨터)에서 실행
      • 그러나 중요한 점은, Docker 컨테이너가 호스트 컴퓨터와는 독립적인 환경을 제공
        • 즉, Docker 컨테이너는 호스트 컴퓨터 안에서 돌아가는 작은 가상 컴퓨터
      • 그래서 컨테이너 내부의 localhost컨테이너 자신을 가리키는 것이지, 호스트 컴퓨터를 가리키는 것이 아님
      • 이 때문에, 컨테이너 내부에서 호스트 컴퓨터에 연결하려면 localhost가 아닌 host.docker.internal을 사용해야 합니다.

 

 

 

보안 프로토콜

KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT

  • 각 리스너에 대한 보안 프로토콜을 정의
  • 여기서는 모두 암호화되지 않은 PLAINTEXT 프로토콜 사용
    • 개발 환경에서는 이 설정으로도 문제가 없지만, 실제 배포 환경에서는 보안이 중요한 경우 암호화된 통신 프로토콜(예: SSL)을 사용하는 것이 좋음

 

리스너 이름 설정

1. KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

  • 컨트롤러 리스너의 이름을 CONTROLLER로 설정.

2. KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT

  • 브로커 간 통신에 사용할 리스너 이름을 PLAINTEXT로 설정.

 

도커 컨테이너 볼륨 설정

1. volumes: /Users/jang-ujin/kafka_study/volumes/server-1:/bitnami/kafka

  •  도커 컨테이너의 데이터를 호스트 시스템에 저장.
    • /Users/jang-ujin/kafka_study/volumes/server-1: 호스트 컴퓨터의 디렉토리.
    • /bitnami/kafka: 컨테이너 내에서 Kafka가 데이터를 저장할 디렉토리.
  • 기본적으로 Docker 컨테이너는 임시 파일 시스템을 사용
    • 즉, 컨테이너가 종료되거나 삭제되면 컨테이너 내의 모든 데이터는 소멸
  • 볼륨을 설정함으로써 도커 컨테이너가 삭제되더라도 데이터는 호스트 컴퓨터에 남아있어 데이터 손실을 방지.

'Kafka' 카테고리의 다른 글

1. MSA와 Apache Kafka  (1) 2024.10.19