支持上亿物联网终端设备接入的MQTT集群(1)

MQTT客户端库用于在客户端设备上实现MQTT协议,以便与Broker进行通信。主流的MQTT客户端库包括Paho MQTT、MQTT.js、Eclipse Kura等,支持各种编程语言和平台,例如Java、Python、JavaScript等。

本文选取 EMQX 作为研究对象,基于 EMQX 开源版本搭建 MQTT 服务集群。

2. EMQX 企业版与开源版功能对比

在这里插入图片描述
备注:上图数据来源于EMQ官方网站–产品概览

如上图所示,红色部分为开源版本不支持的功能。开源版本与企业版本从伸缩性与性能上对比基本上一致,即不管是开源版本还是企业版本均支持至多1亿的连接以及500万每秒的消息,这样能够满足大部分业务场景,如果团队没有运维资源,则考虑使用企业版会有更高的 SLA 稳定性保障;如果团队有自己的运维力量,且对于企业版扩展的功能没有很强烈的需求,则可以考虑使用开源版本。

3. EMQX 集群部署

3.1 EMQX 集群架构

3.1.1 EMQX 4.x 以及以前版本架构

在这里插入图片描述
  EMQX 集群中所有节点之间两两互相连结的架构。

3.1.2 EMQX 5.x 基于 Mria 的新架构

在这里插入图片描述
  EMQX 集群的节点分为核心节点(Mria Core)与复制节点(Mria Replicant),核心节点之间两两互相连结。

  • 核心节点:核心节点作为数据库的数据层,节点间以全网状连接,每个节点都包含一个最新的数据副本,这保证了容错性:只要有一个节点存活,数据就不会丢失。核心节点一般是静态和持久的,不建议进行自动伸缩(即经常添加、删除或替换节点)。
  • 复制节点:复制节点会连接到核心节点,并被动地复制来自核心节点的数据更新。复制节点不允许执行任何的写操作,而是将其转交给核心节点代为执行。同时,由于复制节点有一个完整的本地数据副本,因此数据读取速度非常快,这样有助于降低 EMQX 路由的时延。

将这种数据复制模型当做无主复制和主从复制的一种混合,这种结构的优势在于:

  • 更高的水平可扩展性:EMQX 5.0 已能支持包含 23 个节点的大规模集群。
  • 更轻松的集群自动扩展:通过复制节点的自动伸缩简化集群的自动扩展。

相比与 4.x 版本所有节点采用全连接的方式,节点数量越多节点之间完成数据同步的成本就越高,EMQX 5.0 中由于复制节点不参与数据写入,当更多的复制节点加入集群时,表的更新效率不会受到影响,进而允许创建更大的 EMQX 集群。

另外,复制节点被设计成可以按需增删,添加或删除它们不会改变数据冗余,所以它们可以被放在一个自动伸缩组中,从而实现更好的 DevOps 实践。但随着总数据量的增大,从核心节点初始化复制数据是一个相对繁重的操作,所以复制节点的自动伸缩策略不也能太过于激进。
  上述内容摘抄至EMQ官网,关于EMQX集群架构详细信息请参考:部署架构与集群要求

3.1.3 EMQX 集群节点发现策略

在这里插入图片描述
  节点发现作为创建分布式集群的必要过程,EMQX 默认配置采用手动发现策略创建集群,配置信息在 /etc/emqx/emqx.conf 配置文件中。

cluster {
  name = emqxcl
  discovery_strategy = manual
}

discovery_strategy 的值可以是:manual | static | mcast | dns | etcd | K8s。分别对应不同的节点发现方式。不同发现方式详细信息请参考:EMQX集群节点发现。

3.2 EMQX 集群支持的部署方式

3.3 EMQX 集群部署过程

首先打开EMQ的官方网站,找到安装包下载入口,然后在部署方式中选择EMQX下载。
在这里插入图片描述点击 EMQX 下载后,下边将会出现企业版与开源版两行,然后选择 EMQX 开源版,如下图所示:
在这里插入图片描述
  根据操作系统版本选择对应的版本,然后点击 免费下载 按钮。本文以 Centos 7 为例。选择 Centos 7 后点击免费下载进入到安装包的下载页面。
在这里插入图片描述
  选择安装方式为 rpm,CPU 架构为 amd64,然后执行下边的命令获取到 emqx 的 rpm 安装包。如果不知道如何选择CPU与内存的配置,可以使用EMQ提供的配置估算工具进行粗略的计算,实际生产环境需要的配置信息以实际运行为准。配置估算工具地址。

3.3.1 EMQX 安装部署
  • 下载安装包
mkdir -p /opt/emq
cd /opt/emq
wget https://www.emqx.com/zh/downloads/broker/5.0.24/emqx-5.0.24-el7-amd64.rpm

  • 安装 EMQX 以及依赖
sudo yum install emqx-5.0.24-el7-amd64.rpm -y

  • 修改EMQX的节点名称,将 /etc/emqx/emqx.conf 配置文件中参数 name 的值设置成 emqx@节点内网IP地址 的形式
node {
  name = "emqx@192.168.0.200"
  cookie = "emqxsecretcookie"
  data_dir = "/var/lib/emqx"
}

  • 启动 EMQX 服务
sudo systemctl start emqx

在每一台节点分别执行上边的命令,完成各节点单机版本的部署。

  • 查看服务运行情况
netstat -ltnp | grep emq

在这里插入图片描述
或者通过 18083 端口打开 emqx 的 dashboard 控制台进行管理,访问地址:http://节点IP:18083。首次登陆账号为:admin,密码是:public

3.3.2 创建集群或加入集群

采用手工发现策略创建集群。假设 EMQX 节点 1 的节点名称是:emqx@192.168.0.200, EMQX 节点2 的名称是:emqx@192.168.0.145。在节点2上执行下边名称创建集群:

emqx_ctl cluster join emqx@192.168.0.200

  • 查看集群状态,如下图所示,表示当前集群中有两个节点处于 running 状态。
emqx_ctl cluster status

在这里插入图片描述

3.3.3 退出集群
emqx_ctl cluster leave

在这里插入图片描述

3.4 EMQX 优化改进

3.4.1 性能测试与资源优化
3.4.2 EMQX 集群脑裂问题

EMQX 4.x 以及之前版本采用了 Erlang/OTP 自带的实时分布式数据库 Mnesia,其支持两种数据访问模式:本地模式远程模式本地模式是全连接、点对点复制模式,如上边的 3.1.1 章节所示,节点中的数据会复制到集群中其他所有节点。远程模式是数据分布到集群中的不同节点,如果当前节点没有客户端想要访问的数据,则这个节点通过RPC访问其他节点获取数据。本地模式的优点是网络开销小,数据访问效率高,只要集群有一个节点正常,就能保障数据的完整,缺点是水平扩展性差,存在脑裂风险。
   EMQX 5.x 引入了 Mria 新架构,如上边的 3.1.2 章节所示,将集群中所有节点分为核心节点与复制节点,核心节点之间采用全连接、点对点模式,复制节点只与某个制定的核心节点进行数据被动同步更新。通过降低集群中复制节点与核心节点 Mnesia 数据库事务处理,有效的降低了集群脑裂的风险。

EMQX 通过设置 /etc/emqx/emqx.conf 参数 cluster.autoheal = on 开启集群网络分区自动修复功能。

  • 节点在收到 Mnesia 的 “数据库不一致” 事件 3 秒后执行网络分区确认。
  • 节点确认网络分区发生后,它将消息报告给 Leader 节点(集群中最早开始的节点)。
  • 在 Leader 节点延迟一段时间后,当所有节点都在线时,它创建一个 SplitView。
  • Leader 节点选择多数分区中的自愈协调者节点。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值