负载均衡 MQTT 代理

Load blancing MQTT broker

是否可以对 MQTT 代理进行负载平衡?我可以使用 ELB 来负载均衡 MQTT 吗?朝这个方向的任何指示都会有所帮助。我偶然发现了 http://www.slideshare.net/kellogh/mqtt-kafka-33100776,但没有太大帮助。

大多数 MQTT 代理不立即支持负载平衡 MQTT 代理。不过,有可用的代理支持集群。查看 this list 以找出适合您的集群要求的代理。

此博客 post 有点过时,但如果您想了解 MQTT 代理集群,可能仍然有用:http://www.hivemq.com/building-a-high-availability-mqtt-cluster/

回答您的问题:MQTT 代理 HiveMQ 与 AWS ELB 完美配合,可跨多个可用性区域实现负载平衡。您可能希望将 TCP 连接的默认 ELB 超时增加到您用于应用程序的 MQTT 保持活动时间。如果需要,您甚至可以使用 Auto Scaling 组进行弹性扩展。 HiveMQ 可以使用 S3 来发现其他集群节点,因此您可以在运行时添加和删除集群节点。

我不知道其他代理是否可以与 AWS ELB 无缝协作。如果 HiveMQ 不适合您的需求,最好是在上面链接的列表中搜索代理并尝试一下:)

免责声明:我在开发 HiveMQ 的公司工作。

使用HAProxy。一个免费、快速和可靠的解决方案,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载平衡和代理。它适用于非常高流量的网站。

我更喜欢 HAProxy 而不是 AWS ELB,因为您可以在 IaaS 或 PaaS 上获得更大的灵活性。

可以看到haproxy-mqtt using Docker. The core haproxy.cfg file is here.

您不能像对 Web 服务器进行负载平衡那样对 MQTT 代理进行负载平衡! LB 解决方案必须保持 MQTT 主题字段上的连接,而不是客户端的 IP:Port...否则并非所有订阅者都会收到已发布的消息。 'Publisher' 消息仅发送到单个 MQTT Broker,因此只有该 Broker 会重新发送消息。如果同一 MQTT 主题的 'Subscriber' 转到不同的 Broker,它将不会从连接到其他 Broker 的 Publisher 接收消息。当然,您可以桥接您的 MQTT 代理,以便它们都能收到消息,但是 LB-ing 它们有什么意义呢?那时您并没有真正缩放它们,这可能就是您首先要 LB 它们的原因。 F5 BIG-IP 可用于执行真正的 MQTT LB,IF 您创建 iRule 脚本来执行 LB 决策 关于 MQTT 主题。今天有公司在做这件事。

(添加到@JD Allens 回复)如果您在 MQTT(订阅)等服务器上保持状态,负载平衡 MQTT 或 TCP 通常不会按预期工作。例如,如果您在 LB 后面有两个 MQTT 后端服务器,则一半的 MQTT 客户端将连接到一个 MQTT 代理,另一半将连接到另一个。由于这两个 broker 没有以任何方式互连,因此客户端将不知道另一个 broker 正在发生的事情(订阅和发布)。您有两个选择:

  • 只需配置负载均衡器,将 所有 连接定向到单个代理,并且仅在出现错误时才故障转移到另一个。在给定时间只能有一个代理启动(这本身不是负载平衡)。

  • 使用集群 MQTT 代理,如 HiveMQ、EMQX 等。它们将互连后端代理。