目录
-
- 现象描述
- 排查过程
- 踩坑总结
- 参考
现象描述
用别人构建好的prometheus-kafka-adapter
二进制文件,在服务器上按照文档提示配置KAFKA_BROKER_LIST
环境变量,启动提示"client has run out of available brokers to talk to"。
排查过程
- 在
prometheus-kafka-adapter
所在的服务器上运行kafka-console-producer.sh,确认不存在网络隔离; - 执行kafka-console-producer.sh的过程中发现命令不支持"–bootstrap-server"参数,只支持"–broker-list",说明kafka版本较低,经验证为0.10.2(2.5.0版本开始支持"–bootstrap-server");
prometheus-kafka-adapter
依赖的kafka库叫做"confluentinc/confluent-kafka-go",这个库的api文档里提到了如果要创建producer,需要支持"bootstrap.servers"属性(翻译的时候粗心大意,伏笔了),猜想会不会是因为用到的kafka版本不支持这个参数导致producer创建失败的;- 找的过程中发现之前有同事成功启动过
prometheus-kafka-adapter
,并且用的kafka版本是1.1.0,也不支持"–bootstrap-server",所以应该不是producer参数导致的问题,再看api文档发现正确的翻译应该是newProducer()方法会创建一个至少包含bootstrap.servers属性的producer,换方向思考; - 编译源码的过程中发现项目依赖了"Shopify/sarama",想到之前看到过相关问题,排查后发现所用的二进制文件是用旧版本代码构建的,最新的
prometheus-kafka-adapter
连接kafka用的库是"confluentinc/confluent-kafka-go",而不是"Shopify/sarama",用最新版本的代码编译后问题解决。
踩坑总结
- kafka-console-producer.sh从2.5.0版本开始支持通过"–bootstrap-server"参数描述broker列表,并将"–broker-list"参数标记为
过时(但仍然可以继续使用);- “confluentinc/confluent-kafka-go"的newProducer()方法会创建一个至少包含bootstrap.servers属性的producer,能否创建成功只与kafka能否解析bootstrap.servers属性有关(至少从0.8.2版本就已经支持了),而与kafka-console-producer.sh到底支不支持”–bootstrap-servers"参数无关(kafka-console-producer.sh会调用
core/src/main/scala/kafka/tools/ConsoleProducer.scala
,这个文件是从0.8.2版本开始存在的);- 1.27.1版本的"Shopify/sarama"库会导致"client has run out of available brokers to talk to"错误,参考issue;
- 看文档的时候认真点!!!
参考
- Kafka常用命令之kafka-console-producer.sh
- confluentinc/confluent-kafka-go api文档
- 你真的了解bootstrap.servers这个参数么?
- go连接Kafka报错kafka: client has run out of available brokers to talk to