최종본
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 사용
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): 클러스터의 중앙 조정 역할 수행
- 클러스터 메타데이터 관리
- 파티션 리더 선출 및 장애 처리 -
- 컨트롤러 쿼럼(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 브로커에 접근할 때 사용하는 리스너 (호스트 포트와 동일)
- PLAINTEXT://:9090
광고 리스너
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 사용
- 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 |
---|