【问题标题】:Cluster forming with Mosquitto broker使用 Mosquitto 代理形成集群
【发布时间】:2014-10-09 13:50:42
【问题描述】:

我正在使用Mosquitto broker 来实现 MQTT 协议。但是我无法找到在蚊子经纪人的情况下如何进行集群。一个经纪人可以服务的客户数量是否有任何限制。

【问题讨论】:

    标签: mqtt mosquitto


    【解决方案1】:

    你不能用 mosquitto 进行聚类。

    其他一些支持集群的 MQTT 代理,包括 HiveMQ。 HiveMQ 具有自动发现和分布式无主架构的弹性集群能力,并且在 AWS 或 Azure 等云提供商上运行良好。

    您可以看到支持集群here 的所有代理的完整列表。

    免责声明:我是 HiveMQ 的开发者,所以这个答案可能有偏见。

    【讨论】:

    • HiveMQ 在 Azure 上的行为如何?默认情况下,Azure VM 已阻止 ICMP,并且对于常规 Mosquitto 实例,我们会因此遇到很多断开连接。您能否确认 HiveMQ 在最新的 Azure VM 上运行良好?
    • 根据文档:“mosquitto 集群是在后端级别(redis、amqp 等)实现的。”
    • @DánielKis:我在官方文档中没有看到这一点,据我所知,mosquitto 中没有官方支持。请注意,即使您将数据库用于“集群”,您也在交易单点故障,因为它将是数据库。但这更多是理论上的问题,因为 mosquitto 不支持任何开箱即用的“后端”。
    • 你可以用mosquitto进行聚类github.com/hui6075/mosquitto-cluster)
    【解决方案2】:

    此答案的原始来源:Horizontal scaling for brokers。我刚刚添加了插件支持。

    结合 mosquitto 代理的两个功能可用于设置 n 节点集群。

    1. 蚊子桥支持。
    2. 插件支持 - mosquitto-auth-plug(1)

    桥接功能仅用于在所有 mosquitto 代理之间同步消息,而 mosquitto-auth-plugin 可用于在单个数据库后端保存授权和 ACL。

    在设置网桥时,请注意使用 in/out 网桥主题以避免转发循环 (2)。模式的格式为

    topic pattern [[[ out | in | both ] qos-level] local-prefix remote-prefix]
    

    引用 mosquitto.conf 手册页(3),对于传入的主题,桥将在模式前面加上远程前缀并订阅远程代理上的结果主题。当接收到匹配的传入消息时,将从主题中删除远程前缀,然后添加本地前缀。对于传出主题,反之亦然

    3 节点集群的示例 mosquitto.conf 如下。使用 mqtt-malaria(4) 进行负载测试,更重要的是对连接 clean_session 标志为 false 的客户端的影响,.

                                              +-------------------+
                           +------------------> BRIDGE BROKER     <------------+
                           |                  | 192.168.1.1       |            |
                           |                  +--------^----------+            |
                           |                           |                       |
                           |                           |                       |
                           |                           |                       |
      Broker A             |             Broker B      |                       |   Broker C
                           |                           |                       |
    +----------------------+--+       +----------------+--------+           +--+----------------------+
    | connection A            |       | connection B            |           | connection C            |
    |                         |       |                         |           |                         |
    | address 192.168.1.1:1883|       | address 192.168.1.1:1883|           | address 192.168.1.1:1883|
    |                         |       |                         |           |                         |
    | topic # out 2 "" A/     |       | topic # out 2 "" B/     |           | topic # out 2 "" C/     |
    | topic # in 2 ""  B/     |       | topic # in 2 ""  A/     |           | topic # in 2 ""  A/     |
    | topic # in 2 ""  C/     |       | topic # in 2 ""  C/     |           | topic # in 2 ""  B/     |
    +----------------------^--+       +----------------^--------+           +--+----------------------+
                           |                           |                       ^
                           |                           |                       |
                           |                           |                       |
                           |                   +-------+---------+             |
                           +-------------------+ HA PROXY        +-------------+
                                               +-----^--^--------+
                                                     |  |
                                                     |  |
                                                     +  +
    

    【讨论】:

    • @hardillb 我应该删除这个答案还是需要更清晰的来源归属?。
    • 很高兴能说出这个想法的来源
    • @hardillb 做到了。我这边的行为不好。是的,您在第二段中的评论链接 (2) 对读者来说并不明显。
    • 请注意,这仅涵盖代理之间的消息路由,客户端将无法在其他代理实例上恢复其持久会话,也不会接收其排队的消息。对于未完成的 QoS 1 和 2 消息流也是如此。
    • 困惑,所有的broker怎么都有sameip:sameport
    【解决方案3】:

    有 2 个(在撰写本文时)主要开源 支持大规模 MQTT 部署和集群的项目

    VerneMQ 和 EMQ 都是用 Erlang 编写的,非常适合分布式消息传递,所有复制都内置在 (Erlang) 语言的工具集部分。

    VerneMQ 有商业企业支持,而 EMQ 计划在不久的将来,这两个项目都有大公司作为赞助商支持。

    您还可以查看 HiveMQ,它是该区块中最年长的孩子,但没有付费许可证就无法使用。

    【讨论】:

      【解决方案4】:

      它不在 Dominik 提到的列表中,但 Solace Systems 有一个支持集群的 MQTT 设备。每个代理支持数十万个并发客户端连接。

      免责声明:我是 Solace 的系统工程师

      【讨论】:

        【解决方案5】:

        我为 mosquitto 解决集群问题的方法是设置一个 haproxy 前端,将代理反向代理到多个侦听代理。

        我还更进一步利用了最新版本的 mosquitto 支持的 DNS SD,并带有 -S 标志。

        但是,这种设计存在一些令人头疼的问题,即在大多数发行版上对 dnssd 和 libresolv 的应用程序支持不支持 resolv.conf 中的域和搜索字段。

        因此,如果您在遗留环境中工作,那么我建议您研究 rabbitmq、hivemq 或 redis pubsub,以获取可以硬塞到现有足迹中的更多生产级解决方案。

        【讨论】:

          【解决方案6】:

          您可以查看Bevywise IoT Platform。这是一个商业产品。这可以选择添加尽可能多的经纪人来扩大规模。这支持 MQTT 和 MQTT-SN 协议。

          免责声明:我在 Bevywise Networks 工作。

          【讨论】:

            【解决方案7】:

            您也可以查看 EMQX 是否支持 MQTT 的集群。

            EMQX MQTT Broker

            【讨论】:

              猜你喜欢
              • 2013-11-11
              • 2018-08-20
              • 2018-04-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-08-15
              • 2022-11-21
              • 2013-02-22
              相关资源
              最近更新 更多