Apache Kafka를 사용하다 보면 가장 자주 마주치는 에러 중 하나가 바로 “Connection to node -1 could not be established. Broker may not be available” 입니다. 이 에러는 클라이언트가 Kafka 브로커에 연결할 수 없을 때 발생하며, 여러 가지 원인이 있을 수 있습니다.

실제 개발 환경에서 이 문제를 해결하면서 겪었던 경험을 바탕으로, 가장 효과적인 해결 방법들을 단계별로 정리해보겠습니다.

 

1. 에러 발생 원인 분석

이 에러가 발생하는 주요 원인들을 먼저 파악해보겠습니다.

가장 흔한 원인들

원인 설명 발생 빈도
포트 설정 오류 Kafka(9092)와 ZooKeeper(2181) 포트 혼동 매우 높음
listeners 설정 문제 server.properties의 네트워크 설정 오류 높음
JAVA_HOME 미설정 Java 환경변수 경로 문제 중간
브로커 미실행 Kafka 서비스가 제대로 시작되지 않음 중간
Docker 네트워크 문제 컨테이너 간 통신 설정 오류 중간

 

 

2. 기본 설정 확인 및 수정

가장 먼저 확인해야 할 기본 설정들입니다.

Kafka 브로커 상태 확인

# Kafka 프로세스 확인
ps aux | grep kafka

# 포트 사용 확인
netstat -tlnp | grep :9092

정상적인 경우 출력 예시:

tcp6       0      0 :::9092                 :::*                    LISTEN      12345/java

server.properties 핵심 설정

config/server.properties 파일에서 다음 설정을 확인하고 수정하세요:

# 기본 리스너 설정
listeners=PLAINTEXT://localhost:9092

# 외부 클라이언트 접속용 설정 (로컬 환경)
advertised.listeners=PLAINTEXT://localhost:9092

# 브로커 ID (클러스터 내 고유값)
broker.id=0

# ZooKeeper 연결 정보
zookeeper.connect=localhost:2181

 

 

3. 네트워크 설정 문제 해결

listeners와 advertised.listeners 차이점

이 두 설정의 차이를 이해하는 것이 중요합니다:

  • listeners: Kafka 브로커가 실제로 바인딩할 네트워크 인터페이스
  • advertised.listeners: 클라이언트에게 알려줄 접속 주소

다양한 환경별 설정 예시

로컬 개발 환경:

listeners=PLAINTEXT://localhost:9092
advertised.listeners=PLAINTEXT://localhost:9092

서버 환경 (고정 IP):

listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.100:9092

다중 네트워크 인터페이스:

listeners=INTERNAL://192.168.1.100:9092,EXTERNAL://10.0.0.100:9093
advertised.listeners=INTERNAL://192.168.1.100:9092,EXTERNAL://10.0.0.100:9093
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
inter.broker.listener.name=INTERNAL

 

 

4. Docker 환경에서의 해결책

Docker를 사용할 때는 특별한 주의가 필요합니다.

Docker Compose 설정 예시

version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

Docker 실행 시 주의사항

# 올바른 Docker 실행 명령
docker run -d \
  --name kafka \
  -p 9092:9092 \
  -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
  -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
  confluentinc/cp-kafka:latest

 

 

5. JAVA 환경 설정 확인

JAVA_HOME 설정 확인 및 수정

# 현재 JAVA_HOME 확인
echo $JAVA_HOME

# Java 버전 확인
java -version

# JAVA_HOME 설정 (Linux/Mac)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

# 영구 설정을 위해 ~/.bashrc에 추가
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc
source ~/.bashrc

Windows 환경:

  1. 시스템 속성 → 고급 → 환경 변수
  2. JAVA_HOME 변수 추가: C:\Program Files\Java\jdk-11.0.x
  3. Path에 %JAVA_HOME%\bin 추가

 

 

6. 단계별 문제 해결 프로세스

1단계: 서비스 상태 확인

# ZooKeeper 상태 확인
echo ruok | nc localhost 2181

# Kafka 로그 확인
tail -f /path/to/kafka/logs/server.log

2단계: 포트 충돌 확인

# 포트 사용 상태 확인
sudo lsof -i :9092
sudo lsof -i :2181

# 포트를 사용하는 프로세스 종료
sudo kill -9 [PID]

3단계: 설정 파일 검증

# server.properties 문법 확인
kafka-configs.sh --bootstrap-server localhost:9092 --describe --entity-type brokers --entity-name 0

 

 

7. 테스트 및 검증 방법

연결 테스트 도구

# kafka-console-producer로 테스트
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic

# kafka-console-consumer로 테스트
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning

# kafkacat을 이용한 연결 테스트
kafkacat -b localhost:9092 -L

브로커 메타데이터 확인

# 브로커 정보 조회
kafka-broker-api-versions.sh --bootstrap-server localhost:9092

# 토픽 목록 확인
kafka-topics.sh --bootstrap-server localhost:9092 --list

 

 

8. 예방 하거나, 평소 모니터링 하는 설정

로그 모니터링 설정

# 로그 레벨 설정 (log4j.properties)
log4j.logger.kafka=INFO
log4j.logger.org.apache.kafka=INFO

# 중요 로그 패턴 모니터링
tail -f server.log | grep -E "(ERROR|WARN|Connection)"

헬스체크 스크립트

#!/bin/bash
# kafka-health-check.sh

KAFKA_HOST="localhost:9092"
TOPIC="health-check"

# 토픽 생성 테스트
kafka-topics.sh --create --bootstrap-server $KAFKA_HOST --topic $TOPIC --partitions 1 --replication-factor 1 2>/dev/null

# 메시지 전송 테스트
echo "test message" | kafka-console-producer.sh --bootstrap-server $KAFKA_HOST --topic $TOPIC

if [ $? -eq 0 ]; then
    echo "Kafka is healthy"
    exit 0
else
    echo "Kafka connection failed"
    exit 1
fi

 

이러한 단계들을 차례대로 수행하면 대부분의 ‘Connection to node -1’ 에러를 해결할 수 있습니다. 각 환경에 맞는 설정을 적용하고, 지속적인 모니터링을 통해 안정적인 Kafka 클러스터를 운영하시기 바랍니다. 더 자세한 정보는 Apache Kafka 공식 문서Confluent Kafka 가이드를 참고 부탁드립니다.

 

댓글 남기기