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
'Engineering > Network' 카테고리의 다른 글
curl 명령어로 postman 업로드 API 대체 (0) | 2024.06.19 |
---|---|
dhcp 인터페이스를 static 으로 변경 (0) | 2018.11.23 |
FD 최대값 테스트(리눅스 용) (0) | 2012.03.06 |
maillog 로그중에 NOQUEUE: SYSERR(apache): can not chdir(/var/spool/clientmqueue/): Permission denied (0) | 2012.01.10 |
로컬호스트의 열려진 포트(바인딩하지 않은 포트) 알아오는 간단한 소스 (0) | 2011.11.16 |