为什么我不能从外面连接到卡夫卡?

时间:2014-11-28 15:01:19

标签: amazon-ec2 apache-kafka

我在ec2实例上运行kafka。所以亚马逊ec2实例有两个ips,一个是内部ip,第二个是外部使用。

我从本地机器创建了生产者,但它重定向到内部ip并给我连接失败错误。任何人都可以帮我在ec2实例上配置kafka,这样我就可以从本地机器运行生产者了。我尝试了许多组合,但没有工作。

8 个答案:

答案 0 :(得分:36)

Kafka FAQ中,您可以阅读:

  

当代理启动时,它会在ZK中注册其ip / port。您需要确保注册的ip与生产者配置中metadata.broker.list中列出的内容一致。默认情况下,注册的ip由InetAddress.getLocalHost.getHostAddress()给出。通常,这应该返回主机的真实IP。但是,有时(例如,在EC2中),返回的ip是内部ip并且不能从外部连接。解决方案是通过在host.name中设置server.properties属性来显式设置要在ZK中注册的主机IP。在另一种罕见的情况下,绑定主机/端口与用于客户端连接的主机/端口不同,您可以为客户端连接设置advertised.host.nameadvertised.port

答案 1 :(得分:31)

我解决了这个问题,方法是将advertised.host.name中的server.propertiesmetadata.broker.list中的producer.properties设置为公共IP地址,将host.name设置为0.0.0.0

答案 2 :(得分:16)

我刚刚在AWS中做到了这一点。首先让Kafka服务器使用host.name监听正确的接口/ IP。对于您的情况,这将是内部IP,而不是localhost,因为您的意图是外部Kafka客户端连接。任何本地客户端都需要使用相同的地址,而不是localhost。

然后将advertised.host.name设置为主机名,而不是IP地址。诀窍是让主机名始终解析为内部和外部机器的正确IP。我在里面使用/ etc / hosts和在外面使用DNS。查看我的full answer about Kafka and name resolution here

答案 3 :(得分:13)

如何从外部网络中的消费者访问EC2上的Kafka服务器(版本kafka_2.11-1.0.0)的最简单方法是更改​​属性文件

kafka_2.11-1.0.0/config/server.properties

并修改以下行

listeners=PLAINTEXT://ec2-XXX-XXX-XXX-XXX.eu-central-1.compute.amazonaws.com:9092

使用您的公共地址

在2.11-2.0.0上验证

答案 4 :(得分:1)

下面是从EC2实例外部连接Kafka的步骤。

  1. 在EC2上打开Kafka服务器属性文件。

    /kafka_2.11-2.0.0/config/server.properties

  2. 将advertised.listeners的值设置为

      

    advertised.listeners = PLAINTEXT://ec2-xx-xxx-xxx-xx.compute-1.amazonaws.com:9092

    这应该是您的EC2实例的公共DNS(IPv4)。

  3. 停止Kafka服务器。

  4. 启动Kafka服务器以查看上面的配置更改。

  5. 现在,您可以从外部或从本地主机连接到EC2实例的Kafka。

    在kafka_2.11-2.0.0上进行了测试并经过测试

答案 5 :(得分:1)

如果要从LAN访问,请更改以下2个文件-

  1. config/server.properties中:

    advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
    
  2. config/producer.properties中:

    bootstrap.servers=server.ip.in.lan:9092
    

在我的情况下,server.ip.in.lan的值为192.168.15.150

答案 6 :(得分:0)

SSH到您的EC2实例,或者无论您托管的是Kafka。

sudo nano /etc/hosts

添加:

127.0.0.1 <your-host-name> localhost

在我的情况下是:

127.0.0.1 ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com

保存并退出。

答案 7 :(得分:-1)

对于EC2,您应编辑/etc/hosts文件以添加:

XXX.XXX.XXX.XXX ip-YYY-YYY-YYY-YYY

其中XXX ...是您的外部IP,而ip-YYY-YYY-YYY-YYY是hostname命令返回的字符串。您可以使用127.0.0.1而不是外部IP来在服务器内部进行通信。

host.namedeprecated-advertised.host.nameadvertised.port