【问题标题】:Force kafka to connect brokers through IPs, not via hostnames强制 kafka 通过 IP 连接代理,而不是通过主机名
【发布时间】:2021-03-17 12:35:39
【问题描述】:

我们有以下 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

  • broker IP是a.b.c.d,有本地lo0设备别名,IP地址相同
  • zookeper IP是w.x.y.z,有本地设备别名,IP地址相同
  • kafkahost“入口”主机是e.e.f.f

我们计划的用例是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 服务器是否可以解决问题?

【问题讨论】:

    标签: apache-kafka ssh-tunnel kafkacat


    【解决方案1】:

    这里发生的事情是:

    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 错误代码(确切的代码名称可能不同)。您的请求再次失败,现在在集群端:您的客户要求代理 称为/引用 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 的内容识别为其注册的侦听器之一,从而接受连接。

    【讨论】:

    • 感谢您深入了解我的复杂问题。我会请我们的 devOps 团队看看他们是否可以更改它,但是我找到了另一种解决方法作为解决方案,我会发布它以防万一有人需要它。
    • 在此处查看此答案以了解有关 ads.listeners 工作原理的更多信息:stackoverflow.com/a/44443308/2188893
    【解决方案2】:

    找到解决方法。如果有人可能会遇到我的问题,请在此处发布。

    步骤如下:

    • 为您计划使用的所有主机创建虚拟别名,sudo ip add a dev lo $ip
    • 这些别名应该具有相同的代理/zookeper IP,但是 127.0.j.k 格式
    • 添加ip-<>.<>.<>.<>.eu-central-1.compute.internal127.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>

    【讨论】:

    • 为什么不编辑 advertised.listeners 以返回 IP 地址?
    • @OneCricketeer 是的,之前提到过。我会请我们的 DevOps 看看他们是否可以做到,但通常他们对任何更改都非常保守:)
    • 否则,是的,compute.internal DNS 名称需要通过 ELB 在外部映射,例如
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2019-12-27
    • 2017-06-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多