在前面我们讨论了对设备接入的抽象和生命周期的管理,在继续深入之前,我们先讨论一下 Maque IotHub 的扩展性问题,毕竟作为一个物联网平台,能够负载大量的设备接入,是非常重要的,我想这也是大家非常关心的问题。
在这里我把问题稍微改一下,从 IotHub 能容纳多少设备接入,改成 IotHub 能不能随着业务扩容来满足业务需求,也就是说,IotHub 是否具有可扩展性?
现在 IotHub 的组成部分有:基于 Express 的 Web API、MongoDB 和 EMQ X。如何扩展 Web 服务和搭建多节点的 MongoDB 在本课程就不赘述了,只要清楚 Web 服务和 MongoDB 都具备良好的扩展性就可以了。在这一节里我们主要讨论如何扩展 EMQ X Broker。

EMQ X 纵向扩展

纵向扩展是指单机如何更多的接入设备,EMQ X 号称单机可接入百万设备:
11.加一点扩展性 - 图1
这里我不打算验证这个说法,因为可接入数量取决于你的硬件、网络和功能(比如加载了 MongoDB 插件,那么你 MongoDB 的配置也会对 Broker 性能有影响),还取决于你的测试资源,你可能需要一些测试服务器并发,来模拟大量 Client 的接入。在这里我们只简单介绍下如何 Tuning 和测试方法。
EMQ X 提供了《Tuning Guide》,里面详细列出了需要修改的配置项,主要包括:

  • 修改操作系统参数,提高可打开的文件句柄数;
  • 优化 TCP 协议栈参数;
  • 优化 Erlang 虚拟机参数,提高 Erlang Process 限制;
  • 修改 EMQ X 配置,提高最大并发连接数。

EMQ X 提供了一个压测工具 EMQTT Benchmark,同时你也需要配置一下运行压测工具的电脑和服务器,使单机能够创建更多的连接,如果你希望测试的并发数很大,可能还需要准备多个电脑或者服务器来运行压测工具。
我的建议是加载所有需要的插件,启用 MQTTS(如果业务需要的话),在与生产环境一致的硬件,操作系统和软件环境下进行测试。最好内存够大,大量的连接会占用较多内存。

在一个 8 核 32 GB 的 Ubuntu 服务器上,在加载了全部的应用和扩展插件,使用 MQTTS 的情况下,我的数据是 15 ~ 20 万接入,系统的 load 还比较平稳。

EMQ X 横向扩展

单机的容量不管怎么样,总是有上限的, EMQ X 还支持由多个节点组成集群,所以随着业务的发展,可以接入新的 EMQ X 节点来扩容,理论上,横向扩展的上限是无穷的。
这里我会简单展示一下在 Manual 方式下建立一个、两个节点的 EMQ X 集群,以及节点如何退出集群。

除了手动的方式以外,还支持通过 etcd、Kubernetes、DNS 等方式自动集群发现,具体可以查看 EMQ X 集群配置文档

我准备了两台运行了 Ubuntu18.04 的服务器:

  • EMQX_A,公网 IP 为 52.77.224.83, 内网 IP 为 172.31.25.69;
  • EMQX_B,公网 IP 为 54.255.237.124, 内网 IP 为 172.31.22.189。

    加入集群

    首先在 EMOX_A 和 EMOX_B 上都安装 EMQ X 3.1.2。
    接着配置 Erlang 节点名,编辑/etc/emqx/emqx.conf
    EMQX_A: node.name = emqx@172.31.25.69
    EMQX_B: node.name = emqx@172.31.22.189
    分别启动 EMQ X emqx start
    然后再 EMQX_B 上运行: emqx_ctl cluster join emqx@172.31.25.69,如果不出意外的话,会得到以下输出:
    1. [EMQ X] emqx shutdown for join
    2. Join the cluster successfully.
    3. Cluster status: [{running_nodes,['emqx@172.31.25.69','emqx@172.31.22.189']}]
    在 EMQX_A 上运行:emqx_ctl cluster status,会得到以下输出: Cluster status: [{running_nodes,['emqx@172.31.22.189','emqx@172.31.25.69']}]
    说明集群已经搭建成功了。

    在 EMQX_A 上运行emqx_ctl cluster join emqx@172.31.22.189 效果是一样的。

接下来我们来看一下集群的效果,我们用一个 MQTT Client 连接到 EMQX_A 并订阅一个主题:

  1. mosquitto_sub -h 52.77.224.83 -t "/topic1" -v

然后用一个 MQTT client 连接到 EMQX_B,并向这个主题发布一个消息:

  1. mosquitto_pub -h 54.255.237.124 -t "/topic1" -m "test"

在订阅端会输出: /topic1 test
这说明这个集群是正常工作的。

节点间直接是通过 “Cookie” 的方式来认证的,在/etc/emqx/emqx.conf中使用node.cookie = emqxsecretcookie来进行配置的,集群中的节点 Cookie 需保持一致。

退出集群

可以在节点上运行:emqx_ctl cluster leave 来退出集群。 或者通过emqx_ctl cluster force-leave emqx@172.31.25.69的方式来强制 EMQX_A 退出集群。
通常我们会在 EMQ X 集群前部署一个 Load Balancer,所有的 Client 都使用 Load Balancer 的地址建立连接,Load Balancer 再和集群里的各个节点建立连接并传输数据。
一般我们可以从一个单节点或者双节点的 EMQ X 集群开始,使用压测工具来测试配置是否满足业务的要求,然后随着业务的变化,再往这个集群里添加或者减少节点,实现 EMQ X 的扩展性。
我们可以看到,Maque IotHub的组件都是可扩展的,所以Maque IotHub 也是可以扩展的,具有很好的可扩展性。

本课程的第一部分就结束了,在这一部分里面,我们实现了设备的全生命周期管理,为后续的内容打下了基础,同时也验证了 Maque IotHub 的扩展性。接入来进入课程的第二部分,上行数据处理。