为啥我无法从外部连接到 Kafka?
Posted
技术标签:
【中文标题】为啥我无法从外部连接到 Kafka?【英文标题】:Why I cannot connect to Kafka from outside?为什么我无法从外部连接到 Kafka? 【发布时间】:2015-01-27 06:31:18 【问题描述】:我在 ec2 实例上运行 kafka。所以亚马逊 ec2 实例有两个 ip,一个是内部 ip,第二个是外部使用。
我从本地机器创建生产者,但它重定向到内部 ip 并给我连接不成功的错误。谁能帮我在 ec2 实例上配置 kafka,以便我可以从本地机器运行生产者。我尝试了很多组合,但没有奏效。
【问题讨论】:
为可见性添加标签 【参考方案1】:在Kafka FAQ(针对新属性进行了更新)您可以阅读:
代理启动时,会在 ZK 中注册其 ip/port。您需要确保注册的 ip 与生产者配置中
bootstrap.servers
中列出的内容一致。默认情况下,注册的 ip 由InetAddress.getLocalHost.getHostAddress()
给出。通常,这应该返回主机的真实 IP。但是,有时(例如,在 EC2 中),返回的 ip 是内部 IP,无法从外部连接。解决方案是通过设置server.properties
中的advertised.listeners
属性,显式设置要在ZK中注册的主机ip和端口。
【讨论】:
只是想注意 server.properties 中提到的主机名属性被称为:host.name=<external-ip>
我在极少数情况下:In another rare case where the binding host/port is different from the host/port for client connection, you can set advertised.host.name and advertised.port for client connection.
。我该怎么做?
这是“host.name”而不是“hostname”。
host.name
是 deprecated - 同样是 advertised.host.name
和 advertised.port
@c0de 已弃用意味着它不会永远有效,但目前有效【参考方案2】:
我解决了这个问题,将server.properties
中的advertised.host.name
和producer.properties
中的metadata.broker.list
设置为公共IP 地址,将host.name
设置为0.0.0.0
。
【讨论】:
@ sms_1190 ..嗨..我也面临同样的问题。我已经设置了在 ec2 linux 中运行的 kafka。我已经在安装在 windows 机器上的 eclipse 中编写了 java 代码。我能够在 eclipse 中创建事件,但我在 ec2 中运行的 kafka 生产者中看不到它们。如何在windows的maven中连接你的eclipse或kafka代码来连接ec2 linux。我已经修改了 kafka 服务器配置中的 Advertisementd.host.name 和 Advertisementd.port 以及生产者中的 metadata.broker.list 作为 pub ip:0000。 @user3858193:检查您在 ec2 中的安全组。您应该将 9092 端口打开到 0.0.0.0/0。 1) 您能否在此处粘贴(这两行)您在 server.properties 和 producer.properties 中所做的实际更改。 2)您使用的是哪个kafka版本?提前致谢! @sms_1190 你的 Windows 机器上是否有任何属性文件,或者每个配置文件都只在 EC2 上?再次感谢。 这绝对解决了一个星期断头的问题。击掌!谢谢!【参考方案3】:我刚刚在 AWS 中完成了这项工作。首先让 Kafka 服务器使用 host.name 监听正确的接口/IP。对于您的情况,这将是内部 IP,而不是 localhost,因为您的意图是让外部 Kafka 客户端连接。任何本地客户端都需要使用相同的地址,而不是 localhost。
然后将 Advertisementd.host.name 设置为主机名,而不是 IP 地址。诀窍是让该主机名始终解析为内部和外部机器的正确 IP。我在内部使用 /etc/hosts,在外部使用 DNS。见我的full answer about Kafka and name resolution here。
【讨论】:
【参考方案4】:如何从外部网络中的消费者访问 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 验证
【讨论】:
起到了魅力 :-) ... 感谢 P. Koncz。你也可以通过命令行覆盖它--override listeners=PLAINTEXT://ec2-XXX-XXX-XXX-XXX.eu-central-1.compute.amazonaws.com:9092
您好,我已经在 Azure VM 上安装了 confluent-oss-5.0.0,我正在尝试通过公共 IP 访问以使用消息。端口打开。不走运,在更改了您的所有建议后它不起作用。出现以下错误:~/confluent-kafka/confluent-oss-5.0.0/bin$ kafka-console-producer --broker-list 13.71.115.20:9092 --topic pj_test123 >sdf [2019-03-25 18:23 :11,288] WARN [Producer clientId=console-producer] 获取相关 ID 为 1 的元数据时出错:pj_test123=LEADER_NOT_AVAILABLE (org.apache.kafka.clients.NetworkClient)【参考方案5】:
对于 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.name
是 deprecated - advertised.host.name
和 advertised.port
也是如此
【讨论】:
另见:github.com/ModernMT/MMT/issues/276#issuecomment-334099367 这是一个 hack,不正确。advertised.listeners
是正确的。客户端应该从 Zookeeper 获取地址,而不是本地机器的主机文件。【参考方案6】:
以下是从 EC2 实例外部连接 Kafka 的步骤。
在 EC2 上打开 Kafka 服务器属性文件。
/kafka_2.11-2.0.0/config/server.properties
将adverted.listeners的值设置为
advertised.listeners=PLAINTEXT://ec2-xx-xxx-xxx-xx.compute-1.amazonaws.com:9092
这应该是您的 EC2 实例的公共 DNS (IPv4)。
停止 Kafka 服务器。
启动 Kafka 服务器以查看上述配置更改的实际效果。
现在您可以从外部或本地连接到 EC2 实例的 Kafka。
在 kafka_2.11-2.0.0 上进行了尝试和测试
【讨论】:
【参考方案7】:如果你想从局域网访问,请更改以下2个文件-
在config/server.properties
:
advertised.listeners=PLAINTEXT://server.ip.in.lan:9092
在config/producer.properties
:
bootstrap.servers=server.ip.in.lan:9092
在我的例子中,server.ip.in.lan
的值是 192.168.15.150
【讨论】:
【参考方案8】: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
保存并退出。
【讨论】:
以上是关于为啥我无法从外部连接到 Kafka?的主要内容,如果未能解决你的问题,请参考以下文章
在 dockerized 环境中无法从 Flask 连接到 Kafka