DataEngineering/Kafka

[Kafka] Kafka ZookeeperClientTimeoutException 오류 해결 | 프로삽질러

유나쒸 2021. 4. 17. 03:57

겨우 Zookeeper 라는 산을 넘었더니 Kafka가 시작부터 말썽입니다. 

오늘은 다음과 같은 에러를 해결해보겠습니다. 

 

ZookeeperClientTimeoutException : Timed out waiting for ... : CONNECTING 

Error while executing topic command : Replication factor : 1 larger than available brokers: 0.

ERROR org.apache.kafka.common.eroors.InvalidReplicationFactorException  

실행 환경

- Ubuntu 18.04 LTS

- Zookeeper 3.6.3

- Kafka 2.7.0

- 독립실행환경(Standalone)

토픽 생성 명령어 실행 시 발생한 에러 

1
2
/usr/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 
  --replication-factor 1 --partitions 1 --topic test
cs

InvalidReplicationFactorException 에러 

해결 방법 크게 세 단계로 나뉜다. 

1. Kafka Server 설정 파일 확인 

1
$ vi /usr/kafka/config/server.properties
cs

1) broker.id 

broker.id=1

 클러스터가 아닌 로컬환경에서 서버 한 대로 zookeeper, kafka를 실행할 때  Zookeeper의 zoo.cfg 에서 server.1= ... , server.2= ... , server.3= ... 과 같이 앙상블 서버를 작성하셨다면 삭제를 해주시기 바랍니다. Kafka는 zoo.cfg 에 등록된 앙상블 서버 모두와 연결이 되어있어야 정상 작동하기때문에 standalone 으로 실행하고 싶다면 해당 내용을 지우고 다시 zkServer.sh 를 시작해주세요. 

  /var/lib/zookeeper 와 같이 본인이 설정한 Zookeeper data directory 에서 myid 파일을 만들었다면 해당 아이디 값을 broker.id 에 대입하여 주세요. 만약 설정하지 않았다면 0 이 default 값이 되기 때문에 broker.id=0 인 채로 두면 됩니다. 

저는 Zookeeper 설치할 때 삽질을 해서 myid 파일을 1로 생성해서 broker의 id를 1로 만들었습니다. 

 

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

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

    listeners 는 kafka 실행 시 사용되는 tcp 포트로 default 값으로 9092 가 설정되어있습니다. 주석이 달려있다면 해제 후 sudo ufw allow 9092  명령어를 실행해 포트를 열어주세요

 

3) zookeeper.connect=127.0.0.1:2181

zookeeper.connect=127.0.0.1:2181

zookeeper.connect=호스트이름:포트번호 는 zookeeper가 실행되는 주키퍼의 위치를 나타낸다. 브로커의 메타데이터, 컨슈머가 읽은 offset 등을 저장하기 위해 zookeeper가 사용되는데 이때 주키퍼를 실행하는 호스트이름과 실행되고있는 포트를 명시해주어야합니다. default로 localhost:2181 이라고 저장되어있는데 /etc/hosts 에 127.0.0.1 이 localhost라고 저장되어있음에도 불구하고 127.0.0.1 ip번호로 수정하니 정상작동한 것이 의아했습니다. 

 

2. Zookeeper 서버 시작 및 실행 상태 확인

1
2
/usr/zookeeper/bin/zkServer.sh restart
/usr/zookeeper/bin/zkServer.sh status
cs
zkServer 가 STARTED 되었지만 statu는 probably not running 을 출력

status 명령으로 Mode: standalone 이 출력되면 정상 작동

zkServer 를 다시 시작하고 STARTED 가 출력되어도 status 명령을 통해 연결 상태를 확인해봐야 합니다. 첫번째 실행결과 처럼 server가 시작된 것처럼 보이나 status 에서는 오류가 나서 정상작동하지않고있음을 확인할 수 있습니다. Kafka는 Zookeeper가 실행되어야 정상 실행 되므로 Zookeeper 의 정상 실행 여부를 확인해주세요.

 

3. Kafka Broker 시작 

다음 명령어를 통해 앞서 변경한 kakfa 설정을 기반으로 Kafka Broker 를 실행한다. 

1
2
/usr/kafka/bin/kafka-server-start.sh 
  --daemon /usr/kafka/config/server.properties
cs

4. Kafka test Topic 생성

다음 명령어를 통해 test 라는 topic를 생성한다.

1
2
/usr/kafka/bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 
  --replication-factor 1 --partitions 1 --topic test
cs

이때 zookeeper 옵션은 Topic과 연결될 Zookeeper 앙상블의 서버주소:포트를 나열하는 옵션인데 우리는 standalone 환경이고, 앞서 변경한 server.properties 에서 zookeeper.connect=127.0.0.1:2181 로 지정했기 때문에 topic 생성 명령 시에도 ip 주소를 사용해본다. 

생성된 topic test

이렇게 org.apache.kafka.common.eroors.InvalidReplicationFactorException 를 해결하고 정상 작동하여 topic test 가 생성되었다는 결과를 볼 수 있다.

 

InvalidReplicationFactorException 오류의 원인은 Kafka server.propeties 설정과 Zookeeper 설정 간 일치 여부에서 비롯됨을 확인할 수 있었다.

 

이상으로 포스팅을 마치겠습니다. 감사합니다 ~~