Apache kafka 强制卡夫卡通过IP而不是主机名连接代理
我们有以下kafka ssh隧道设置Apache kafka 强制卡夫卡通过IP而不是主机名连接代理,apache-kafka,ssh-tunnel,kafkacat,Apache Kafka,Ssh Tunnel,Kafkacat,我们有以下kafka ssh隧道设置 ssh-N$JUMPHOST-l2181:w.x.y.z:2181-l9092:a.b.c.d:9092-l9091:e.e.f.f:9092 代理IP为a.b.c.d,存在具有相同IP地址的本地lo0设备别名 zookeper IP为w.x.y.z,存在具有相同IP地址的本地设备别名 卡夫卡霍斯特“入口”主持人是e.e.f.f 我们计划的用例是kafkacat-C-b localhost:9091-t 问题: 但是,连接到kafka主机/zookepe
ssh-N$JUMPHOST-l2181:w.x.y.z:2181-l9092:a.b.c.d:9092-l9091:e.e.f.f:9092
- 代理IP为a.b.c.d,存在具有相同IP地址的本地lo0设备别名
- zookeper IP为w.x.y.z,存在具有相同IP地址的本地设备别名
- 卡夫卡霍斯特“入口”主持人是e.e.f.f
kafkacat-C-b localhost:9091-t
问题:
但是,连接到kafka主机/zookepers可以正常工作
kafka客户端(例如kafkacat)通过其主机名(ip-a.b.c.d.eu-central-1.compute.internal)而不是通过其ip访问代理
为了抵消这个影响,我在/etc/hosts中添加了条目
a.b.c.d ip-a.b.c.d.eu-central-1.计算内部
还是不行,
尽管ping到该主机名是成功的
Nslookup给出
Non-authoritative answer:
Name: ip-a.b.c.d.eu-central-1.compute.internal
Address: a.b.c.d
** server can't find ip-a.b.c.d.eu-central-1.compute.internal: NXDOMAIN
问题:
有没有办法告诉卡夫卡通过IP而不是主机名连接经纪人?
如果没有,启动本地dns服务器是否可以解决问题?这里发生的是:
ip-a.b.c.d.eu-central-1.compute.internal
,因为这是代理的主机名,也是侦听器的默认值。(这是键)
/etc/hosts
上设置该值,则将修复地址解析问题;客户机现在将能够到达集群,解决以前的网络问题
以下步骤涉及卡夫卡在您的脸上回复448\u
错误代码(确切的代码名可能不同)。您的请求再次失败,现在在集群端:您的客户请求一个名为/引用的a.b.c.d
,但没有使用该名称注册的侦听器,因为其标识符仍然是ip-a.b.c.d.eu-central-1.compute.internal
此处的键位于
服务器.properties
配置文件中的播发的.listeners
属性中。
为了使客户端能够连接,请修改该属性,直接在其中设置ip或可解析dns(本例中使用ip):
广告。监听器=纯文本://a.b.c.d:9092
现在在客户端,只需使用IP即可与代理连接:
bootstrap.servers=a.b.c.d:9092
当收到来自客户端的请求时,kafka会将
bootstrap.servers
的内容识别为其注册的侦听器之一,从而接受连接。找到了解决方法。如果有人可能会遇到我的问题,请在此发帖
步骤如下:
- 为您计划使用的所有主机创建虚拟别名,
sudo ip添加一个dev lo$ip
- 这些别名不应具有相同的代理/zookeper IP,但应具有127.0.j.k格式
- 添加
<-->ip-..eu-central-1.compute.internal
映射到127.0.[].]
/etc/hosts
- 通过SSH创建隧道,考虑broker/zookeper的IP和本地(别名)IP的关系
ssh-N$JUMPHOST-L 2181:::2181-L 9092:::9092…
然后,您可以通过
kafkacat-C-b127.0.[]:9092-t
感谢您深入研究我的复杂问题。我会问我们的devOps团队是否可以更改它,但是我找到了另一个解决方案,我会发布它,以备有人需要。有关广告的更多信息,请参阅此处的回答。侦听器工作原理:为什么不编辑广告的。侦听器以返回IP地址?@OneCricketeer是,这是前面提到的。我会让我们的DevOps看看他们是否能做到,但通常他们对任何更改都非常保守:)否则,是的,compute。例如,内部的
DNS名称需要通过ELB在外部映射