[컴] kafka listner 가 network 외부에 존재하는 경우, kafka 의 설정

카프카 설정 / 리스너 / listener config / configuration / 리스너 설정

kafka listner 가 network 외부에 존재하는 경우, kafka 의 설정

kafka client 의 시작시 동작

kafka client 는 kafka 에 대한 설정값을 가지고 있다. 그래서 어느 host/port 에 request 를 할 지 알고 있다.

kafka client 는 시작할 때, 어떤 broker 가 그 partition 의 leader 인지를 알려달라는 metadata 를 요청한다. 이것에 대한 대답은 아무 broker 에서 가능하다.

return되는 metadata 는 그 partition 의 Leader broker 의 위치를 알려준다. 그러면 client 는 broker 에 연결해서 data 를 read/write 하기위해 그 endpoint 들을 이용하게 된다.

  • listeners는 kafka 가 어디에 bind 할 것인지를 알려주는 설정값이라 보면 되고,
  • advertised.listeners 는 외부 kafka client 가 어떻게 broker 에 연결될 수 있는지를 알려주는 값이라고 보면 된다.
  • inter.broker.listener.name 은 kafka broker들이 broker들끼리 통신할 때 어떤 broker 를 사용할지를 정해주는 값이다.

내부, 외부에서 같은 이름으로 접근할 수 있다면

만약 내부에서도, 외부에서도 같은 host 로 접근이 가능한 상태라면, 아래처럼 설정을 할 수 있다. 아래를 보면 대충 알 수 있겠지만, PLAINTEXT는 protocol 이 아니라 listener name 이다.

이 글을 보면, PLAINTEXT 는 secure protocol 중에 그냥 아무런 encrypt 도 안하고 보내는 protocol 을 이야기 한다고 한다.

  • https://github.com/apache/kafka/blob/trunk/config/kraft/broker.properties#L32
  • listeners = listener_name://host_name:port
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://mylocalexternal.mine.com:9092
inter.broker.listener.name=PLAINTEXT

만약 외부, 내부에서 접근할 수 있는 host 가 다르다면

만약 외부에서 접근할 수 있는 host(또는 ip address) 가 내부에서 접근할 수 있는 host/ip 와 다르다면, 당연한 이야기겠지만, 양쪽을 다 적어줘야 한다. 그래서 다음처럼 내부(internal), 외부(external) 에 대한 설정을 해줘야 한다.

listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=INTERNAL://mylocal.com:19092,EXTERNAL://myexternal.mine.com:9092
inter.broker.listener.name=INTERNAL
  • advertised.listeners : kafka client 가 내부(INTERNAL) 에서는 mylocal.com:19092 에 접속하고, 외부(EXTERNAL) 에서는 myexternal.mine.com:9092 에 접속을 시도하게 된다.
  • listeners : kafka 는 다음 2개의 listener 를 만든다.
    • 내부: INTERNAL://0.0.0.0:19092
    • 외부: EXTERNAL://0.0.0.0:9092

참고: Kafka Listeners :: Kafka Tutorial : 링크의 그림참고

docker compose.yml

# compose.yml
version: '3'

# https://hub.docker.com/r/bitnami/kafka 
# --> Apache Kafka development setup example

networks:
  app-tier:
    driver: bridge

services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
      - app-tier
  kafka:
    # https://hub.docker.com/r/bitnami/kafka
    image: 'bitnami/kafka:latest'
    # hostname: kafkah0
    container_name: kafka0
    ports:
      - '9092:9092'
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_LISTENERS=INTERNAL://:9094,OUTSIDE://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka0:9094,OUTSIDE://127.0.0.1:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
    depends_on:
      - zookeeper
    networks:
      - app-tier
  kafka-ui:
    image: provectuslabs/kafka-ui
    container_name: kafka-ui-0
    ports:
      - "8980:8080"
    # restart: always
    environment:
      - KAFKA_CLUSTERS_0_NAME=local
      # connect using INTERNAL
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka0:9094
      - KAFKA_CLUSTERS_0_READONLY=true
    depends_on:
      - kafka
    networks:
      - app-tier

See Also

  1. 쿠…sal: [컴] kafka 특징
  2. 쿠…sal: [컴] kafka 설치하기
  3. 쿠...sal: [컴] kafka 개발용, docker

Reference

  1. Kafka Listeners - Explained

댓글 없음:

댓글 쓰기