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 上的第一篇完整帖子:)
干杯!
Jac*_*ski 13
这是Apache Kafka 2.4.0。
我正在分享基于低级代码的发现,以阐明何时可以打印此 WARN 消息以及原因。这当然是 Kafka 集群的错误配置。如果有什么遗漏,请继续阅读并发表评论。谢谢!
当请求DefaultMetadataUpdater(of NetworkClient)处理完成的元数据响应时,会打印出 WARN 消息。
[count] 个分区具有没有匹配侦听器的领导代理,包括 [partitions]
这是一个对应于Errors.LISTENER_NOT_FOUND具有以下默认异常文本的警告:
领导代理上没有与处理元数据请求的侦听器相匹配的侦听器。
那是在客户端。
深入挖掘您会发现,Errors.LISTENER_NOT_FOUND当MetadataCache请求查找分区元数据时,它会在 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请在此处检查。