본문 바로가기

TroubleShooting/Network

[kafka] NotLeaderOrFollowerException 에러 확인

728x90

kafka 를 통해 메시지를 전달하는데, 어느 순간 부터 

Topic and partion to exceptions: topic-name-0 -> org.apache.kafka.common.errors.NotLeaderOrFollowerException (kafka.server.KafkaApis) 에러가 발생하고 있다.

 

 

토픽 정보를 확인할 수 있는 명령어 kafka-topics.sh 로 토픽 정보를 확인해보니깐 2번 브로커가 0 번 파티션의 리더를 맡고 있다.  

hostname@kafka-client:/$ kafka-topics.sh --describe --bootstrap-server kafka-0.kafka-headless.default.svc.cluster.local:9092,kafka-1.kafka-headless.default.svc.cluster.local:
9092,kafka-2.kafka-headless.default.svc.cluster.local:9092 --topic log.test
Topic: log.test    TopicId: Vs6ZlWQ9QO2vHSfDKVYwcg PartitionCount: 3      ReplicationFactor: 1                                                                                                 C
onfigs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824
        Topic: log.test    Partition: 0    Leader: 2       Replicas: 2    Isr: 2
        Topic: log.test    Partition: 1    Leader: 0       Replicas: 0    Isr: 0
        Topic: log.test    Partition: 2    Leader: 1       Replicas: 1    Isr: 1
hostname@kafka-client:/$

위에 에러 로그가 2번 브로커(kafka-2 pod) 에서 발생한 로그인데, 로그 내용만 보면 브로커 또는 팔로워가 아닌 상태라는 것인데, 카프카 클러스터로 잘 사용하던 환경이었다.

 

2번 브로커에서 kafka data 가 저장된 디렉토리를 찾아가서 해당 토픽(0 번)의 디렉토리에서 partion.metadata 정보를 확인해보았다.

hostname@kafka-2:/kafka/data$ cd test.log-0/
hostname@kafka-2:/kafka/data/test.log-0$ ls
00000000000000000000.index  00000000000000000000.timeindex  00000000000000011273.log
  00000000000000011273.timeindex  partition.metadata
00000000000000000000.log    00000000000000011273.index      00000000000000011273.snapshot  leader-epoch-checkpoint
hostname@tas-kafka-2:/kafka/data/test.log-0$ more partition.metadata 
version: 0
topic_id: Z13JxOA9Q13vH2fgKdOabi

topic_id 부분의 값의 kafka-topics.sh 에서 확인한 test.log 토픽의 TopicId 값과 달랐다!

다른 kafka 팟들의 partion.metadata 정보를 확인했을때도 kafka-topics.sh 의 값과 동일했다.

문제가 된 2번 브로커의 topic_id 값을 다른 것들과 동일하게 설정한 이후에 메시지를 보내보니 exception 은 발생하지 않고 정상 동작했다.

원인은 문제가 된 2번 팟의 kafka 데이터가 저장된 PV 가 오랫동안 pending 상태였다가 리소스가 여유가 생기면서 재시작이 되었지만, 토픽 정보가 불일치 상태로 계속 남아 있어서 였던거 같다.

 

참조:

- exceptoin 정보가 어떤 의미인지 알게 해준 사이트

https://stackoverflow.com/questions/42778748/kafka-exception-while-producing-records-on-kafka-topic