[Kafka] Kafka ZookeeperClientTimeoutException 오류 해결 | 프로삽질러
겨우 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 |
해결 방법 크게 세 단계로 나뉜다.
1. Kafka Server 설정 파일 확인
1
|
$ vi /usr/kafka/config/server.properties
|
cs |
1) broker.id
클러스터가 아닌 로컬환경에서 서버 한 대로 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
listeners 는 kafka 실행 시 사용되는 tcp 포트로 default 값으로 9092 가 설정되어있습니다. 주석이 달려있다면 해제 후 sudo ufw allow 9092 명령어를 실행해 포트를 열어주세요
3) 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 가 출력되어도 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 주소를 사용해본다.
이렇게 org.apache.kafka.common.eroors.InvalidReplicationFactorException 를 해결하고 정상 작동하여 topic test 가 생성되었다는 결과를 볼 수 있다.
InvalidReplicationFactorException 오류의 원인은 Kafka server.propeties 설정과 Zookeeper 설정 간 일치 여부에서 비롯됨을 확인할 수 있었다.
이상으로 포스팅을 마치겠습니다. 감사합니다 ~~