항상 느끼는거지만 ChatGPT에만 의존하면 안되고 구글링 또는 스택오버플로우랑 교차 검증을 해야한다.
그냥 GPT의 yml대로만 하니까 계속 오류만 발생하고 또 GPT에게 묻고 같은 오류가 반복됐다.
GPT가 잘못된 솔루션을 반복할때가 비로소 개발자가 구글링을 통해 문제해결력을 기를 타이밍인가 보다.
먼저 GPT가 알려준 docker-compose.yml을 보자
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka:2.12-2.4.0
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://<kafka-server-ip>:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_LOG_DIRS: /kafka/logs
depends_on:
- zookeeper
GPT가 준 yml을 썼을때 바로 아래와 같은 오류가 발생했다.
ERROR [KafkaApi-1] Number of alive brokers '0' does not meet the required replication factor '1' for the offsets topic (configured via 'offsets.topic.replication.factor'). This error can be ignored if the cluster is starting up and not all brokers are up yet. (kafka.server.KafkaApis)
여기서 KAFKA_ADVERTISED_LISTENERS 이 부분이 문제였다. 실행중인 브로커는 0개 인데 레플리카(복제본)은 1개라는 뜻이다.
원인은 도커 내부적으로는 카프카는 zookeeper와 9092 포트를 통해서 통신하지만 외부적으로도 포트를 노출 시켜야 한다.
그래야만 바깥에 수많은 애플리케이션과도 통신을 할수 있는것이다.
수정된 yml을 확인해보자
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "2181:2181"
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://<kafka-broker-host-ip>:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
내부적으로는 PLAINTEXT://kafka:9092 를 통해서 도커내부 네트워크로 통신을 하고
외부적으로는 PLAINTEXT_HOST://<kafka-broker-host-ip>:29092 포트를 통해 외부와 통신을 해야하는것이다.
오늘의 교훈 GPT를 맹신하지말고 모든 환경변수를 꼼꼼히 따지도록하자 GPT는 디테일에 약하다.