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 性能测试与资源优化
- EMQ提供了开源的性能测试工具,工具下载地址 emqtt-bench。
- 系统参数优化,详细信息请参考 EMQX 系统调优
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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!