EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

news2024/12/25 2:09:30

EMQX 5.0水平扩展能力得到了指数级提升,能够更可靠地承载更大规模的物联网设备连接量。

在EMQX5.0正式发布前的性能测试中,我们通过一个23节点的EMQX集群,全球首个达成了1亿MQTT连接+每秒100万消息吞吐,这也使得EMQX 5.0成为目前为止全球具突出扩展性的MQTT Broker。

4.x时代:使用Mnesia构建EMQX集群

Mnesia介绍
EMQX 4.x版本存储采用的是Erlang/OTP自带的分布式数据库Mnesia,它具备以下优点:

  • **Embedded:**和MySQL、PostgeresSQL等数据库不同,Mnesia和EMQX是运行在同一个操作系统进程的(类似于SQLite)。因此EMQX可以以非常快的速度读取路由、会话等相关信息。
  • **Transactional:**Mnesia支持事务且具有ACID保证。而且这些保证是针对整个集群所有节点生效的。EMQX在数据一致性很重要的地方使用Mnesia事务,例如更新路由表、创建规则引擎规则等。
  • **Distributed:**Mnesia表会复制到所有EMQX节点。这能提高EMQX 的分布式的容错能力,只要保证一个节点存活数据就是安全的。
  • **NoSQL:**传统的关系型数据库使用SQL与数据库进行交互。而Mnesia直接使用Erlang表达式和内置的数据类型进行读写,这使得与业务逻辑的整合非常顺利,并消除了数据编解码的开销。

在Mnesia集群中,所有节点都是平等的。它们中的每一个节点都可以存储一份数据副本,也可以启动事务或执行读写操作。
Mnesia集群使用全网状拓扑结构:即每个节点都会与集群中其它所有的节点建立连接,每个事务都被会复制到集群中的所有节点。如下图所示:

**Mnesia的问题

正如我们上面所讨论的,Mnesia数据库有很多非常显著的优点,EMQX也从中获得了非常大的收益。但其全连接的特性,限制了其集群的水平扩展能力,因为节点之间的链接数量随着节点数量的平方而增长,保持所有节点完全同步的成本越来越高,事务执行的性能也会急剧下降。
这意味着EMQX的集群功能有以下限制:

  • **水平扩展能力不足。**在4.x我们不建议在集群节点过多,因为网状拓扑中的事务复制的开销会越来越大;我们一般建议是使用节点数保持在3~7个,并尽量提供单节点的性能。
  • **节点数增多会增大集群脑裂的可能性。**节点数越多、节点间的链接数也会急剧增多,对节点间的网络稳定性的要求更高。当产生脑裂后,节点自愈会导致节点重启并有数据丢失的风险。

尽管如此,EMQX凭借独特的架构设计和Erlang/OTP强大的功能特性,实现了单个集群1000万MQTT连接的目标。同时,EMQX能够以集群桥接的方式,通过多个集群承载更大规模的物联网应用。
随着市场的发展,单个物联网应用需要承载越来越多的设备和用户,EMQX需要具备更强大的扩展性和接入能力,以支持超大规模物联网应用。

5.x时代:使用Mria构建大规模集群

Mria是Mnesia的一个开源扩展,为集群增加了最终的一致性。前文所述的大多数特性仍然适用于它,区别在于数据如何在节点间进行复制。
Mria从全网状拓扑结构转向网状+星型状拓扑结构。每个节点承担两个角色中的一个:核心节点(Core)或复制者节点(Replicant)。

**Core和Replicant节点行为

Core节点的行为与4.x中的Mnesia节点一致:Core节点使用全连接的方式组成集群,每个节点都可以发起事务、持有锁等。因此,EMQX 5.0仍然要求Core节点在部署上要尽量的可靠。
Replicant节点不再直接参与事务的处理。但它们会连接到Core节点,并被动地复制来自Core节点的数据更新。Replicant节点不允许执行任何的写操作。而是将其转交给Core节点代为执行。
另外,由于Replicant会复制来自Core节点的数据,所以它们有一份完整的本地数据副本,以达到最高的读操作的效率,这样有助于降低EMQX路由的时延。
我们可以将这种数据复制模型当做无主复制和主从复制的一种混合。这种集群拓扑结构解决了两个问题:

  • 水平可扩展性(如前文提到,我们已经测试了有23个节点的EMQX集群)
  • 更容易的集群自动扩展,并无数据丢失的风险

由于Replicant节点不参与写操作,当更多的Replicant节点加入集群时,写操作的延迟不会受到影响。这允许创建更大的EMQX集群。
另外,Replicant节点被设计成是无状态的。添加或删除它们不会导致集群数据的丢失、也不会影响其他节点的服务状态,所以Replicant节点可以被放在一个自动扩展组中,从而实现更好的DevOps实践。
出于性能方面的考虑,不相干数据的复制可以被分成独立的数据流,即多个相关的数据表可以被分配到同一个RLOG Shard(复制日志分片),顺序地把事务从Core节点复制到Replicant节点。但不同的RLOG Shard之间是异步的。

EMQX 5.0集群部署实践

集群架构选择
在EMQX 5.0中,所以如果不做任何调整的话所有节点都默认为Core节点,默认行为和4.x版本是一致的。
可以通过设置emqx.conf中的node.db_role参数或EMQX_NODE__DB_ROLE环境变量,把节点上设置为Replicant节点。

  • 请注意,集群中至少要有一个核心节点,我们建议以3个Core+N个Replicant的设置作为开始
    Core节点可以接受MQTT的业务流量,也可以纯粹作为集群的数据库来使用。我们建议:
  • 在小集群中(3个节点或更少),没有必要使用Core+Replicant复制模式,可以让Core节点承担所有的流量,避免增加上手和使用的难度。
  • 在超大的集群中(10个节点或更多),建议把MQTT流量从Core节点移走,这样更加稳定性和水平扩展性更好。
  • 在中型集群中,取决于许多因素,需要根据用户实际的场景测试才能知道哪个更优。

异常处理
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节点在启动过程中会经历以下状态:

  • **bootstrap:**当Replicant节点启动后,需要从Core节点同步最新数据表的过程
  • **local_replay:**当节点完成bootstrap时,它必须重放这个过程中产生的的写事务
  • **normal:**当缓存的事务被完全执行后,节点即进入到正常运行的状态。后续的写事务被实时地应用到当前节点。大多数情况下,Replicant节点都会保持在这个状态。

Prometheus监控
Core节点

  • emqx_mria_last_intercepted_trans:自节点启动以来,分片区收到的交易数量。请注意,这个值在不同的核心节点上可能是不同的。
  • emqx_mria_weight:一个用于负载平衡的值。它的变化取决于核心节点的瞬间负载。
  • emqx_mria_replicants:连接到核心节点的复制器的数量,为给定的分片复制数据。
  • emqx_mria_server_mql:未处理的交易数量,等待发送至复制者。越少越好。如果这个指标有增长的趋势,需要更多的核心节点

Replicant节点

  • emqx_mria_lag:复制体滞后,表示复制体滞后上游核心节点的程度。越少越好。
  • emqx_mria_bootstrap_time:复制体启动过程中花费的时间。这个值在复制体的正常运行过程中不会改变。
  • emqx_mria_bootstrap_num_keys:在引导期间从核心节点复制的数据库记录的数量。这个值在复制体的正常运行中不会改变。
  • emqx_mria_message_queue_len:复制进程的消息队列长度。应该一直保持在0左右。
  • emqx_mria_replayq_len:复制体的内部重放队列的长度。越少越好。

控制台命令
./bin/emqxevalmria_rlog:status().可以获取关于Mria数据库运行状态的更多信息。

  • 注:它可以显示一些shard为down状态,这表明这些分片没有被任何业务应用使用。

结语

全新的底层架构使EMQX 5.0具备了更强的水平扩展能力,在构建满足业务需求的更大规模集群的同时,可以降低大规模部署下的脑裂风险以及脑裂后的影响,有效减少集群维护开销,提供更加稳定可靠的物联网数据接入服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 设计模式】简单工厂模式

文章目录 前言一、简单工厂模式是什么?二、实现原理三、UML类图四、简单工厂模式具体代码总结 前言 在软件开发中,设计模式是解决特定问题的可复用解决方案。其中,简单工厂模式是一种创建型设计模式,旨在封装对象的创建过程&…

IDEA开启Run Dashboard

1、Run Dashboard是什么,为什么要使用 Run Dashboard 是 IntelliJ IDEA 中的一个工具窗口,用于管理和监视项目中正在运行的应用程序和配置。它提供了一种集中管理运行和调试过程的方式,可以让开发人员更方便地查看和控制正在运行的应用程序。…

2 Redis的安装与配置

这里是要将 Redis 安装到 Linux 系统中。 1.1 Redis 的安装 1.1.1 克隆并配置主机 修改主机名:/etc/hostname修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens33 1.1.2 安装前的准备工作 (1 )安装 gcc (2…

如何从 Mac 电脑外部硬盘恢复删除的数据文件

本文向您介绍一些恢复 Mac 外置硬盘数据的快速简便的方法。 Mac 的内部存储空间通常不足以存储所有数据。因此,许多用户通过外部驱动器扩展存储或创建数据备份。然而,与几乎所有其他设备一样,从外部硬盘驱动器丢失有价值的数据并不罕见。由于…

数据库是什么?数据库连接、管理与分析工具推荐

一、数据库是什么? 数据库是一种结构化的数据存储系统,用于有效地组织、存储和管理大量的数据。它是一个集中化的数据存储库,通常由一个或多个数据表组成,每个数据表包含多个行和列,用于存储特定类型的数据。数据表中…

SQLiteC/C++接口详细介绍之sqlite3类(七)

上一篇:SQLiteC/C接口详细介绍之sqlite3类(六) 下一篇: SQLiteC/C接口详细介绍之sqlite3类(八)(未发表) 22.sqlite3_create_collation、sqlite3_create_collation16和sqlite3_creat…

【java工具】Maven的下载配置+setting配置(以3.9.6为例)

本人正在学习spring,还是个小白,也是跟着网课和各种资料学,光学习spring项目的各种配置就花了我不少时间QWQ。在学习spring的每个阶段,我会做好技术总结,不定期分享出来,希望对你有所帮助,有问题…

【Node.js从基础到高级运用】十二、身份验证与授权:JWT

身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制,将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT(Json Web Token) JWT是一种用于双方之间…

COX回归影响因素分析的基本过程与方法

在科学研究中,经常遇到分类的结局,主要是二分类结局(阴性/阳性;生存/死亡),研究者可以通过logistic回归来探讨影响结局的因素,但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

报表生成器FastReport .Net用户指南:关于脚本(上)

FastReport的报表生成器(无论VCL平台还是.NET平台),跨平台的多语言脚本引擎FastScript,桌面OLAP FastCube,如今都被世界各地的开发者所认可,这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…

hive-批量导出表结构,导入表结构

1、导出hive表结构 datastudio可以连接hive库,通过show databases 语句可以显示hive下建了多少数据库名。 使用use 数据库名,进入某个数据库下,通过show tables可显示该数据库下建了多少张表。 将所有库的表数据整理成库名.表名的形式放入…

python基于flask考研学习交流系统30vy7附源码django

考研在线学习与交流平台根据实际情况分为前后台两部分,前台部分主要是让用户使用的,包括用户的注册登录,首页,课程信息,在线讨论,系统公告,后台管理,个人中心等功能;后台…

Qt_vc++崩溃日志分析

环境 Clion :2019.3.6 Qt :5.9.6(vc2015) 编译工具:vs2015 update3 崩溃日志收集 自行百度,会查到很多,一下代码仅供参考(来自https://blog.csdn.net/weixin_45571586/article/…

java的23种设计模式02-创建型模式02-抽象工厂方法

一、抽象工厂方法 1-1、抽象工厂方法的定义 抽象工厂模式是一个比较复杂的创建型模式。 抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且:有多个产品需要创建&#xff…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

导入csv文件表头字符串出现zwnbsp字符(零宽度空白字符)处理

导入csv文件表头字符串出现zwnbsp字符&#xff08;零宽度空白字符&#xff09;处理 【1】现象描述【2】问题分析【3】原因分析【4】问题解决&#xff08;1&#xff09;修改文件的编码格式&#xff08;2&#xff09;在代码中处理 【1】现象描述 通过easyexcel导入csv文件&#…

9种分布式ID生成之美团(Leaf)实战

​​​​​ 前几天写过一篇《一口气说出 9种 分布式ID生成方式&#xff0c;面试官有点懵了》&#xff0c;里边简单的介绍了九种分布式ID生成方式&#xff0c;但是对于像美团&#xff08;Leaf&#xff09;、滴滴&#xff08;Tinyid&#xff09;、百度&#xff08;uid-generator&…

mac【启动elasticsearch报错:can not run elasticsearch as root

mac【启动elasticsearch报错&#xff1a;can not run elasticsearch as root 问题原因 es默认不能用root用户启动&#xff0c;生产环境建议为elasticsearch创建用户。 解决方案 为elaticsearch创建用户并赋予相应权限。 尝试了以下命令创建用户&#xff0c;adduser esh 和u…

【计算机图形学】End-to-End Affordance Learning for Robotic Manipulation

对RLAfford&#xff1a;End-to-End Affordance Learning for Robotic Manipulation的简单理解 1. 为什么要做这件事 在交互环境中学习如何操纵3D物体是RL中的挑战性问题。很难去训练出一个能够泛化到具有不同语义类别、不同几何形状和不同功能物体上的策略。 Visual Afforda…

ISIS多区域实验简述

为支持大型路由网络&#xff0c;IS-IS在路由域内采用两级分层结构。 IS-IS网络中三种级别的路由设备&#xff1a;将Level-1路由设备部署在区域内&#xff0c;Level-2路由设备部署在区域间&#xff0c;Level-1-2路由设备部署在Level-1和Level-2路由设备的中间。 实验拓扑图&…