이번 포스트에서는 로컬 컨테이너로 띄운 kafka-ui와 호스트머신에서 springboot로 띄웠을때 둘다 kafka-broker에 붙는 예시를 구성했습니다
kraft 모드는 zookeeper가 없는 kafka cluster 구성입니다
kafka-ui는 docker bridge 네트워크를 구성해서 dns로 통신이 가능한 상태인데, springboot에서는 localhost로 붙어도 broker를 찾지 못한다는 이슈가 발생합니다.
docker compose로 kafka를 띄웁니다
docker-compose.yml
version: "3.8"
services:
kafka1:
container_name: "kafka1"
image: bitnami/kafka:latest
ports:
- "9092:9092" # PLAINTEXT 리스너용
- "9094:9094" # EXTERNAL 리스너용
environment:
- KAFKA_CFG_NODE_ID=1
- KAFKA_KRAFT_CLUSTER_ID=ZDUxMWEzZjktZDFiMS00MjAzLWJkODEtOThmMjYzOGQwYTk5
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092,EXTERNAL://localhost:9094
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
volumes:
- ./data:/bitnami/kafka
kafka-ui:
container_name: kafka-ui
hostname: kafka-ui
image: provectuslabs/kafka-ui
ports:
- "8989:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka1:9092
DYNAMIC_CONFIG_ENABLED: 'true'
depends_on:
- kafka1
application.yml
spring:
application:
name: kafka-cluster
kafka:
bootstrap-servers: localhost:9094
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
출처: https://www.confluent.io/ko-kr/blog/kafka-listeners-explained/
참고:
이미지: https://www.confluent.io/ko-kr/blog/kafka-listeners-explained/
환경변수
KAFKA_CFG_LISTENERS와 KAFKA_CFG_ADVERTISED_LISTENERS
KAFKA_CFG_LISTENERS
카프카에서 리스너를 구성하는데 사용됩니다. 이를 통해 클라이언트가 kafka 브로커에 연결할 수 있는 네트워크 인터페이스, 포트, 프로토콜을 지정할 수 있습니다.
기본값은 0.0.0.0이며 모든 네트워크 인터페이스에서 수신 대기함을 의미합니다.
KAFKA_CFG_ADVERTISED_LISTENERS
클라이언트가 카프카 브로커에 연결할 때 사용해야 하는 네트워크 인터페이스와 주소를 나타냅니다.
리스너 유형
PLAINTEXT, EXTERNAL, CONTROLLER
PLAINTEXT
암호화되지 않은 통신을 위한 기본 리스너입니다.
EXTERNAL
외부 클라이언트가 브로커에 접근할 수 있도록 설정된 리스너
CONTROLLER
카프카 컨트롤러간 통신에 사용되며, 클러스터 내의 메타데이터 관리와 같은 내부 작업을 위해 사용합니다.
KAFKA_CFG_LISTENERS는 카프카에서 리스너를 구성해놓고, KAFKA_CFG_ADVERTISED_LISTENERS에 리스너를 열어주지 않으면 클라이언트에서 접근이 되지 않습니다.
kafka-ui는 kafka broker와 동일 bridge network를 공유하기 때문에 dns명과 내부 포트로 연결할 수 있습니다.
springboot에서는 KAFKA_CFG_LISTENERS, KAFKA_CFG_ADVERTISED_LISTENERS에 EXTERNAL로 오픈한 host,port로 접근할수 있습니다.
PLAINTEXT vs CONTROLLER vs EXTERNAL:
- (PLAINTEXT): 주로 데이터 처리 및 브로커 간 통신
- (CONTROLLER): 클러스터 관리 및 컨트롤 플레인 통신
- (EXTERNAL): 외부 클라이언트와의 통신
KAFKA_KRAFT_CLUSTER_ID
- 이 환경 변수는 KRaft 모드에서 Kafka 클러스터의 고유 식별자를 설정합니다. 이 값은 클러스터를 처음 구성할 때 생성되며, 클러스터 내의 모든 노드(브로커)가 동일한 값을 공유해야 합니다. 일반적으로 UUID 형식을 사용합니다.
- KRaft 모드에서는 Zookeeper 대신 이 클러스터 ID를 사용하여 클러스터 내의 브로커들을 식별하고 조정합니다.
KAFKA_CFG_PROCESS_ROLES
- Kafka 브로커가 KRaft 모드에서 수행할 역할을 정의합니다. 가능한 값은
broker
,controller
, 또는 둘 다를 포함하는broker,controller
입니다. broker
는 표준 메시징 서비스를 제공하는 역할을 하며,controller
는 클러스터의 메타데이터(예: 토픽, 파티션 정보)를 관리하는 역할을 합니다. 하나의 클러스터 내에서 몇몇 브로커는controller
역할도 겸할 수 있습니다.
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS
- 이 환경 변수는 KRaft 모드에서
controller
역할을 수행하는 브로커들의 목록을 정의합니다. 이 설정은 클러스터 내에서 메타데이터를 관리하는 데 사용되는 내부 컨트롤러 퀴럼의 구성을 지정합니다. - 값은
node_id@host:port
형식의 목록으로, 여기서node_id
는 브로커의 고유 ID이며,host:port
는 해당 브로커의 컨트롤러 리스너 주소입니다. 컨트롤러 브로커들 간의 결정과 메타데이터 관리를 위한 통신에 사용됩니다.
KRaft 모드는 Apache Kafka 2.8 버전부터 실험적으로 도입되었으며, Zookeeper 의존성을 제거하여 Kafka 클러스터의 운영을 단순화하는 것을 목표로 합니다. 이 모드에서는 Kafka 자체가 메타데이터 관리 및 클러스터 조정 역할을 수행하게 됩니다.
연동
- kafka-ui로 broker에 붙는경우 같은 도커 네트워크를 공유하기 때문에 dns랑 내부포트로 붙습니다
- 로컬머신에서 springboot로 붙는경우 localhost:externalPort로 붙습니다
'kafka' 카테고리의 다른 글
kafka consumer lag으로 kafka consumer auto scaling하기 (0) | 2024.08.21 |
---|