【发布时间】:2015-09-30 08:21:25
【问题描述】:
是否可以对 MQTT 代理进行负载平衡?我可以使用 ELB 对 MQTT 进行负载均衡吗?朝这个方向的任何指示都会有所帮助。我找到了http://www.slideshare.net/kellogh/mqtt-kafka-33100776,但没有多大帮助。
【问题讨论】:
标签: load-balancing mqtt amazon-elb
是否可以对 MQTT 代理进行负载平衡?我可以使用 ELB 对 MQTT 进行负载均衡吗?朝这个方向的任何指示都会有所帮助。我找到了http://www.slideshare.net/kellogh/mqtt-kafka-33100776,但没有多大帮助。
【问题讨论】:
标签: load-balancing mqtt amazon-elb
大多数 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 的公司工作。
【讨论】:
使用 HAProxy。一个免费、快速和可靠的解决方案,为基于 TCP 和 HTTP 的应用程序提供高可用性、负载平衡和代理。它适用于流量非常大的网站。
【讨论】:
您不能像对 Web 服务器进行负载平衡一样对 MQTT 代理进行负载平衡! LB 解决方案必须在 MQTT 主题字段上保持连接,而不是客户端的 IP:Port...否则并非所有订阅者都会收到已发布的消息。 “发布者”消息只会发送到单个 MQTT 代理,因此只有该代理会重新发送消息。如果同一 MQTT 主题的“订阅者”转到不同的代理,它将不会接收来自连接到其他代理的发布者的消息。当然,您可以桥接您的 MQTT 代理,以便它们都收到消息,但是对它们进行 LB-ing 又有什么意义呢?那时您并没有真正缩放它们,这可能就是您首先要对它们进行 LB 的原因。 F5 BIG-IP 可用于执行真正的 MQTT LB,如果您创建 iRule 脚本来执行 LB 决策 关于 MQTT 主题。今天有公司在这样做。
【讨论】:
(添加到@JD Allens 响应)如果您在 MQTT(订阅)等服务器上保持状态,负载平衡 MQTT 或 TCP 通常不会按预期工作。例如,如果您在 LB 后面有两个 MQTT 后端服务器,那么您的一半 MQTT 客户端将连接到一个 MQTT 代理,另一半连接到另一个。由于这两个代理没有以任何方式相互连接,因此客户端将不知道另一个代理中发生的事情(订阅和发布)。你有两个选择:
只需配置将所有连接定向到单个代理的负载均衡器,并且仅在出现错误时故障转移到另一个代理。在给定时间应该只有一个代理启动(这本身不是负载平衡)。
使用集群的 MQTT 代理,如 HiveMQ、EMQX 等。它们将互连后端代理。
【讨论】:
我更喜欢 HAProxy
而不是 AWS ELB
,因为您可以在 IaaS 或 PaaS 上获得更大的灵活性。
您可以使用 Docker 查看haproxy-mqtt。核心haproxy.cfg
文件是here。
【讨论】: