4、数据传输协议:MQTT Broker集群搭建、QoS等级选择、TLS加密传输
聊到远程监控平台的数据传输,MQTT几乎是绕不开的协议。我最早接触它是在一个工厂设备数据采集的项目里,当时设备数量一多,单机Broker就扛不住了。嗯,今天我们就来聊聊MQTT Broker集群、QoS等级怎么选,以及TLS加密怎么配。
4.1 MQTT Broker集群搭建
说白了,单机Broker就像一个人搬砖,搬不动了就得叫兄弟。集群就是为了解决高可用和水平扩展的问题。
我个人习惯用EMQX来做集群,它原生支持集群模式,配置起来比较省心。当然,Mosquitto也可以,但需要借助外部组件。
4.1.1 集群架构
先看一张我画的集群架构图,帮你快速理解整体逻辑:
你看,设备先连到负载均衡层,然后请求被分发到不同的EMQX节点。节点之间通过内部集群通信同步数据。这样就算某个节点挂了,其他节点照样能干活。
4.1.2 搭建步骤
我记得第一次搭集群时踩了个坑——节点名称没配好,结果集群一直连不上。这里我把关键步骤列出来:
- 安装EMQX:每个节点都装一遍,版本要一致。
- 配置节点名称:
etc/emqx.conf里改node.name,格式是emqx@IP地址。 - 配置集群发现:我推荐用
etcd或DNS方式,别用手动列表,后期维护太累。 - 启动并加入集群:执行
emqx start,然后在其中一个节点上执行emqx_ctl cluster join emqx@其他节点IP。
4.2 QoS等级选择
QoS(服务质量)是MQTT里一个容易让人纠结的点。你想想看,选高了怕性能扛不住,选低了又怕丢数据。其实没那么复杂,我一般按场景来定。
| QoS等级 | 含义 | 可靠性 | 性能开销 | 适用场景 |
|---|---|---|---|---|
| QoS 0 | 最多发一次,不确认 | 最低 | 最低 | 传感器高频数据(温度、湿度),丢一两条无所谓 |
| QoS 1 | 至少发一次,有确认 | 中等 | 中等 | 设备状态上报,允许重复但必须到达 |
| QoS 2 | 恰好发一次,四次握手 | 最高 | 最高 | 控制指令、告警信息,绝对不能丢也不能重复 |
我在项目中遇到过一个问题:设备上报温度数据用了QoS 2,结果Broker压力巨大,消息堆积严重。后来改成QoS 0,CPU直接降了60%。你想想看,温度数据每秒都在变,丢一两条有什么关系?
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
4.3.3 性能与安全的平衡
TLS加密会带来性能损耗,这是事实。我测过,开启TLS后CPU占用大概增加20%-30%。但为了安全,这点代价值得。
如果你觉得性能吃紧,可以考虑:
- 使用TLS 1.3,比1.2快不少
- 硬件加速卡(比如Intel QAT)
- 内网传输可以不用TLS,用VPC隔离
好了,MQTT这块的核心内容就这些。集群保证高可用,QoS按场景选,TLS保安全。这三样配齐了,你的远程监控平台数据传输才算真正稳了。