Kafka 多个监听器

Kafka 多个监听器

首先对这篇长文表示歉意(这也是超级用户的问题,因为我不确定这篇文章的最佳发布地点https://superuser.com/questions/1404421/kafka-multiple-listeners所以如果需要关闭的话请告诉我...

我已经在 AWS 中设置了一个 Kafka 集群,其中包含以下侦听器和公布的侦听器:

KAFKA_ADVERTISED_LISTENERS:           PLAINTEXT://ds-kafka-broker0.service.local:9092,INTERNAL://:9093,PRIVATE://ds-kafka-broker0.private.awscloud.co.uk:6000,EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000
KAFKA_LISTENERS:                      PLAINTEXT://:9092,INTERNAL://:9093,PRIVATE://:6000,EXTERNAL://:7000
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT,PRIVATE:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME:     INTERNAL

我必须这样做,因为我们通过直接连接运行 AWS/On-Prem 混合环境。

在 AWS 中:

我们使用 VPCE 连接到账户内的 Kafka 集群,因此每个账户的 PRIVATE 监听器的主机都是相同的,并使用本地私有 R53 区域。

本地:

私有区域不适用于本地,因为我们无法解析位于每个 AWS 帐户中的 private.awscloud.co.uk 区域,因此我必须使用另一个区域,而 Kafka 则迫使我使用另一个侦听器和端口范围。这是外部侦听器。

由于我仍处于实施阶段,它们目前都使用纯文本,但最终都将使用相同的加密,但对于我当前的连接测试目的而言,这应该可行。作为一个具有所有附件(连接、ksql、架构等)的正在运行的集群,在 Kafka 集群 AWS 帐户内一切都运行良好。

问题:

当我使用以下producer.config设置连接到外部端口时:

bootstrap.servers=EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000,EXTERNAL://ds-kafka-broker1.dev.awscloud.co.uk:7001,EXTERNAL://ds-kafka-broker2.dev.awscloud.co.uk:7002
#security.protocol=EXTERNAL   # commented out as this is not valid in console producer
compression.type=snappy
max.block.ms=5000
linger.ms=5
max.in.flight.requests.per.connection=1
retries=5
batch.size=1000
max.request.size=10000000
acks=1
buffer.memory=67108864

并使用以下测试控制台生产者命令行:

bin/kafka-console-producer --producer.config etc/producer.properties --topic test-create-remote --broker-list EXTERNAL://ds-kafka-broker0.dev.awscloud.co.uk:7000,EXTERNAL://ds-kafka-broker1.dev.awscloud.co.uk:7001,EXTERNAL://ds-kafka-broker2.dev.awscloud.co.uk:7002

初始连接发生在 7000 上,但随后 Kafka 向客户端报告它应该使用 PRIVATE 侦听器,并且流量重新连接到 6000 私有端口范围(通过 tcpdump 确认)。

当您从 AWS 账户内连接时,这没问题,因为这就是此端口范围和侦听器的用途,但从客户端的角度来看,我似乎无法控制使用哪个侦听器。在这种情况下,来自本地的连接失败,因为我无法解析私有地址,即使我可以,我也无法连接到端口。

这也让我想知道为什么我会得到私人听众...如果我无法控制的话为什么不是内部或明文的听众?

希望所有这些都是有意义的,并且任何指示都值得赞赏。

答案1

我只是想发布一下我的解决方案。这与 Kafka 配置无关!

这是在 AWS ECS(EC2,不是 Fargate)上运行的,由于目前每个任务限制为 1 个目标组,因此在后台为两个侦听器(6000 和 7000)使用 1 个目标组。这个目标组是 6000 端口,所以它将 7000 转换为 6000,因此我总是得到相同的侦听器。

这篇博文(https://rmoff.net/2018/08/02/kafka-listeners-explained/) 很有帮助,但还不足以解决我的问题,但其中有 1 个关键引述很有帮助:

当连接到代理时,返回给客户端的侦听器将是您连接到的侦听器(基于端口)。

然后,当我与某人讨论这个问题并且正在讨论单个负载均衡器时,我突然灵光一闪......现在端口专用目标组上一切都很好。

相关内容