【发布时间】:2017-12-26 06:28:20
【问题描述】:
我有一个 kafka 集群,由运行在 AWS 上的 3 台机器组成: kafka1 到 kafka3
我正在使用新风格的 kafka 消费者 (>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
这个想法是,如果其中一个代理出现故障,它将从轮换中移除,并从其他代理中获取元数据。它还允许我透明地向集群添加更多代理。
但是,这导致我的 kafka 客户出现问题。 PipelineDB 直接拒绝从主题中消费,Python 的 confluent 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 条目,但我遇到了一个代理关闭的问题。
【问题讨论】:
标签: apache-kafka load-balancing haproxy high-availability