我有一个 kafka 集群,由 3 台在 AWS 上运行的机器组成:
卡夫卡1到卡夫卡3
我正在使用新型卡夫卡消费者(>0.8)。
我知道kafka客户端连接到其中一台kafka服务器,获取服务器元数据,然后直接连接到代理。
我想确保在代理发生故障的情况下,客户端仍然能够获取元数据。
为此,我有一个具有以下配置的 HAProxy 负载均衡器:
listen kafka
bind *:9092
mode tcp
balance roundrobin
no option clitcpka
option forceclose
timeout check 5s
server kafka1 kafka1.example.com:9092 check inter 3s fastinter 1s
server kafka2 kafka2.example.com:9092 check inter 3s fastinter 1s
server kafka3 kafka3.example.com:9092 check inter 3s fastinter 1s
这个想法是,如果其中一个经纪人出现故障,它将被从轮换中删除,并且从其他经纪人之一获取元数据。它还允许我透明地向集群添加更多代理。
然而,这给我的卡夫卡客户带来了问题。 PipelineDB 直接拒绝从主题消费,Python 的融合 kafka 库也是如此。 Kafkacat 消费,但一段时间后开始出现错误:
% ERROR: Local: Broker transport failure: kafka.example.com:9092/bootstrap: Receive failed: Disconnected
% ERROR: Local: Broker transport failure: kafka.example.com:9092/bootstrap: Connection closed
我在网上找不到任何有关如何负载平衡 Kafka 引导程序的信息。另一种方法是仅配置具有多个 A 记录的 DNS 条目,但我遇到了其中一个代理关闭的问题。