首先对这篇长文表示歉意(这也是超级用户的问题,因为我不确定这篇文章的最佳发布地点https://serverfault.com/questions/953357/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 个关键引述很有帮助:
当连接到代理时,返回给客户端的侦听器将是您连接到的侦听器(基于端口)。
然后,当我与某人讨论这个问题并且正在讨论单个负载均衡器时,我突然灵光一闪......现在端口专用目标组上一切都很好。