Collectd结合write_kafka插件向Kafka写入数据失败问题求助
从你的日志信息里,关键错误已经很明确了:
[2019-11-19 10:46:00] [thrd:2997bc280c89:9092/0]: 2997bc280c89:9092/0: Failed to resolve '2997bc280c89:9092': Name or service not known
这说明Collectd的write_kafka插件依赖的rdkafka客户端,在尝试和Kafka broker建立实际连接时,无法解析Kafka返回的broker主机名2997bc280c89。Kafka默认会把自己的对外暴露主机名返回给生产者,而如果这个主机名在Collectd所在机器的DNS或hosts文件里没有对应映射,就会导致解析失败——这也是为什么topic能创建(初始元数据请求可能成功),但实际数据写不进去的原因。
具体解决步骤:
1. 先确认Kafka的对外监听配置
打开Kafka的server.properties配置文件,查找advertised.listeners(如果该配置不存在则看listeners):
cat /path/to/kafka/config/server.properties | grep -E 'advertised.listeners|listeners'
你大概率会看到类似这样的配置:
advertised.listeners=PLAINTEXT://2997bc280c89:9092
这里的2997bc280c89就是Kafka对外告知的主机名,Collectd机器无法解析它。
2. 选择以下两种修复方案之一:
方案A:在Collectd机器添加hosts映射
编辑/etc/hosts文件,把Kafka的主机名映射到它的实际IP(如果是本地部署Kafka,IP就是127.0.0.1):
echo "127.0.0.1 2997bc280c89" >> /etc/hosts
然后重启Collectd服务:
systemctl restart collectd
方案B:修改Kafka的对外暴露地址为可解析值
修改Kafka的server.properties,将advertised.listeners设置为Collectd能正常解析的地址——比如本地部署就用localhost,或者机器的真实IP:
advertised.listeners=PLAINTEXT://localhost:9092 # 也可以用实际IP:advertised.listeners=PLAINTEXT://192.168.x.x:9092
保存配置后重启Kafka服务:
systemctl restart kafka
最后重启Collectd,就能正常向Kafka写入数据了。
3. 额外验证步骤
可以在Collectd机器上先测试能否解析这个主机名,确认配置生效:
# 用nslookup测试解析 nslookup 2997bc280c89 # 或者用ping测试连通性 ping 2997bc280c89
内容的提问来源于stack exchange,提问作者Yvus

