总而言之,解决方案是通过NAT添加路由,以便机器可以访问自己的外部IP地址。
Zookeeper使用它在advertised.host.name中找到的地址来告诉客户端在哪里可以找到代理以及与代理本身进行通信。报告的错误并没有使这一点变得非常清楚,而且令人困惑,因为客户端打开TCP连接没有问题。
对于最新版本的Kafka(撰写本文时为0.10.0),您不想使用 advertised.host.name 一点都不实际上,即使是[文档]也说明了这一点 advertised.host.name 已被弃用。此外,Kafka不仅将其用作生产者/消费者的“广告”主机名,而且还用于 其他经纪人 (在多代理环境中)...如果您使用不同的(可能是内部的)DNS代理经理,那会很痛苦......而且您真的不想进入这个行业向个人添加条目 /etc/hosts 经纪人(ew!)
advertised.host.name
/etc/hosts
因此,基本上,您希望经纪人使用内部名称,但为生产者和消费者使用外部FQDN 只要 。为此,您将进行更新 advertised.listeners 代替。
advertised.listeners
将advertised.host.name设置为主机 名称 ,而不是IP地址。默认是返回a 的 FQDN 强> 使用getCanonicalHostName(),但这只是尽力而为,并回退到IP。见 用于getCanonicalHostName()的java文档 。
诀窍是让主机名始终解析为正确的IP。对于小型环境,我通常会在/ etc / hosts中设置所有内部IP的所有主机。这样,所有机器都知道如何通过内部网络按名称相互通信。实际上,现在也要按名称配置Kafka客户端,而不是IP。如果管理所有/ etc / hosts文件是一个负担,那么设置一个内部DNS服务器来集中它, 但内部DNS应该返回内部IP 。这些选项中的任何一个都应该比在各种机器上的各种配置文件中分散IP地址的工作少。
一旦所有内容都按名称进行通信,剩下的就是使用外部IP配置外部DNS,一切正常。这包括使用服务器配置Kafka客户端 名 而不是IP。
CONF / server.properties: 主机名 弃用:仅在何时使用 listeners 没有设定。使用 listeners 代替。经纪人的主持人。如果设置了此选项,则只会绑定到此地址。如果未设置,则将绑定到所有接口
listeners
从上面获取提示:对于我的单个节点(在学习的同时),我修改了带有文本的server.properties文件 “advertised.host.name” 至 value=127.0.01 。所以最后它看起来像这样
value=127.0.01
advertised.host.name = 127.0.0.1
在启动制作人时,它仍会显示警告,但现在它至少可以工作,而我可以看到消费者终端上的消息完全正常
在安装了Kafka的计算机上,检查它是否已启动并正在运行。错误状态,0个代理可用,这意味着Kafka没有启动并运行。
在linux机器上,您可以使用netstat命令检查服务是否正在运行。
netstat -an | grep port_kafka_is_Listening(默认为9092)