1

我们有以下 kafka-ssh-tunneling 设置。

ssh -N $JUMPHOST -L 2181:w.x.y.z:2181 -L 9092:a.b.c.d:9092 -L 9091:e.e.f.f:9092

  • 代理 IP 为abcd,有本地 lo0 设备别名与相同的 IP 地址
  • zookeper IP 为wxyz , 有相同 IP 地址的本地设备别名
  • kafkahost“入门”主机是eeff

我们计划的用例是kafkacat -C -b localhost:9091 -t <topic>

问题: 连接到 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.compute.internal

仍然无法正常工作,尽管 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

问题: 有没有办法告诉 kafka 通过 IP 而不是通过主机名连接代理?如果没有,启动本地 dns 服务器是否可以解决问题?

4

2 回答 2

2

这里发生的是:

  1. 代理收到来自客户端的请求并返回他ip-a.b.c.d.eu-central-1.compute.internal,因为这是代理的主机名和侦听器的默认值。这是关键

  2. 您的客户端尝试使用提供的元数据将数据发送到代理。但是由于它无法解决ip-a.b.c.d.eu-central-1.compute.internal,它甚至没有到达集群就失败了,这是由 Kafka 范围之外的网络问题引起的。

    如果您将值设置为/etc/hosts,您将解决地址解析问题;客户端现在可以访问集群,解决了之前的网络问题。

    以下步骤涉及 Kafka 回复448_in_your_face错误代码(确切的代码名称可能不同)。您的请求再次失败,现在在集群端:您的客户端正在请求一个名为/referenced a.b.c.d的代理,但没有使用该名称的注册侦听器,因为它的标识符仍然是 ip-a.b.c.d.eu-central-1.compute.internal


这里的关键在advertised.listeners属性内,位于server.properties配置文件中。为了让您的客户端能够连接,修改该属性,直接在那里设置 ip,或可解析的 dns(在此示例中使用 IP):

advertised.listeners=PLAINTEXT://a.b.c.d:9092

现在在客户端,只需使用 IP 来连接代理:

bootstrap.servers = a.b.c.d:9092

当收到来自客户端的请求时,kafka 会将 的内容识别 bootstrap.servers为其注册的侦听器之一,从而接受连接。

于 2020-12-05T23:28:40.487 回答
0

找到解决方法。在这里发帖如果有人可能会遇到我的问题。

步骤如下:

  • 为您计划使用的所有主机创建虚拟别名,sudo ip add a dev lo $ip
  • 这些别名不应具有相同的代理/zookeper IP,而是127.0.jk格式
  • 添加ip-<>.<>.<>.<>.eu-central-1.compute.internal<-->127.0.[].[]映射到/etc/hosts
  • 通过 SSH 创建隧道,考虑代理/zookeper 的 IP 和您的本地(别名)IP 的关系

ssh -N $JUMPHOST -L 2181:<localIP>:<remoteIP>:2181 -L 9092:<localIP>:<remoteIP>:9092 ...

然后你可以通过 kafkacat -C -b 127.0.[].[]:9092 -t <topic>

于 2020-12-06T03:54:59.347 回答