不久前,开源的大规模分布式物联网MQTT消息服务器EMQX 5.0 正式发布:单集群支持 1 亿 MQTT 连接。
这一最新的里程碑版本采用新的后端存储架构Mria数据库,并重构了数据复制逻辑,因此EMQX 5.0水平扩展能力得到了指数级提升,能够更可靠地承载更大规模的物联网设备连接量。
在EMQX5.0正式发布前的性能测试中,我们通过一个23节点的EMQX集群,全球首个达成了1亿MQTT连接+每秒100万消息吞吐,这也使得EMQX 5.0成为目前为止全球最具突出扩展性的MQTT Broker。
1亿MQTT连接性能测试结果
本文将对使EMQX水平扩展能力得到指数级提升的全新底层架构进行详细解析,帮助大家理解EMQX 5.0集群扩展的技术原理,以及在不同的实际应用场景中如何选择合适的部署架构,实现更加可靠的设备接入与消息传输。
Mnesia介绍
EMQX 4.x版本存储采用的是Erlang/OTP自带的分布式数据库Mnesia,它具备以下优点:
在Mnesia集群中,所有节点都是平等的。它们中的每一个节点都可以存储一份数据副本,也可以启动事务或执行读写操作。
Mnesia集群使用全网状拓扑结构:即每个节点都会与集群中其它所有的节点建立连接,每个事务都被会复制到集群中的所有节点。如下图所示:
Mnesia的问题
正如我们上面所讨论的,Mnesia数据库有很多非常显著的优点,EMQX也从中获得了非常大的收益。但其全连接的特性,限制了其集群的水平扩展能力,因为节点之间的链接数量随着节点数量的平方而增长,保持所有节点完全同步的成本越来越高,事务执行的性能也会急剧下降。
这意味着EMQX的集群功能有以下限制:
尽管如此,EMQX凭借独特的架构设计和Erlang/OTP强大的功能特性,实现了单个集群1000万MQTT连接的目标。同时,EMQX能够以集群桥接的方式,通过多个集群承载更大规模的物联网应用。
但随着市场的发展,单个物联网应用需要承载越来越多的设备和用户,EMQX需要具备更强大的扩展性和接入能力,以支持超大规模物联网应用。
Mria是Mnesia的一个开源扩展,为集群增加了最终的一致性。前文所述的大多数特性仍然适用于它,区别在于数据如何在节点间进行复制。
Mria从全网状拓扑结构转向网状+星型状拓扑结构。每个节点承担两个角色中的一个:核心节点(Core)或复制者节点(Replicant)。
Core和Replicant节点行为
Core节点的行为与4.x中的Mnesia节点一致:Core节点使用全连接的方式组成集群,每个节点都可以发起事务、持有锁等。因此,EMQX 5.0仍然要求Core节点在部署上要尽量的可靠。
Replicant节点不再直接参与事务的处理。但它们会连接到Core节点,并被动地复制来自Core节点的数据更新。Replicant节点不允许执行任何的写操作。而是将其转交给Core节点代为执行。
另外,由于Replicant会复制来自Core节点的数据,所以它们有一份完整的本地数据副本,以达到最高的读操作的效率,这样有助于降低EMQX路由的时延。
我们可以将这种数据复制模型当做无主复制和主从复制的一种混合。这种集群拓扑结构解决了两个问题:
由于Replicant节点不参与写操作,当更多的Replicant节点加入集群时,写操作的延迟不会受到影响。这允许创建更大的EMQX集群。
另外,Replicant节点被设计成是无状态的。添加或删除它们不会导致集群数据的丢失、也不会影响其他节点的服务状态,所以Replicant节点可以被放在一个自动扩展组中,从而实现更好的DevOps实践。
出于性能方面的考虑,不相干数据的复制可以被分成独立的数据流,即多个相关的数据表可以被分配到同一个RLOG Shard(复制日志分片),顺序地把事务从Core节点复制到Replicant节点。但不同的RLOG Shard之间是异步的。
集群架构选择
在EMQX 5.0中,所以如果不做任何调整的话所有节点都默认为Core节点,默认行为和4.x版本是一致的。
可以通过设置emqx.conf中的node.db_role参数或EMQX_NODE__DB_ROLE环境变量,把节点上设置为Replicant节点。
* 请注意,集群中至少要有一个核心节点,我们建议以3个Core+N个Replicant的设置作为开始
Core节点可以接受MQTT的业务流量,也可以纯粹作为集群的数据库来使用。我们建议:
异常处理
Core节点对于Replicant节点是无感的,当某一Core节点宕机时,Replicant节点会自动连接到新的Core节点,此过程中客户端不会掉线,但可能导致路由更新延迟;当Replicant节点宕机时,所有连接到该节点的客户端会被断开,但由于Replicant是无状态的,所以不会影响到其他节点的稳定性,此时客户端需要设置重连机制,连接至另一个Replicant节点。
硬件配置要求
网络
Core节点之间的网络延迟建议10ms以下,实测高于100ms将不可用,请将Core节点部署在同一个私有网络下;Replicant与Core节点之间同样建议部署在同一个私有网络下,但网络质量要求可以比 Core节点间略低。
CPU与内存
Core节点需要较大的内存,在不承接连接的情况下,CPU消耗较低;Replicant节点硬件配置与4.x一致,可按连接和吞吐配置估算其内存要求。
监控和调试
对Mria的性能监控可以使用Prometheus或使用EMQX控制台查看。Replicant节点在启动过程中会经历以下状态:
Prometheus监控
Core节点
Replicant节点
控制台命令
./bin/emqxevalmria_rlog:status().可以获取关于Mria数据库运行状态的更多信息。
*注:它可以显示一些shard为down状态,这表明这些分片没有被任何业务应用使用。
全新的底层架构使EMQX 5.0具备了更强的水平扩展能力,在构建满足业务需求的更大规模集群的同时,可以降低大规模部署下的脑裂风险以及脑裂后的影响,有效减少集群维护开销,提供更加稳定可靠的物联网数据接入服务。
| 留言与评论(共有 0 条评论) “” |