Kafka分区的领导者经纪人没有匹配的侦听器

use*_*204 11 apache-kafka docker spring-boot docker-compose

我正在尝试让Kafka第一次在docker-compose上工作。该应用程序在没有docker的情况下运行良好。但是在docker上,出现如下所述的错误。卡夫卡为何会抛出此错误?

错误:

email-service_1 | 2018-12-01 14:32:02.448警告1 --- [ntainer#0-0-C-1] oakcNetworkClient:[Consumer clientId = consumer-2,groupId = kafka] 1个分区的领导者经纪人没有匹配的侦听器,包括[email-token-0]

我的docker-compose配置:

version: '3.3'
    services:
     zookeeper:
      image: wurstmeister/zookeeper
      ports:
       - "2181:2181"

 kafka:
  image: wurstmeister/kafka
  command: [start-kafka.sh]
  environment:
   KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
   KAFKA_ADVERTISED_HOST_NAME: 192.168.23.134
   KAFKA_CREATE_TOPICS: "email-token:1:1"
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock
  ports:
   - "9092:9092"
  depends_on:
   - zookeeper

 email-service:
  build: ./email-service
  environment:
   SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:9092
  ports:
   - "8081:8081"
  depends_on:
   - kafka
Run Code Online (Sandbox Code Playgroud)

Ian*_*ars 13

[语境]

我正在尝试使用https://github.com/wurstmeister/kafka-docker的注册表与 kafka 客户端一起运行 docker compose 我正在尝试运行一个非常简单的 kafka 集群,其中包含一个代理和每个 1 个分区的 3 个主题和复制因子为 1。

这个很棒的链接解释了具有一个代理的 kafka 集群、具有多个代理的 kafka 集群以及有关侦听器的概念的连接性,所有这些都使用 docker,请查看:https : //github.com/wurstmeister/kafka-docker/wiki /连通性

[结果]

第一次运行docker-compose up --force-recreate --build,一切正常!
这些主题是使用自动创建的KAFKA_CREATE_TOPICS,我可以很好地使用 kafka 生产者和消费者。

列出主题: bin/kafka-topics.sh --list --bootstrap-server localhost:9092
生产者: bin/kafka-console-producer.sh --broker-list localhost:9092 --topic productadvisor_sales_dev
消费者: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic productadvisor_sales_dev --from-beginning

之后,每次我这样做docker-compose stop并重新启动docker-compose up --force-recreate --build并尝试生成数据时,我都会收到以下错误消息...

错误信息 : [2019-09-23 19:41:33,037] WARN [Producer clientId=console-producer] 1 partitions have leader brokers without a matching listener, including [productadvisor_purchase_dev-0] (org.apache.kafka.clients.NetworkClient)

[回答]

看来您需要指定KAFKA_BROKER_ID(例如=1)的值,以便zookeeper 不会尝试创建一个新的代理,该代理没有侦听器,因为它绑定到旧代理。

[代码]


services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_HOST: localhost
      KAFKA_PORT: 9092
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "productadvisor_sales_dev:1:1,productadvisor_stock_dev:1:1,productadvisor_purchase_dev:1:1"
    depends_on:
      - zookeeper
    command: [start-kafka.sh]
Run Code Online (Sandbox Code Playgroud)

[一些文档]

NB

如果有人有更多关于 kafka、zookeeper 和经纪人的内部工作的信息,以及为什么我们需要指定它,为什么即使我做了 --force-recreate --build 也会保留这些信息......请不要犹豫. 我是 kafka 的新手,这是我在 stackoverflow 上的第一篇完整帖子:)

干杯!

  • kafka 代理信息在重新启动之间保留,因为 wurstmeister/kafka 映像创建一个名为“kafka”的卷。如果运行“docker volume ls”,您将看到一个 kafka 卷。删除该卷,您将不得不重新创建主题等。 (4认同)

Jac*_*ski 13

这是Apache Kafka 2.4.0

我正在分享基于低级代码的发现,以阐明何时可以打印此 WARN 消息以及原因。这当然是 Kafka 集群的错误配置。如果有什么遗漏,请继续阅读并发表评论。谢谢!


当请求DefaultMetadataUpdater(of NetworkClient)处理完成的元数据响应时,会打印出 WARN 消息。

[count] 个分区具有没有匹配侦听器的领导代理,包括 [partitions]

这是一个对应于Errors.LISTENER_NOT_FOUND具有以下默认异常文本的警告:

领导代理上没有与处理元数据请求的侦听器相匹配的侦听器。

那是在客户端。

深入挖掘您会发现,Errors.LISTENER_NOT_FOUNDMetadataCache请求查找分区元数据时,它会在 Kafka 代理上使用。在此 DEBUG 消息出现之前,您可以在此处找到:

获取 [topicPartition] 的元数据时出错:在领导者 [leaderBrokerId] 上找不到侦听器 [listenerName]

只需为kafka.server.MetadataCachelogger设置 DEBUG 日志级别,您就会在控制器代理的日志中看到它。

在这种特殊情况下,MetadataCache代理(通过KafkaApis)使用它来处理 TopicMetadata 请求,他们说:

// 在版本 5 及以下版本中,如果在领导者上找不到匹配的侦听器,我们将返回 LEADER_NOT_AVAILABLE。

// 从版本 6 开始,我们返回 LISTENER_NOT_FOUND 以启用配置错误的诊断。

在那一刻,很明显,有问题的 WARN 消息是针对listenerName上的连接。


就我而言,当我调试问题时,结果发现我曾经SSL://:9093连接到 Kafka 代理,而分区负责人既不可用,也未配置为侦听listeners配置属性。

kafka-topics以前是查看分区配置,然后查看 ZooKeeper 中分区的状态。

get /brokers/topics/ssl/partitions/0/state
{"controller_epoch":1,"leader":0,"version":1,"leader_epoch":0,"isr":[0]}
Run Code Online (Sandbox Code Playgroud)

我曾为-1领导者服务,但isr显示了一个配置错误的经纪人。这就是为什么人们报告他们通过重新启动集群(以使所有代理启动并运行)或将代理 ID 修复为以前工作的代理来解决问题的原因。


llo*_*ono 12

如对您的问题的评论所述,问题似乎出在Kafka经纪人的广告名称上。根据您的docker-compose,您应该使用,192.168.23.134但您的电子邮件服务正在使用kafka:9092。您可以尝试使用此docker-compose。我用提供的最新Zookeeper和Kafka替换了wurstmeister服务,confluentinc并添加了您的电子邮件服务。

---
version: '2'
services:
zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
    ZOOKEEPER_CLIENT_PORT: 2181
    ZOOKEEPER_TICK_TIME: 2000

kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
    - zookeeper
    ports:
    - 9092:9092
    environment:
    KAFKA_BROKER_ID: 1
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
    KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

email-service:
  build: ./email-service
  environment:
   SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:29092
  ports:
   - "8081:8081"
  depends_on:
   - kafka
Run Code Online (Sandbox Code Playgroud)

advertised.listeners:发布到ZooKeeper以便客户端使用的监听器,如果与listeners config属性不同。在IaaS环境中,这可能需要与代理绑定的接口不同。如果未设置,将使用侦听器的值。与侦听器不同,宣告0.0.0.0元地址无效。

请注意,它KAFKA_ADVERTISED_HOST_NAME已被弃用,建议改为使用KAFKA_ADVERTISED_LISTENERS。有关更多信息,KAFKA_ADVERTISED_LISTENERS在此处检查。