Kafka 0.10集群出现NotLeaderForPartitionException异常原因排查求助
问题背景
集群配置:5台Broker(ID 101-105),Kafka 0.10版本,副本因子3;主题kopa.thrn.bvff包含100个分区,分区已处于均衡状态。运行数月后,server.log中出现大量如下错误日志:
[2023-01-19 11:53:37,434] ERROR [ReplicaFetcherThread-0-101], Error for partition [kopa.thrn.bvff,78] to broker 101:org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition. (kafka.server.ReplicaFetcherThread)
[2023-01-19 11:53:37,434] ERROR [ReplicaFetcherThread-0-101], Error for partition [kopa.thrn.bvff,23] to broker 101:org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition. (kafka.server.ReplicaFetcherThread)
[2023-01-19 11:53:37,434] ERROR [ReplicaFetcherThread-0-101], Error for partition [kopa.thrn.bvff,63] to broker 101:org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition. (kafka.server.ReplicaFetcherThread)
[2023-01-19 11:53:37,434] ERROR [ReplicaFetcherThread-0-101], Error for partition [kopa.thrn.bvff,98] to broker 101:org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition. (kafka.server.ReplicaFetcherThread)
[2023-01-19 11:53:37,434] ERROR [ReplicaFetcherThread-0-101], Error for partition [kopa.thrn.bvff,3] to broker 101:org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition. (kafka.server.ReplicaFetcherThread)
可能的排查方向
1. Broker 101元数据同步延迟
日志显示错误来自Broker 101的ReplicaFetcherThread,该线程尝试向自身拉取分区数据,但此时Broker 101已不是这些分区的Leader。核心原因是元数据更新不及时:
- 分区Leader切换后,Broker 101的副本拉取线程未及时获取新元数据,仍持有旧Leader信息(自身)发起请求。
- Kafka 0.10版本依赖ZooKeeper的Watcher机制同步元数据,若Broker与ZK间网络波动、会话超时或ZK集群压力过大,都会导致元数据同步滞后。
2. 临时Broker失联后的残留请求
集群运行中若出现Broker短暂失联(如网络闪断、Full GC停顿过长),会触发Controller重新选举分区Leader:
- 假设Broker 101曾是这些分区的Leader,短暂失联后Controller将Leader切换至其他Broker,但Broker 101恢复后,内部副本拉取线程未清理旧拉取任务,仍向自身发起请求导致报错。
- 检查Broker 101的GC日志,确认是否存在长时间Full GC;查看ZK日志,排查是否有Broker 101的会话过期记录。
3. ReplicaFetcherThread线程状态异常
Kafka 0.10版本的ReplicaFetcherThread在处理元数据变更时存在缺陷,可能出现线程未及时刷新Leader信息的情况:
- 分区Leader变更后,线程未触发元数据重新拉取,持续使用旧Leader地址。可通过查看Broker 101的线程栈,确认该线程是否处于阻塞或未更新状态。
- 尝试重启Broker 101,若错误消失,大概率是线程状态异常导致。
4. ZooKeeper数据一致性问题
ZK作为Kafka元数据存储,若出现数据不一致(如ZK集群过半节点故障恢复后同步不完整),会导致各Broker获取的元数据冲突:
- 部分Broker误以为Broker 101是Leader,而Controller已将Leader切换至其他节点,导致Broker 101的副本拉取线程执行错误指令。
- 使用
zkServer.sh status查看ZK各节点角色,确认数据同步状态;检查ZK日志,排查是否存在数据同步异常记录。
5. 主题分区Leader选举不稳定
即使分区整体均衡,个别分区可能存在Leader选举未完成或频繁切换的情况:
- 执行
kafka-topics.sh --describe --zookeeper <ZK地址> --topic kopa.thrn.bvff,查看异常分区的当前Leader是否为Broker 101以外的节点。 - 若发现Leader频繁切换,说明集群存在不稳定因素(如Broker间网络延迟过高、磁盘IO瓶颈),导致Controller反复触发Leader选举。
内容的提问来源于stack exchange,提问作者Judy

