【问题标题】:Load blancing MQTT broker负载均衡 MQTT 代理
【发布时间】:2015-09-30 08:21:25
【问题描述】:

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

【问题讨论】:

    标签: load-balancing mqtt amazon-elb


    【解决方案1】:

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

    这篇博文有点过时了,但如果您想了解 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 的公司工作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Elastic Beam 是付费应用,而 HA Proxy 是开源的。
      • 这个答案具有误导性,如果没有额外的软件,您无法对 MQTT 进行负载平衡。
      • 这个答案不正确!! HAProxy 只会在源 ip:port 上进行 LB,而不是 MQTT TOPIC!!!
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          您可以使用 Docker 查看haproxy-mqtt。核心haproxy.cfg文件是here

          【讨论】: