给kafka配置外部连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给kafka配置外部连接相关的知识,希望对你有一定的参考价值。

参考技术A 在公司的测试环境中,有的应用需要远程连接kafka,本地有时也是需要连接到kafka进行Debug,这就需要将kafka配置成外部可连接。想要实现这种效果,有两种实现方法,第一种方法是将所有kafka的连接都配置成公网IP连接。第二种方法是采用kafka的内外分离配置。方法一虽然能够实现kafka的外部连接,可是服务器上面对kafka的连接也会默认使用公网IP的方式连接,而不是内网,这样会给实例的公网带宽带来很大的压力,应用一多,就会造成实例无法进行登录。而方法二就可以有效的避免这种现象了,它是将云上本地应用采用内网来连接kafka,而同时又采用不同的端口配置外网连接,这样能够有效的减少公网带宽的压力。

在原有配置的基础上加上或者更改如下配置,配置接受外网连接的端口为9093,同时打开安全组的9093端口,配置过后通过重启kafka即可通过9093在本地连接kafka。

listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT主要分别定义内部和外部连接采用的安全协议
listeners=INTERNAL://<内网IP>:9092,EXTERNAL://0.0.0.0:9093主要是定义内部和外部连接监听的地址端口
advertised.listeners=INTERNAL://<内网IP>:9092,EXTERNAL://<外网IP>:9093主要是提交给zookeeper来实现对kafka内部和外部的连接,最开始改配置只是配置了外部的连接,没有内部的连接,所以对kafka的连接都是通过外部连接。
inter.broker.listener.name=INTERNAL主要是制定kafka集群内部broker之前通过INTERNAL的配置来进行内部通讯。

参考连接:
http://www.devtalking.com/articles/kafka-practice-16/

为啥我无法从外部连接到 Kafka?

【中文标题】为啥我无法从外部连接到 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=&lt;external-ip&gt; 我在极少数情况下: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.nameadvertised.port @c0de 已弃用意味着它不会永远有效,但目前有效【参考方案2】:

我解决了这个问题,将server.properties 中的advertised.host.nameproducer.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.nameadvertised.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 &lt;your-host-name&gt; localhost

在我的情况下是:

127.0.0.1 ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com

保存并退出。

【讨论】:

以上是关于给kafka配置外部连接的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法从外部连接到 Kafka?

Kafka 将 Debezium 与 ms sql 服务器连接起来。密钥提取配置问题

Kafka配置SSL(云环境)

是否有开源 Kafka Cassandra 连接器配置的示例示例?

kafka参数配置

Flink(1.12.1)日志配置Logback实现日志切分和kafka发送