EMQX集群搭建

1. 什么是 MQTT?

  • MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。

2. 为什么 MQTT 是适用于物联网的最佳协议?

MQTT 所具有的适用于物联网特定需求的特点和功能,使其成为物联网领域最佳的协议之一。它的主要特点包括:

  • 轻量级:物联网设备通常在处理能力、内存和能耗方面受到限制。MQTT 开销低、报文小的特点使其非常适合这些设备,因为它消耗更少的资源,即使在有限的能力下也能实现高效的通信。

  • 可靠:物联网网络常常面临高延迟或连接不稳定的情况。MQTT 支持多种 QoS 等级、会话感知和持久连接,即使在困难的条件下也能保证消息的可靠传递,使其非常适合物联网应用。

  • 安全通信:安全对于物联网网络至关重要,因为其经常涉及敏感数据的传输。为确保数据在传输过程中的机密性,MQTT 提供传输层安全(TLS)和安全套接层(SSL)加密功能。此外,MQTT 还通过用户名/密码凭证或客户端证书提供身份验证和授权机制,以保护网络及其资源的访问。

  • 双向通信:MQTT 的发布-订阅模式为设备之间提供了无缝的双向通信方式。客户端既可以向主题发布消息,也可以订阅接收特定主题上的消息,从而实现了物联网生态系统中的高效数据交换,而无需直接将设备耦合在一起。这种模式也简化了新设备的集成,同时保证了系统易于扩展。

  • 连续、有状态的会话:MQTT 提供了客户端与 Broker 之间保持有状态会话的能力,这使得系统即使在断开连接后也能记住订阅和未传递的消息。此外,客户端还可以在建立连接时指定一个保活间隔,这会促使 Broker 定期检查连接状态。如果连接中断,Broker 会储存未传递的消息(根据 QoS 级别确定),并在客户端重新连接时尝试传递它们。这个特性保证了通信的可靠性,降低了因间断性连接而导致数据丢失的风险。

  • 大规模物联网设备支持:物联网系统往往涉及大量设备,需要一种能够处理大规模部署的协议。MQTT 的轻量级特性、低带宽消耗和对资源的高效利用使其成为大规模物联网应用的理想选择。通过采用发布-订阅模式,MQTT 实现了发送者和接收者的解耦,从而有效地减少了网络流量和资源使用。此外,协议对不同 QoS 等级的支持使得消息传递可以根据需求进行定制,确保在各种场景下获得最佳的性能表现。

  • 语言支持:物联网系统包含使用各种编程语言开发的设备和应用。MQTT 具有广泛的语言支持,使其能够轻松与多个平台和技术进行集成,从而实现了物联网生态系统中的无缝通信和互操作性。您可以阅读我们的 MQTT 客户端编程系列文章,学习如何在 PHP、Node.js、Python、Golang、Node.js 等编程语言中使用 MQTT。

3. MQTT 的工作原理

  • 要了解 MQTT 的工作原理,首先需要掌握以下几个概念:MQTT 客户端、MQTT Broker、发布-订阅模式、主题、QoS。

3.1. MQTT 客户端

  • 任何运行 MQTT 客户端库的应用或设备都是 MQTT 客户端。例如,使用 MQTT 的即时通讯应用是客户端,使用 MQTT 上报数据的各种传感器是客户端,各种 MQTT 测试工具也是客户端。

3.2. MQTT Broker

  • MQTT Broker 是负责处理客户端请求的关键组件,包括建立连接、断开连接、订阅和取消订阅等操作,同时还负责消息的转发。一个高效强大的 MQTT Broker 能够轻松应对海量连接和百万级消息吞吐量,从而帮助物联网服务提供商专注于业务发展,快速构建可靠的 MQTT 应用。

3.3. 发布-订阅模式

  • 发布-订阅模式与客户端-服务器模式的不同之处在于,它将发送消息的客户端(发布者)和接收消息的客户端(订阅者)进行了解耦。发布者和订阅者之间无需建立直接连接,而是通过 MQTT Broker 来负责消息的路由和分发。
  • 下图展示了 MQTT 发布/订阅过程。温度传感器作为客户端连接到 MQTT Broker,并通过发布操作将温度数据发布到一个特定主题(例如 Temperature)。MQTT Broker 接收到该消息后会负责将其转发给订阅了相应主题(Temperature)的订阅者客户端。

在这里插入图片描述

4. MQTT 的工作流程

  • 在了解了 MQTT 的基本组件之后,让我们来看看它的一般工作流程:

    1. 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
    2. 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
    3. MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。

5. MQTT集群搭建

  • 官方中文文档地址
  • 环境准备
主机系统
172.16.60.10centos7
172.16.60.20centos7
172.16.60.30centos7

5.1. 安装部署

#安装emqx,每台主机都需要安装
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install openssl11
yum  -y install  https://www.emqx.com/zh/downloads/broker/v5.6.0/emqx-5.6.0-el7-amd64.rpm#启动emqx
systemctl  start emqx.service

5.2. 创建emqx集群

5.2.1. 修改配置文件

  • 60.10配置文件修改
vim   /etc/emqx/emqx.conf
node {name = "emqx@172.16.60.10"        #指定了节点的名称cookie = "emqxsecretcookie"       #用于集群节点之间的身份验证。所有集群节点都必须使用相同的cookie值才能加入集群data_dir = "/var/lib/emqx"       #指定了EMQX存储数据的目录路径,例如日志文件、持久化队列等
}cluster {name = emqxcl                    #指定了集群的名称,所有集群成员都必须使用相同的名称discovery_strategy = manual      #指定了集群发现策略,manual意味着集群成员之间的关系需要手动配置
}log {# file {#     level = warning# }# console {#     level = warning# }
}
dashboard {listeners.http {bind = 18083     #指定了仪表盘绑定的端口号,这里是 18083。这意味着仪表盘可以通过http://<HostName>:18083 访问}
}
  • 60.20配置文件修改
node {name = "emqx@172.16.60.20"cookie = "emqxsecretcookie"data_dir = "/var/lib/emqx"
}cluster {name = emqxcldiscovery_strategy = manual
}log {# file {#     level = warning# }# console {#     level = warning# }
}
dashboard {listeners.http {bind = 18083}
}
  • 60.30配置文件修改
node {name = "emqx@172.16.60.30"cookie = "emqxsecretcookie"data_dir = "/var/lib/emqx"
}cluster {name = emqxcldiscovery_strategy = manual
}log {# file {#     level = warning# }# console {#     level = warning# }
}
dashboard {listeners.http {bind = 18083}
}

5.2.2. 创建集群

#在60.10执行以下命令
emqx_ctl cluster join emqx@172.16.60.20
#在60.30执行以下命令
emqx_ctl cluster join emqx@172.16.60.20
#在任意一台执行以下命令,查询集群状态
emqx_ctl cluster status
Cluster status: #{running_nodes =>['emqx@172.16.60.10','emqx@172.16.60.20','emqx@172.16.60.30'],stopped_nodes => []}

5.3. 登录web界面验证

  • ip地址:18083
  • ip地址可以是三个的任意一个IP地址即可
  • 默认账号:admin,密码:public
    在这里插入图片描述

6. 集群负载均衡

  • 负载均衡(Load Balancing)用于均衡多个网络组件的负载,从而优化资源的使用,避免由于组件过载造成故障。负载均衡虽然不是集群中的必备组件,但是能给集群带来一些非常有用的特性,例如当配置在 EMQX 集群中时,将能带来如下优势:

    1. 均衡 EMQX 的负载,避免出现单节点过载的情况;
    2. 简化客户端配置,客户端只需连接到负载均衡器上,无需关心集群内部伸缩变化;
    3. TLS/SSL 终结,减轻 EMQX 集群的负担;
    4. 提高安全性,有了负载均衡在集群前端,能够通过设置阻止不需要的流量,保护 EMQX 集群免受恶意攻击。

6.1. 用 NGINX 负载均衡 EMQX 集群

  • NGINX 是一种高性能多功能的服务器软件,可以作为 Web 服务器和反向代理服务器,除此以外,NGINX 还可以作为负载均衡器将来自客户端的请求分发到多个后端服务器,以确保负载平衡和性能优化。NGINX 非常适用于物联网应用,因为它可以处理大量的并发请求。在物联网中,设备数量庞大,因此需要一个可以处理大量请求的服务器来保证稳定性。EMQX 原生支持由多个 MQTT 服务器组成的分布式集群架构,因此,使用 NGINX 部署负载均衡以及 EMQX 集群,可以保证高可用性和可扩展性。

6.2. 功能与优势

使用 NGINX 负载均衡 EMQX 集群具备以下几个功能和优势:

  • 作为反向代理服务器,NGINX 位于 MQTT 服务器端,代表 MQTT 客户端向 EMQX 集群发起 MQTT 连接请求,并代替 EMQX 集群处理请求,然后将 EMQX 集群的响应返回给 MQTT 客户端。这样的设置可以将多个集群隐藏起来,暴露一个接入点给 MQTT 客户端。MQTT 客户端只需要与 NGINX 通信,而不需要知道后面的集群数量和布局,这种方式可以提高系统的可维护性和可扩展性。
  • NGINX 可用于终结 MQTT 客户端与 EMQX 集群之间经 SSL 加密的 MQTT 连接,减轻 EMQX 集群的加密解密负担。从而提供多种优势,如提高性能、简化证书管理和增强安全性。
  • NGINX 具有灵活的负载均衡策略,以使用不同的策略来决定请求应该发送到集群中的哪个 EMQX 节点,有助于分摊流量和请求,提高性能和可靠性。例如粘性负载平衡,可将请求路由到同一后端服务器,从而提高性能和会话持久性。

在这里插入图片描述

6.3. 安装nginx

  • 可以从 NGINX 官方网站下载最新的稳定版本
#安装依赖包
yum  -y  install gcc  gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
#创建用户
useradd -s /sbin/nologin nginx
#创建安装目录
cd  /usr/local
wget  https://nginx.org/download/nginx-1.26.1.tar.gz
tar -xf nginx-1.26.1.tar.gz
cd  nginx-1.26.1
./configure  \
--prefix=/data/nginx/   \
--user=nginx   \
--group=nginx   \
--with-threads  \
--with-http_stub_status_module   \
--with-http_ssl_module   \
--with-http_realip_module   \
--with-stream   \
--with-stream_ssl_module
#预编译
make
#编译
make
#安装
make  install
#将 NGINX 可执行文件连接到系统 PATH 中的目录
ln -s /data/nginx/sbin/nginx /usr/local/bin/nginx

6.4. 修改配置文件

vim  /data/nginx/conf/nginx.conf
worker_processes  auto;    	#指定Nginx启动的工作进程数,auto表示根据系统的CPU核心数自动设置工作进程数events {worker_connections  1024;	#定义事件模块,worker_connections指定每个工作进程可以同时打开的最大连接数,这里是1024
}
error_log   /data/nginx/logs/error.log warn;	#定义错误日志文件的位置和日志级别,这里设置为警告级别及以上
pid         /data/nginx/nginx.pid;		#指定存储Nginx主进程ID的文件路径stream {		#定义一个流模块,用于配置TCP/UDP代理#定义自定义日志格式,包含客户端地址、端口、协议、状态码、时间戳、上游服务器地址、发送字节数和连接时间log_format proxy '$remote_addr $remote_port $protocol $status[$time_iso8601] ''"$upstream_addr" "$upstream_bytes_sent""$upstream_connect_time"' ;access_log /data/nginx/logs/access.log  proxy;	#指定访问日志文件的路径,并使用上面定义的proxy日志格式upstream mqtt_servers {	#定义一个名为mqtt_servers的上游服务器组,用于负载均衡#在上游服务器组中添加一个服务器,指定其IP地址和端口号,以及最大失败次数和故障超时时间server 172.16.60.10:1883 max_fails=2 fail_timeout=10s;server 172.16.60.20:1883 max_fails=2 fail_timeout=10s;server 172.16.60.30:1883 max_fails=2 fail_timeout=10s;}server {		#定义一个服务器块,用于配置代理服务器的监听端口和其他设置listen 1883;	#指定Nginx监听的端口号,这里是1883,通常用于MQTT协议proxy_pass mqtt_servers;	#指定代理请求转发的上游服务器组名称proxy_protocol on;		#启用PROXY协议,允许获取客户端的真实IP地址和端口信息proxy_connect_timeout 10s;	#设置与上游服务器建立连接的超时时间proxy_timeout 1800s;		#设置代理服务器的读写超时时间,这里是30分钟proxy_buffer_size 3M;		#设置代理缓冲区的大小tcp_nodelay on;				#启用TCP_NODELAY选项,意味着立即发送数据而不等待更多数据积累}
}

6.5. 启动nginx

#启动服务
nginx
#加载配置文件
nginx  -s   reload
#停止服务
nginx  -s stop

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

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

相关文章

防火墙中的NAT

防火墙的NAT NAT分类 源NAT 基于源IP地址进行转换。 我们之前接触过的静态NAT&#xff0c;动态NAT&#xff0c;NAPT都属于源NAT&#xff0c;都是针对源IP地址进行转换的。源NAT主要目的是为了保证内网用户可以访问公网。 先执行安全策略&#xff0c;后执行NAT 目标NAT 基于…

git的分支管理

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;20246月19日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&#x…

【TB作品】MSP430G2553,单片机,口袋板, 单相交流电压、电流计设计

题5 单相交流电压、电流计设计 设计基于MSP430的单相工频交流电参数检测仪。交流有效值0-220V&#xff0c;电流有效值0-40A。电压、电流值经电压、电流传感器输出有效值为0-5V的交流信号&#xff0c;传感器输出的电压、电流信号与被测电压、电流同相位。 基本要求如下 &#xf…

05、部署 YUM 仓库及NFS 共享服务

目录 5.1 部署YUM软件仓库 5.1.1 准备网络安装源&#xff08;服务器端&#xff09; 1、准备软件仓库目录 2、安装并启用vsftpd服务 5.1.2 配置软件仓库位置&#xff08;客户端&#xff09; 5.2 使用yum工具管理软件包 5.2.1 查询软件包 1、yum list——查询软件包列表 …

DGit的使用

将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理&#xff0c;如果您不在工作区上工作&#xff0c;请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取&#xff0c;你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…

网关助力边缘物联网

网关助力边缘物联网 在探讨网关如何助力边缘物联网&#xff08;IoT&#xff09;的议题时&#xff0c;我们不得不深入分析这一技术交汇点的复杂性与潜力。边缘计算与物联网的融合&#xff0c;通过将数据处理与分析能力推向网络边缘&#xff0c;即数据生成的地方&#xff0c;极大…

接口性能提升秘籍:本地缓存的总结与实践

&#x1f345;我是小宋&#xff0c; 一个只熬夜但不秃头的Java程序员。 &#x1f345;关注我&#xff0c;带你轻松过面试。提升简历亮点&#xff08;14个demo&#xff09; . . &#x1f30f;号&#xff1a;tutou123com。拉你进面试专属群。 优雅的接口调优之本地缓存优化 接口…

Spring中网络请求客户端WebClient的使用详解

Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 …

初识es(elasticsearch)

初识elasticsearch 什么是elasticsearch&#xff1f;&#xff1a; 一个开源的分部署搜索引擎、可以用来实现搜索、日志统计、分析、系统监控等功能。 什么是文档和词条&#xff1f; 每一条数据就是一个文档对文档中的内容进行分词&#xff0c;得到的词语就是词条 什么是正向…

【elementui源码解析】如何实现自动渲染md文档-第四篇

目录 1.前言 2.md-loader - index.js 1&#xff09;md.render() 2&#xff09;定义变量 3&#xff09;while stripTemplate stripScript genInlineComponentText 4&#xff09;pageScript 5&#xff09;return 6&#xff09;demo-block 3.总结 所有章节&#x…

微纳米气泡发生器是微纳米气泡产生装置 未来市场需求将不断释放

微纳米气泡发生器是微纳米气泡产生装置 未来市场需求将不断释放 微纳米气泡发生器即微纳米气泡发生设备&#xff0c;是一种将水和气体混合并产生微纳米气泡的设备。微纳米气泡是指直径在100μm以下的气泡&#xff0c;分为纳米气泡和微米气泡。   微纳米气泡发生器主要由发生设…

录屏录音两不误!电脑录屏录音软件推荐(3款)

在数字化时代&#xff0c;电脑录屏录音软件已成为教学、演示、会议记录等领域不可或缺的工具。它们能够捕捉屏幕上的每一个动作&#xff0c;同时录制音频&#xff0c;为用户提供直观、生动的视听材料。本文将详细介绍三种常用的电脑录屏录音软件&#xff0c;帮助读者了解并掌握…

误删的文件不在回收站如何找回?6个恢复秘诀分享!

“我刚刚误删了一些文件&#xff0c;但是在回收站中没有看到这部分文件&#xff0c;这种情况下还有方法可以找回误删的文件吗&#xff1f;在线等一个答案&#xff01;” 在数字化时代&#xff0c;文件的安全和完整性对于个人和企业都至关重要。然而&#xff0c;有时候由于疏忽或…

【Android】使用SeekBar控制数据的滚动

项目需求 有一个文本数据比较长&#xff0c;需要在文本右侧加一个SeekBar&#xff0c;然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本&#xff0c;但是文本比较长的话&#xff0c;需要在TextView外面套一个ScrollView&#xff0c;但是我…

利用K8S技术栈打造个人私有云

1.三个节点&#xff1a;master&#xff0c;slave&#xff0c;client 在Kubernetes集群中&#xff0c;三个节点的职责分别如下&#xff1a; Master节点&#xff1a; docker&#xff1a;用于运行Docker容器。 etcd&#xff1a;一个分布式键值存储系统&#xff0c;用于保存Kuberne…

42、基于神经网络的训练堆叠自编码器进行图像分类(matlab)

1、训练堆叠自编码器进行图像分类的原理及流程 基于神经网络的训练堆叠自编码器进行图像分类的原理和流程如下&#xff1a; 堆叠自编码器&#xff08;Stacked Autoencoder&#xff09;是一种无监督学习算法&#xff0c;由多个自编码器&#xff08;Autoencoder&#xff09;堆叠…

宝塔软件默认安装位置

自带的JDK /usr/local/btjdk/jdk8Tomcat 各个版本都在bttomcat这个文件夹下面&#xff0c;用版本区分。tomcat_bak8是备份文件 /usr/local/bttomcat/tomcat8nginx /www/server/nginxnginx配置文件存放目录 /www/server/panel/vhost/nginxredis /www/server/redismysql /…

nextjs(持续学习中)

return ( <p className{${lusitana.className} text-xl text-gray-800 md:text-3xl md:leading-normal}> Welcome to Acme. This is the example for the{’ } Next.js Learn Course , brought to you by Vercel. ); } 在顶级 /public 文件夹下提供静态资产 **默认 /…

央国企财务专家的“专家课”——中国总会计师协会联合实在智能举办RPA专项培训

近日&#xff0c;中国总会计师协会正式举办了为期五天的「财务数字化思维与实用IT技能提升」专项培训&#xff0c;吸引了来自中铁十五局集团有限公司、中国航空工业规划设计院、中核核电运行管理有限公司、中国北方车辆有限公司、一汽物流有限公司等国企、事业单位及民营企业共…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称&#xff1a;WRHEES 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;…