【问题标题】:How to load balance Kafka Boostrap with haproxy?如何使用 haproxy 负载均衡器 Kafka Bootstrap?
【发布时间】: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


    【解决方案1】:

    只需将所有三个引导服务器指定为逗号分隔列表。然后,如果一个发生故障,它将只查询下一个以获取元数据。

    【讨论】:

    • 如果我想添加第四个而不更改应用程序配置怎么办?
    • 您不需要列出引导服务器列表中的每个代理。它只是节点子集的简短列表,以便您的客户端可以查询其中一个以获取整个集群的元数据。您的客户端仍然可以发现并连接到集群中的所有其他节点
    • 这个问题仍然有效。如果我一个一个地更换所有的borkers怎么办?仍然需要向客户端发送更新的代理列表来填充他们的配置。这有点让人无法接受。此外,kafka 文档建议像这样创建一个负载平衡的 VIP 来解决问题……但它需要工作,而 OP 无法使其工作。
    • 如果您用新的代理替换现有代理,您应该始终为新代理提供与其替换的代理相同的代理 ID 和身份。否则它不会从集群中的其他节点同步它的所有分区,如果你这样做 3 次,你最终会丢失所有数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-04-12
    • 2021-12-07
    • 2016-08-13
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多