Kubernetes中HA模式部署Kafka 3.6.1遇NotLeaderOrFollowerException异常
Kafka 3.6.1 HA部署中NotLeaderOrFollowerException异常的排查与解决
一、优先检查Broker网络配置
- 确认
listeners和advertised.listeners配置:K8s环境下,advertised.listeners必须用StatefulSet的Headless Service域名(比如kafka-0.kafka-headless.svc.cluster.local:9092),不能用容器内网IP或localhost。如果配置错误,生产者拿到的Broker地址无法访问,会出现连接到非leader/非follower节点的情况。 - 测试端口连通性:在同集群的测试Pod里执行
nc -zv kafka-0.kafka-headless.svc.cluster.local 9092,逐个验证每个Broker的监听端口是否能正常连通。
二、排查Topic副本同步状态
- 查看Topic详细信息:执行
重点看kafka-topics.sh --describe --topic <你的topic名> --bootstrap-server <kafka-service>:9092Isr(同步副本集合)是否和Replicas(所有副本)完全一致。如果ISR缺失,说明有副本同步滞后或离线,当生产者设置acks=all时,会因为无法满足同步要求抛出异常。 - 修复副本同步:如果ISR异常,可执行
kafka-reassign-partitions.sh重新分配副本;若业务允许,临时降低min.insync.replicas配置(不建议长期使用,优先解决副本同步根源问题)。
三、K8s StatefulSet部署验证
- 检查Broker启动日志:查看每个Broker的容器日志,确认有
Broker registered、Leader election completed等成功加入集群的日志,避免因启动顺序或初始化失败导致Broker未正常加入集群。 - 验证存储卷状态:检查每个Broker的PV/PVC是否正常挂载,数据目录、日志目录权限是否为
kafka用户所有。存储异常会导致副本无法同步,进而引发leader选举异常。
四、KRaft模式额外检查(如果使用)
- 查看控制器节点状态:执行
确保所有控制器节点状态为kafka-metadata-quorum.sh --bootstrap-server <kafka-service>:9092 describeOnline,离线的控制器会导致元数据同步异常,topic的leader信息无法及时更新。 - 确认bootstrap配置:
bootstrap.servers必须包含所有控制器节点地址,否则生产者无法获取最新的集群元数据。
五、生产者客户端临时排查
- 调整acks配置:临时将生产者
acks设为1,如果能正常生产,说明是同步副本数不足导致的问题,回到第二步排查副本同步。 - 关闭重试看细节:设置
retries=0,查看生产者日志里的具体错误信息,是否是元数据更新不及时,导致连接到了非leader节点。
快速验证方法
- 直接连接leader生产:先通过
kafka-topics.sh找到topic的leader节点,执行
如果能正常生产,说明是生产者元数据获取问题,检查bootstrap server配置或网络连通性。kafka-console-producer.sh --broker-list <leader-broker-host>:9092 --topic <你的topic名> - 分析Broker日志:重点过滤
NotLeaderOrFollowerException相关日志,里面会标注具体分区和节点角色,帮助定位是leader选举异常还是网络问题。
内容的提问来源于stack exchange,提问作者CuriousMind
相关产品推荐
相关产品推荐

