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

时间:2018-12-01 14:35:42

标签: spring-boot docker apache-kafka docker-compose

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

错误:

  

email-service_1 | 2018-12-01 14:32:02.448警告1 ---   [ntainer#0-0-C-1] o.a.k.c.NetworkClient:[消费者   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

3 个答案:

答案 0 :(得分:7)

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

---
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
  

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

请注意,KAFKA_ADVERTISED_HOST_NAME已过时,建议改用KAFKA_ADVERTISED_LISTENERS。有关KAFKA_ADVERTISED_LISTENERS的更多信息,请检查here

答案 1 :(得分:4)

这是 Apache Kafka 2.4.0

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


当请求handle a completed metadata response的{{1}中的DefaultMetadataUpdater时,将打印出WARN消息。

[count]个分区的领导者经纪人没有匹配的侦听器,包括[partitions]

这是与具有以下default exception textNetworkClient相对应的警告:

领导者经纪人上没有与处理元数据请求的侦听器匹配的侦听器。

那是在客户端。

更深入地研究发现,当Errors.LISTENER_NOT_FOUND被请求find partition metadata时,此Errors.LISTENER_NOT_FOUND被用在Kafka经纪人上。在此调试消息出现之前,您可以在这里找到:

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

只需打开MetadataCache记录器的DEBUG记录级别,您就应该在控制器代理的日志中看到它。

在这种情况下,kafka.server.MetadataCache由经纪人(通过MetadataCache)使用到handle TopicMetadata request,他们说:

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

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

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


以我为例,当我调试问题时,结果证明我使用KafkaApis连接到Kafka代理,而分区负责人既不可用也不配置为监听SSL://:9093的配置属性。

我用listeners查看了分区配置,然后查看了ZooKeeper中分区的状态。

kafka-topics

我有get /brokers/topics/ssl/partitions/0/state {"controller_epoch":1,"leader":0,"version":1,"leader_epoch":0,"isr":[0]} 作为领导者,但是-1显示了一个经纪人,它只是配置错误。这就是为什么人们报告他们通过重新启动集群(以启动和运行所有代理)或将代理ID固定为以前可用的ID来解决此问题的原因。

答案 2 :(得分:1)

[上下文]

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

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

[结果]

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

列出主题: bin/kafka-topics.sh --list --bootstrap-server localhost:9092
producer: 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]

[某些文档]

NB

如果有人对卡夫卡,动物园管理员和经纪人的内部运作有更多信息,以及为什么我们需要指定它,为什么即使我执行--force-recreate --build也要保留这些信息...不要犹豫。我是kafka的新手,这是我关于stackoverflow的第一篇完整文章之一:)

干杯!