【问题标题】:Not able to consume kafka events remotely Error: connect ECONNREFUSED 5.6.7.8:9092无法远程使用 kafka 事件错误:连接 ECONNREFUSED 5.6.7.8:9092
【发布时间】:2018-10-14 20:32:41
【问题描述】:

我已经按照此处提到的教程重新设置了我的 kafka 生产者: https://www.digitalocean.com/community/tutorials/how-to-install-apache-kafka-on-ubuntu-14-04

我正在使用 cron 将一些事件推送给生产者,并在 IP 为 1.2.3.4 的服务器上使用以下脚本

#!/usr/bin/env python
import threading, logging, time
import multiprocessing
import requests
import datetime
import json
from kafka import KafkaProducer

class CheckApis():
    apisList = {"a": "https://test.eng.com/"}
    kafkaProducer = "1.2.3.4:9092"
    kafkaTopic = "sometopic"
    producer = KafkaProducer(bootstrap_servers=kafkaProducer)
    for key, value in apisList.items():
        headers = {};
        response = requests.request("GET", value, headers=headers)
        message = {"app_name": key, "status": response.status_code, "message": "none", "timestamp": str(datetime.datetime.utcnow())}
        producer.send(kafkaTopic, json.dumps(message).encode('utf-8'));
        print (response.text)
        print (response.status_code)
    producer.close()

这很好用,我可以使用这个命令看到推送的事件:

~/kafka/bin/kafka-console-consumer.sh --zookeeper 1.2.3.4:2181 --topic sometopic --from-beginning

但是当我尝试从其他服务器(我的笔记本电脑)远程使用这些事件时,它失败并出现错误:

error: 在监听 kafka 事件时发生了一些错误错误: 连接 ECONNREFUSED 5.6.7.8:9092(这里有一些不同的 IP 不是 1.2.3.4)

这是我的消费者代码(在节点 js 中使用 kafka-node):

var ConsumerGroup = require('kafka-node').ConsumerGroup;
    var healthConsumerOption = {
        host: '1.2.3.4:2181',
        autoCommit: true,
        groupId: os.hostname(),
        sessionTimeout: 15000,
        protocol: ['roundrobin'],
        fromOffset: 'latest'
    };
    var healthConsumerGroup = new ConsumerGroup(healthConsumerOption, healthTopics);
        listenHealthEventsKafka: function(connections){
            try{
                healthConsumerGroup.on('error', onError);
                healthConsumerGroup.on('message', onMessage);
                healthConsumerGroup.on('connect', function(){
                    logger.info("Health consumer group is ready. ")
                });

                function onMessage(message){
                    var jsonData = JSON.parse(message.value);
                    console.log(message);
                };

                function onError(error){
                    logger.error("Some error occured while listening to kafka events " +error);
                }

                process.once('SIGNINT', function(){
                    async.each([healthConsumerGroup], function(consumer, callback){
                        logger.info("Closing the kafka health consumer process ");
                        consumer.close(true, callback);
                    });
                })
            }catch(error){
                logger.error("Could not connect to kafka events for build " +error);
            }
        }

我是否需要在 Kafka 服务器 (server.properties) 上进行额外配置以允许远程访问......或者我做错了什么?请帮忙。

【问题讨论】:

  • 那么它抱怨无法连接的第二个 IP 是什么?它一定是在某个地方设置的......
  • 代理的广告主机名是什么?客户端需要能够路由到那个。
  • 我不知道这个第二个 IP 来自哪里,我从来没有在我的代码中的任何地方提到过它。(它甚至不是我笔记本电脑的 IP)@Thilo
  • 我猜这是 Kafka 代理的 IP。在代理端配置。客户端从 Zookeeper 或引导代理获取此信息。如果这是一个内部网络 IP,如果没有一些深度路由或 VPN 魔法,您就无法从您的网络访问它。

标签: python node.js apache-kafka kafka-consumer-api apache-kafka-connect


【解决方案1】:

在您的 Kafka 代理 server.properties 上,您需要将 advertised.listeners 设置为 外部 IP,以便客户端可以正确连接到它。否则他们会尝试连接到内部 IP(因为 advertised.listeners 将默认为 listeners 除非明确设置)

参考:https://kafka.apache.org/documentation/#brokerconfigs

另见https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/

【讨论】:

  • 谢谢,我在 Dockerized 实例中遇到了同样的问题。
猜你喜欢
  • 2020-05-04
  • 2016-08-01
  • 2020-03-19
  • 1970-01-01
  • 2019-07-22
  • 2016-03-30
  • 2023-02-15
  • 2016-04-21
  • 2020-02-12
相关资源
最近更新 更多