为什么 Kafka 会警告“分区有没有匹配侦听器的领导代理”?

新手上路,请多包涵

我试图让 Kafka 第一次在 docker-compose 上工作。应用程序在没有 docker 的情况下运行良好。但是在 docker 上,我得到了如下所述的错误。卡夫卡为什么会抛出这个错误?

错误:

电子邮件服务_1 | 2018-12-01 14:32:02.448 WARN 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

原文由 user2997204 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 495
2 个回答

正如您对问题的评论中所述,问题似乎出在 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

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

请注意 KAFKA_ADVERTISED_HOST_NAME 已被弃用,建议使用 KAFKA_ADVERTISED_LISTENERS 代替。有关 KAFKA_ADVERTISED_LISTENERS 的更多信息,请查看 此处

原文由 lloiacono 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是 Apache Kafka 2.4.0

我正在分享基于代码的低级发现,以便在可以打印此 WARN 消息时提供更多信息以及原因。这肯定是 Kafka 集群的错误配置。如果缺少某些内容,请继续阅读并发表评论。谢谢!


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

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

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

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

那是在客户端。

深入挖掘你会发现,当 MetadataCache 被要求 查找分区元数据 时,这个 Errors.LISTENER_NOT_FOUND 用于 Kafka 代理。在此 DEBUG 消息出现之前,您可以在此处找到:

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

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

在这种特殊情况下,代理(通过 KafkaApis MetadataCache 使用 --- 来 处理他们说的 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]}

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

原文由 Jacek Laskowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进