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

单节点部署Kraft模式Kafka集群生产消费报错求助

Kraft模式Kafka集群监听器匹配问题排查求助

因公司限制需采用裸金属部署,先在单节点搭建Kraft模式Kafka集群用于学习,目标为1个Controller、1个Broker+Controller、1个Broker。已配置三个节点的server.properties并成功启动,但执行生产消费命令时出现「10个分区的leader broker无匹配监听器」警告,虽能看到测试topic在两个Broker上创建,但报错仍存在,求助排查原因。

配置详情

Controller节点(node.id=1)

process.roles=controller
node.id=1
controller.quorum.voters=1@localhost:9193,2@localhost:9293
listeners=CONTROLLER1://localhost:9193
controller.listener.names=CONTROLLER1
listener.security.protocol.map=CONTROLLER1:PLAINTEXT,CONTROLLER2:PLAINTEXT,CONTROLLER3:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT

Broker+Controller节点(node.id=2)

process.roles=broker,controller
node.id=2
controller.quorum.voters=1@localhost:9193,2@localhost:9293
listeners=CONTROLLER2://localhost:9293,BROKER2://localhost:9292
controller.listener.names=CONTROLLER2
listener.security.protocol.map=BROKER2:PLAINTEXT,CONTROLLER2:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT
advertised.listeners=BROKER2://localhost:9292
inter.broker.listener.name=BROKER2

Broker节点(node.id=3)

process.roles=broker
node.id=3
controller.quorum.voters=1@localhost:9193,2@localhost:9293
listeners=BROKER3://localhost:9392
controller.listener.names=CONTROLLER1
listener.security.protocol.map=BROKER3:PLAINTEXT,CONTROLLER1:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
inter.broker.listener.name=BROKER3
advertised.listeners=BROKER3://localhost:9392

启动命令

bin/kafka-storage.sh format -t ffQlsx4mQn-ipKduywm2Ig -c config/server.properties --ignore-formatted
bin/kafka-server-start.sh config/server.properties

生产消费命令

bin/kafka-console-producer.sh --bootstrap-server localhost:9292 --topic test
bin/kafka-console-consumer.sh --bootstrap-server localhost:9292 --topic test --from-beginning

环境信息

  • Kafka 3.5.1(Scala 2.13)
  • Ubuntu 22.04
  • openjdk 11.0.20.1

问题分析与解决

出现「leader broker无匹配监听器」的核心原因是集群内节点间监听器配置不统一,导致节点无法正确识别彼此的通信地址,具体问题点及解决方法如下:

1. Controller监听器配置不统一

  • 问题:Controller节点(node1)用CONTROLLER1监听器,Broker+Controller节点(node2)用CONTROLLER2监听器,而Broker节点(node3)指定controller.listener.names=CONTROLLER1但自身配置中没有CONTROLLER1的监听地址,导致node3无法与Controller集群正常通信。
  • 解决:统一Controller集群的监听器名称,所有节点使用相同的标识(比如CONTROLLER):
    • Controller节点(node1)修改:
      listeners=CONTROLLER://localhost:9193
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=CONTROLLER:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT
      
    • Broker+Controller节点(node2)修改:
      listeners=CONTROLLER://localhost:9293,BROKER2://localhost:9292
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=BROKER2:PLAINTEXT,CONTROLLER:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT
      
    • Broker节点(node3)修改:
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=BROKER3:PLAINTEXT,CONTROLLER:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
      

2. 跨Broker通信监听器不兼容

  • 问题:集群内Broker使用不同的监听器名称(BROKER2、BROKER3),且未配置彼此可识别的监听器映射,导致Broker之间无法通过inter.broker.listener.name找到对应通信地址。
  • 解决:统一跨Broker通信的监听器名称(比如INTER_BROKER),或确保每个Broker的listener.security.protocol.map包含其他Broker的监听器配置。更简洁的方式是拆分内部通信与客户端通信的监听器:
    • Broker+Controller节点(node2)修改:
      listeners=CONTROLLER://localhost:9293,INTER_BROKER://localhost:9292,PLAINTEXT://localhost:9292
      advertised.listeners=INTER_BROKER://localhost:9292,PLAINTEXT://localhost:9292
      inter.broker.listener.name=INTER_BROKER
      listener.security.protocol.map=INTER_BROKER:PLAINTEXT,CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT
      
    • Broker节点(node3)修改:
      listeners=INTER_BROKER://localhost:9392,PLAINTEXT://localhost:9392
      advertised.listeners=INTER_BROKER://localhost:9392,PLAINTEXT://localhost:9392
      inter.broker.listener.name=INTER_BROKER
      listener.security.protocol.map=INTER_BROKER:PLAINTEXT,CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
      
    注:PLAINTEXT用于生产消费客户端连接,INTER_BROKER用于Broker内部通信,职责更清晰。

3. 验证步骤

  1. 修改所有节点的server.properties后,重启所有Kafka节点。
  2. 创建测试topic:bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9292 --partitions 10 --replication-factor 2
  3. 执行生产消费命令,检查是否仍有「无匹配监听器」警告。
  4. 查看topic分区分布:bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9292,确认所有分区leader正常分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:54