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

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.mzph.cn/news/753204.shtml

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

相关文章

Jenkins流水线将制品发布到Nexus存储库

1、安装jenkins(建议别用docker安装,坑太多) docker run -d -p 8089:8080 -p 10241:50000 -v /var/jenkins_workspace:/var/jenkins_home -v /etc/localtime:/etc/localtime --name my_jenkins --userroot jenkins/jenkins:2.449 坑1 打开x…

Python使用 k 均值对遥感图像进行语义分割

本篇文章介绍K-means语义分割来估计 2000 年至 2023 年咸海水面的变化 让我们先看一下本教程中将使用的数据。这是同一地区的两张 RGB 图像,间隔 23 年,但很明显地表特性和大气条件(云、气溶胶等)不同。这就是为什么我决定训练两个独立的 k-Means 模型,每个图像一个。 首…

仰卧起坐计数,YOLOV8POSE

仰卧起坐计数,YOLOV8POSE 通过计算膝盖、腰部、肩部的夹角,计算仰卧起坐的次数

[江苏工匠杯]easyphp

先看源码 <?php highlight_file(__FILE__); $key1 0; $key2 0; ​ $a $_GET[a]; $b $_GET[b]; ​ if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("…

mvn 相关命令汇总

1、需求 项目上一致是使用的mvn 进行打包, 对于项目上的一些mvn 命令&#xff0c;有时候会忘记&#xff0c;所以将mvn 汇总起来 2、命令汇总 ① mvn clean 将项目目录下的编译的文件清除掉,即target 文件夹的编译文件 ② mvn complie 编译项目的代码&#xff0c;生成class 文…

Spring boot2.7整合jetcache方法缓存

前面的文章 我们讲了 spring boot 整合 jetcache 做基本字符串数据缓存 但是 我这里有个这样的逻辑 我的 domain 包下 有一个 book 属性类 里面就 id 和 name 属性 设置了 对应的 set get函数 和一个整体的构造函数 package com.example.javadom.domain;public class book {pr…

TrueNAS怎么设置中文,最新2024版本安装详细说明

首先我们做好安装前的准备工作 1&#xff0c;ISO镜像安装包 2&#xff0c;虚拟机&#xff08;建议使用ESXI虚拟机环境&#xff09; 如果是物理机安装&#xff0c;建议先给底层安装虚拟机系统esxi&#xff0c;再在上面安装方便以后的管理&#xff0c;如果你想物理机直接安装&a…

3.15消费者权益保护教育宣传活动怎样联系媒体投稿宣传?

在315金融消费者权益保护教育宣传活动中,想要有效地联系媒体报道并进行便捷宣传,可以通过以下步骤来利用智慧软文发布系统进行操作: 1. 准备宣传素材: - 制作高质量的新闻稿件,内容应围绕金融消费者权益保护的主题,包含活动的目的、特色、实施计划、预期影响、参与方式等细节;…

怎么看一手伦敦银多少钱?

做伦敦银投资的朋友需要搞清楚“一手伦敦银多少钱”的问题&#xff0c;这也是伦敦银交易的基础问题。为什么需要搞清楚这个基础问题呢&#xff1f;有些基础问题我们不需要搞懂&#xff0c;但是关于一手伦敦银多少钱却需要搞清楚&#xff0c;因为这决定了投资者的资金利用率。 关…

复合材料热压机比例阀放大器

复合材料热压机动作主要依赖于其内置的液压系统。是工业生产中常用的设备&#xff0c;通过施加高温和高压来实现对材料的压制成型。为了确保热压板能够精确地上下移动以及保持所需的压力&#xff0c;通常会使用液压系统来控制。液压系统中必不可少的需要比例阀来控制油缸的运行…

【数字孪生】Nginx发布数字孪生三维建模模型服务及调用方法

【数字孪生】Nginx发布数字孪生三维建模模型服务及调用方法 一、需求二、实施步骤2.1 准备模型文件2.1.1 3D tiles模型2.1.2 3D Tiles标准文件格式 2.2 配置nginx server块2.2.1 Nginx能干啥 2.3 访问 三、实现效果 一、需求 利用三维渲染引擎Cesium加载3D tiles模型。 二、实…

下载JDK17版本详细教程(下载、安装、环境变量配置)

官网下载 Oracle 甲骨文中国 | 云应用和云平台 安装 更改自己的安装位置。点击下一步&#xff0c;记住自己的安装位置 环境配置 右键此电脑点击属性---高级系统设置----环境变量 在系统变量里面点击新建环境变量JAVA_HOME&#xff0c;下面填入自己的jdk安装地址&#xff0c…

关于微服务跨数据库联合查询的一些解决思路

微服务架构的一个非常明显的特征就是一个服务所拥有的数据只能通过这个服务的API来访问。通过这种方式来解耦&#xff0c;这样就会带来查询问题。以前通过join就可以满足要求&#xff0c;现在如果需要跨多个服务集成查询就会非常麻烦。 解决思路 下面提供几个思路仅供参考 表…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— Toggle切换按钮组件

概述 Toggle为切换按钮组件&#xff0c;一般用于两种状态之间的切换&#xff0c;例如下图中的蓝牙开关。 参数 Toggle组件的参数定义如下 Toggle(options: { type: ToggleType, isOn?: boolean })● type type属性用于设置Toggle组件的类型&#xff0c;可通过ToggleType枚举…

python异常:pythonIOError异常python打开文件异常

1.python读取不存在的文件时&#xff0c;抛出异常 通过 open()方法以读“r”的方式打开一个 abc.txt 的文件&#xff08;该文件不存在&#xff09;&#xff0c;执行 open()打开一个不存在的文件时会抛 IOError 异常&#xff0c;通过 Python 所提供的 try...except...语句来接收…

linux查看服务器登录成功和登录失败的命令

last 查看成功登录服务器的信息&#xff0c;包括ip&#xff0c;时间&#xff0c;登录用户&#xff0c;时长。lastb 查看登录服务器失败的信息。 last命令实例&#xff1a; 其他参数&#xff1a; -a&#xff1a;把从何处登入系统的主机名称或ip地址&#xff0c;显示在最后一行…

.rmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 近年来&#xff0c;勒索病毒的威胁日益增加&#xff0c;其中一种名为.rmallox的勒索病毒备受关注。这种病毒通过加密文件并勒索赎金来威胁受害者。本文将介绍.rmallox勒索病毒的特点&#xff0c;以及如何恢复被其加密的数据文件&#xff0c;并提供预防措施&a…

Css提高——flex布局及其相关属性

目录&#xff1a; 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction &#xff1a;设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

Linux:系统初始化,内核优化,性能优化(1)

我们安装好了一个服务器之后&#xff0c;一定要对他的系统&#xff0c;内核&#xff0c;性能一系列进行一个优化&#xff0c;否则当大并发的情况下很可能出现问题&#xff0c;我把要优化的东西直接罗列出来并介绍&#xff0c;后期可以直接编写一个脚本拿到服务器上直接用就行 …

在深圳,为什么硬件工程师的待遇还不如软件?

深圳触觉智能科技有限公司 硬件明明比软件更难&#xff0c;为何在国内… 硬件明明比软件更难&#xff0c;但硬件工程师待遇却不如软件工程师&#xff0c;硬件工程师常被忽视&#xff0c;被视为可轻易模仿的“配角”&#xff0c;默默付出却鲜获认可。比如八年以上的资深硬件工…