You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kraft模式Kafka集群端口转发时NOT_LEADER_OR_FOLLOWER异常排查

问题分析:Kubernetes Kraft集群端口转发后出现NOT_LEADER_OR_FOLLOWER异常

集群背景与配置

一个在Kubernetes集群内正常运行的Kafka 3.4+ Kraft集群,基础配置如下:

  • Kubernetes节点数:3个
  • Kafka StatefulSet核心配置参数:
    • ADVERTISED_LISTENERS : BROKER://:9092,BROKER0://localhost:9094,BROKER1://localhost:9095,BROKER2://localhost:9096
    • LISTENERS : BROKER://:9092,CONTROLLER://:9093,BROKER0://localhost:9094,BROKER1://localhost:9095,BROKER2://localhost:9096
    • LISTENER_SECURITY_PROTOCOL_MAP : BROKER:PLAINTEXT,CONTROLLER:PLAINTEXT,BROKER0:PLAINTEXT,BROKER1:PLAINTEXT,BROKER2:PLAINTEXT
    • PROCESS_ROLES : controller,broker
    • INTER_BROKER_LISTENER_NAME : BROKER
    • CONTROLLER_LISTENER_NAMES : CONTROLLER
    • 节点ID映射:kafka-0→0、kafka-1→1、kafka-2→2
    • controller.quorum.voters=0@kafka-0.kafka-headless.default.svc.cluster.local:9093,1@kafka-1.kafka-headless.default.svc.cluster.local:9093,2@kafka-2.kafka-headless.default.svc.cluster.local:9093
    • 配置了用于cluster_id引导的共享存储

集群内部验证情况

该集群在Kubernetes内部运行正常,已通过在kafka-0、kafka-1、kafka-2 Pod内执行以下命令完成生产验证:

./kafka-console-producer.sh --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 test

端口转发配置

通过Kubernetes将集群端口转发到本地机器:

kafka-0 -> localhost:9094
kafka-1 -> localhost:9095
kafka-2 -> localhost:9096

注意:每个节点的ADVERTISED_LISTENERS和LISTENERS配置完全相同。

测试异常现象

针对预创建的3副本3分区主题test2,在本地执行生产者命令测试端口转发后的集群:

./kafka-console-producer.sh --bootstrap-server localhost:9094,localhost:9095,localhost:9096 --topic test2

出现以下错误日志:

>test
>test
>test[2023-05-19 11:38:51,702] WARN [Producer clientId=console-producer] Got error produce response with correlation id 7 on topic-partition test2-1, retrying (2 attempts left). Error: NOT_LEADER_OR_FOLLOWER (org.apache.kafka.clients.producer.internals.Sender)
[2023-05-19 11:38:51,703] WARN [Producer clientId=console-producer] Received invalid metadata error in produce request on partition test2-1 due to org.apache.kafka.common.errors.NotLeaderOrFollowerException: For requests intended only for the leader, this error indicates that the broker is not the current leader. For requests intended for any replica, this error indicates that the broker is not a replica of the topic partition.. Going to request metadata update now (org.apache.kafka.clients.producer.internals.Sender)

本地机器可通过telnet localhost 9094/telnet localhost 9095/telnet localhost 9096正常访问每个节点的端口。

问题根源:监听器配置与节点身份不匹配

所有节点都配置了全部三个BROKER0/BROKER1/BROKER2监听器,这是错误的核心原因:
每个Kafka节点只应该暴露对应自身的专属本地监听器,而不是同时包含其他节点的监听器配置。

具体逻辑:
当客户端通过端口转发连接到某个节点(比如kafka-0的localhost:9094),该节点返回的元数据中,分区领导者的地址会是对应节点的localhost:909X(比如test2-1的leader是kafka-1,元数据返回localhost:9095)。但客户端此时是连接在kafka-0的转发端口上,尝试访问本地的9095端口会被转发到kafka-1节点,而当前连接的kafka-0节点并非该分区的领导者,因此抛出NOT_LEADER_OR_FOLLOWER异常。

修复方案

为每个StatefulSet Pod配置专属的监听器参数:

  • kafka-0节点:
    ADVERTISED_LISTENERS : BROKER://:9092,BROKER0://localhost:9094
    LISTENERS : BROKER://:9092,CONTROLLER://:9093,BROKER0://localhost:9094
    
  • kafka-1节点:
    ADVERTISED_LISTENERS : BROKER://:9092,BROKER1://localhost:9095
    LISTENERS : BROKER://:9092,CONTROLLER://:9093,BROKER1://localhost:9095
    
  • kafka-2节点:
    ADVERTISED_LISTENERS : BROKER://:9092,BROKER2://localhost:9096
    LISTENERS : BROKER://:9092,CONTROLLER://:9093,BROKER2://localhost:9096
    

更高效的方式是利用StatefulSet的Pod序号变量(如{{ .Ordinal }})动态生成监听器配置,确保每个节点仅暴露自身的专属本地监听器。

内容的提问来源于stack exchange,提问作者StevenPG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:29:57