Docker 환경에서 Kafka와 Nifi를 연결해야 하는 상황이 있었습니다.
같은 Docker 네트워크 환경이 아니라 각기 다른 VM위에 Docker에 설치된 Kafka와 Nifi였습니다.
VM들은 네트워크 동일 서브넷에 위치한 동일 네트워크 환경이었지만, 각자의 Docker에 위치하였고, Nifi 쪽에서 Kafka와 연결하지 못한 상황이 발생하여 해결한 경험과 함께 이번에 알게된 kafka config 중 listeners, advertised.listeners 에 대하여 같이 기록하고자 합니다.
- VM1(kafka) IP : 10.10.10.2
- VM2(nifi) IP : 10.10.10.3
docker-compose.yml
services:
kafka1:
image: bitnami/kafka:3.6.1
container_name: kafka1
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_ZOOKEEPER_CONNECT: "zookeeper1:2181"
KAFKA_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.2:9092
depends_on:
- zookeeper1
zookeeper1:
image: bitnami/zookeeper:3.8.3
container_name: zookeeper1
ports:
- 2181:2181
environment:
ALLOW_ANONYMOUS_LOGIN: "yes"
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
depends_on:
- kafka1
ports:
- 8080:8080
environment:
- DYNAMIC_CONFIG_ENABLED=true
- KAFKA_CLUSTERS_0_NAME=scenario
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka1:9092
사용한 docker-compose.yml을 위와 같습니다.
docker-compose를 이용하여 kafka를 배포할 때는 환경변수로 config를 설정하였습니다.
listeners vs advertised.listeners
먼저 listerners는 카프카 브로커가 실제로 요청을 수신할 IP와 포트입니다.
저는 Docker Container 환경이기 때문에, kafka의 container_name이 kafka1을 지정하였습니다.
adveriesd.listeners는 카프카 브로커가 외부 클라이언트에게 공개하는 IP와 포트입니다.
제가 처한 환경은 같은 Docker 내부 네트워크 환경이 아니기 때문에 외부 클라이언트와 소통하기 위해서는 VM서버의 IP를 지정해주어야 합니다.
listerners의 경우 카프카 클러스터를 구성할 때 내부적으로 통신하기 위하여 사용하고,
adveriesd.listeners의 경우에는 외부에 위치한 producer, consumer와 통신하기 위하여 사용합니다.
'데이터 엔지니어링' 카테고리의 다른 글
[Airflow] Webserver 속도 개선 (0) | 2024.11.04 |
---|---|
[Trino] id/password 적용하기 (0) | 2024.10.25 |
[PyFlink] 기록 # 2 Iceberg 도입시 Error (1) | 2024.09.21 |
[PyFlink] 기록#1 Dictionary in List 처리 (1) | 2024.08.31 |
[Flink] Flink Architecture (0) | 2024.08.24 |