单节点部署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
- Controller节点(node1)修改:
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内部通信,职责更清晰。 - Broker+Controller节点(node2)修改:
3. 验证步骤
- 修改所有节点的
server.properties后,重启所有Kafka节点。 - 创建测试topic:
bin/kafka-topics.sh --create --topic test --bootstrap-server localhost:9292 --partitions 10 --replication-factor 2 - 执行生产消费命令,检查是否仍有「无匹配监听器」警告。
- 查看topic分区分布:
bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9292,确认所有分区leader正常分配。
内容的提问来源于stack exchange,提问作者Caio Favero
相关产品推荐
相关产品推荐

