4、数据传输协议:MQTT Broker集群搭建、QoS等级选择、TLS加密传输

聊到远程监控平台的数据传输,MQTT几乎是绕不开的协议。我最早接触它是在一个工厂设备数据采集的项目里,当时设备数量一多,单机Broker就扛不住了。嗯,今天我们就来聊聊MQTT Broker集群、QoS等级怎么选,以及TLS加密怎么配。

4.1 MQTT Broker集群搭建

说白了,单机Broker就像一个人搬砖,搬不动了就得叫兄弟。集群就是为了解决高可用和水平扩展的问题。

我个人习惯用EMQX来做集群,它原生支持集群模式,配置起来比较省心。当然,Mosquitto也可以,但需要借助外部组件。

4.1.1 集群架构

先看一张我画的集群架构图,帮你快速理解整体逻辑:

设备层 传感器设备1 传感器设备2 传感器设备3 传感器设备N 负载均衡层 Nginx / HAProxy MQTT Broker集群 EMQX节点1 EMQX节点2 EMQX节点3 数据存储层 时序数据库 (InfluxDB / TimescaleDB)

你看,设备先连到负载均衡层,然后请求被分发到不同的EMQX节点。节点之间通过内部集群通信同步数据。这样就算某个节点挂了,其他节点照样能干活。

4.1.2 搭建步骤

我记得第一次搭集群时踩了个坑——节点名称没配好,结果集群一直连不上。这里我把关键步骤列出来:

  1. 安装EMQX:每个节点都装一遍,版本要一致。
  2. 配置节点名称etc/emqx.conf里改node.name,格式是emqx@IP地址
  3. 配置集群发现:我推荐用etcdDNS方式,别用手动列表,后期维护太累。
  4. 启动并加入集群:执行emqx start,然后在其中一个节点上执行emqx_ctl cluster join emqx@其他节点IP
小技巧:集群节点数建议3个起步,奇数个节点有利于选主。我一般用3节点或5节点,再多就看业务量了。

4.2 QoS等级选择

QoS(服务质量)是MQTT里一个容易让人纠结的点。你想想看,选高了怕性能扛不住,选低了又怕丢数据。其实没那么复杂,我一般按场景来定。

QoS等级 含义 可靠性 性能开销 适用场景
QoS 0 最多发一次,不确认 最低 最低 传感器高频数据(温度、湿度),丢一两条无所谓
QoS 1 至少发一次,有确认 中等 中等 设备状态上报,允许重复但必须到达
QoS 2 恰好发一次,四次握手 最高 最高 控制指令、告警信息,绝对不能丢也不能重复

我在项目中遇到过一个问题:设备上报温度数据用了QoS 2,结果Broker压力巨大,消息堆积严重。后来改成QoS 0,CPU直接降了60%。你想想看,温度数据每秒都在变,丢一两条有什么关系?

避坑指南:我曾经在一个告警系统里全用了QoS 2,结果网络抖动时消息积压导致内存溢出。后来我把告警指令保留QoS 2,普通状态上报降为QoS 1,问题就解决了。记住,QoS 2不是万能的,它是有代价的。

4.3 TLS加密传输

数据在公网上裸奔,想想都害怕。TLS加密是必须的,尤其是跨公网传输时。我见过太多因为没加密导致数据被篡改的案例了。

4.3.1 证书生成

自己搭CA签证书,还是用Let's Encrypt?我个人习惯用自签名证书做内部测试,生产环境用正规CA签发的证书。

# 生成CA根证书
openssl req -new -x509 -days 3650 -keyout ca.key -out ca.crt -subj "/CN=MyCA"

# 生成Broker证书
openssl genrsa -out broker.key 2048
openssl req -new -key broker.key -out broker.csr -subj "/CN=emqx.example.com"
openssl x509 -req -days 365 -in broker.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out broker.crt

4.3.2 EMQX配置TLS

配置其实不复杂,但路径别搞错。我上次就是证书路径写错了,排查了半天。

# etc/emqx.conf
listener.ssl.external = 8883
listener.ssl.external.keyfile = /etc/emqx/certs/broker.key
listener.ssl.external.certfile = /etc/emqx/certs/broker.crt
listener.ssl.external.cacertfile = /etc/emqx/certs/ca.crt
重点:客户端连接时也要配置CA证书,否则会报证书验证失败。很多新手只配了服务端,忘了客户端,结果连不上。

4.3.3 性能与安全的平衡

TLS加密会带来性能损耗,这是事实。我测过,开启TLS后CPU占用大概增加20%-30%。但为了安全,这点代价值得。

如果你觉得性能吃紧,可以考虑:

  • 使用TLS 1.3,比1.2快不少
  • 硬件加速卡(比如Intel QAT)
  • 内网传输可以不用TLS,用VPC隔离
我的经验:内网设备之间我一般用VPC+防火墙隔离,不加密。跨公网传输必须TLS。别为了省那点性能把数据安全搭进去,划不来。

好了,MQTT这块的核心内容就这些。集群保证高可用,QoS按场景选,TLS保安全。这三样配齐了,你的远程监控平台数据传输才算真正稳了。


专注资料整理