Kubernetes上Kafka出现UNKNOWN_TOPIC_OR_PARTITION与LEADER_NOT_AVAILABLE错误
排查Kafka集群UNKNOWN_TOPIC_OR_PARTITION & LEADER_NOT_AVAILABLE问题
我之前在搭建多节点Kafka集群时碰到过几乎一模一样的问题,结合你给出的配置细节,咱们一步步拆解排查:
1. 优先检查Broker的advertised.listeners配置
这是最常见的根因——你给每个broker配置了独立外部IP,但如果每个broker的advertised.listeners没有正确绑定自身的外部IP,就会导致元数据同步异常。
举个正确的配置例子(针对kafka-2):
listeners=PLAINTEXT://0.0.0.0:9092,INTERNAL://0.0.0.0:9093 advertised.listeners=PLAINTEXT://<kafka-2-external-ip>:9092,INTERNAL://kafka-2.kafka-headless.default.svc.cluster.local:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT
listeners绑定0.0.0.0是让broker监听所有网卡,内部通信用无头服务的INTERNALlistener,外部客户端用PLAINTEXTlistener对应独立IP。- 必须确保每个broker的
advertised.listeners里的外部IP是唯一且正确的,不能复用其他broker的地址。
2. 确认ZK中的Broker注册元数据
你提到已经用ZK CLI验证过Pod广播了外部IP,但建议再精准检查kafka-2的注册信息:
zkCli.sh -server <你的ZK集群地址> get /brokers/ids/2 # 假设kafka-2的broker id是2
返回的JSON里,endpoints字段必须包含你配置的外部IP listener地址。如果只有内部无头服务的地址,说明broker没有正确注册外部IP,生产者拿到的leader地址是内部的,自然无法访问。
3. 检查Topic的副本与ISR状态
用Kafka自带的工具查看test-topic的详细状态:
kafka-topics.sh --describe --topic test-topic --bootstrap-server <任意broker外部IP>:9092
重点看:
Leader字段是否确实是kafka-2的broker id;Replicas列表是否包含至少1个在线的broker;Isr列表是否和Replicas一致(至少包含leader)。
如果Isr列表为空,说明leader没有完成元数据同步,或者副本无法连接leader。
4. 排查kafka-2自身的元数据加载问题
kafka-2日志抛出UnknownTopicOrPartitionException,说明它自己都无法识别这个topic,可能的原因:
- 该broker的ZK连接配置有问题(比如
zookeeper.connect写错了,或者超时时间太短),导致无法从ZK拉取topic元数据; - 创建topic后没有重启kafka-2,它没有主动刷新元数据。可以手动触发元数据刷新:
或者直接重启kafka-2 Pod。kafka-run-class.sh kafka.admin.AdminClientCommand --bootstrap-server <kafka-2-external-ip>:9092 --describe-topic test-topic
5. 直接连接Leader测试生产者
跳过集群路由,直接连接kafka-2的外部IP发送消息,验证是否能成功:
kafka-console-producer.sh --broker-list <kafka-2-external-ip>:9092 --topic test-topic
如果这样能成功发送,说明问题出在其他broker的元数据同步上;如果还是失败,那大概率是kafka-2自身的配置或ZK同步问题。
内容的提问来源于stack exchange,提问作者j9dy
相关产品推荐
相关产品推荐

