登录
主页
Mosquitto集群
2025-10-27
  
1097
深数据
MQTT(Message Queuing Telemetry Transport)作为轻量级的物联网(IoT)通信协议,已广泛应用于设备间数据传输场景。而Eclipse Mosquitto作为开源MQTT Broker的代表,凭借轻量、高效、兼容多版本MQTT协议(v3.1.1、v5.0)的特性,成为中小型IoT项目的首选。但随着设备规模增长(如百万级连接)、业务对可靠性要求提升(如零单点故障),单机Mosquitto的性能瓶颈与可用性风险逐渐凸显——Mosquitto集群正是解决这一问题的核心方案,通过多节点协同实现高可用、负载均衡与横向扩展。
一、为何需要Mosquitto集群?
单机Mosquitto的局限性在大规模场景下会直接影响业务稳定性,而集群通过三大能力解决痛点。从高可用(HA)需求来看,单机Mosquitto存在单点故障问题,一旦故障会导致整个MQTT服务中断,无法接收或转发消息;集群则通过多节点冗余实现高可用,任一节点故障时,其他节点会自动接管业务,确保服务不中断。从负载均衡需求来看,单机的CPU、内存、网络带宽存在上限,连接数(默认约10万)和消息吞吐量容易触顶;集群能分散客户端连接与消息处理压力,避免单节点过载。从横向扩展需求来看,单机性能无法通过硬件升级无限提升,存在“垂直扩展瓶颈”;集群可按需新增节点,动态扩展集群容量,适配设备规模的持续增长。
二、Mosquitto集群核心概念
在部署集群前,需先明确关键术语,避免概念混淆:
1.MQTT Broker节点:集群的基本单元,即运行Mosquitto服务的服务器,主要负责接收客户端连接、转发消息、管理会话。
2.消息同步:集群节点间的核心协作逻辑,只有确保任一节点接收的消息能同步到其他节点,才能避免连接不同节点的客户端漏收消息。
3.会话持久化:当客户端设置`clean_session=false`时,Broker需要保存客户端的订阅关系与未确认消息(QoS 1/2);集群中需确保会话信息在节点间共享,否则节点切换后会话会丢失。
4.负载均衡器(LB):集群的“入口”,负责将客户端连接分发到后端Mosquitto节点,常见工具包括HAProxy、Nginx,其中Nginx需支持TCP转发(因MQTT默认基于TCP协议)。
5.健康检查:由负载均衡器或集群内部执行的节点状态检测,比如检查TCP端口是否存活、MQTT Ping响应是否正常,目的是自动剔除故障节点,避免客户端连接到不可用节点。
三、Mosquitto集群常见架构模式
Mosquitto原生并未提供“开箱即用”的集群功能,需依赖配置或第三方工具实现,实际场景中主要有两种架构模式,需根据业务需求选择:
模式1:桥接模式(Bridging)—— 分布式场景首选
原理
桥接模式通过“桥接”功能将多个独立的Mosquitto节点连接,节点可跨地域、跨数据中心部署,节点间会通过预设的“桥接主题”同步消息。例如,Node A的客户端发布消息到`topic/iot`,Node A会通过桥接将这条消息同步到Node B,此时Node B上订阅该主题的客户端就能接收消息。
核心配置(以Node A为例)
```ini
Node A自身配置
listener 1883 0.0.0.0 监听MQTT默认端口
allow_anonymous true 测试环境允许匿名(生产环境禁用)
persistence true 开启持久化(避免重启丢失消息)
persistence_file mosquitto.db 持久化文件路径
桥接配置(连接到Node B)
connection bridge-to-nodeB 桥接名称(自定义)
address 192.168.1.102:1883 Node B的IP:端口
topic both 同步所有主题(格式:topic <主题> <方向>,both=双向同步)
bridge_protocol_version mqttv311 桥接使用的MQTT版本
bridge_attempt_unsubscribe true 断开时自动取消订阅
```
优缺点
优点:部署灵活度高,支持跨地域节点部署;节点独立故障不会影响集群整体,可用性较高。
缺点:消息同步依赖“桥接主题”,配置过程复杂;跨节点消息存在延迟(延迟时长取决于网络状况);无法实现会话共享,客户端切换节点后需重新订阅。
适用场景
跨数据中心、跨地域的分布式IoT场景,比如全国性的设备监控系统;
对会话持久化要求较低,仅需实现消息跨节点同步的场景。
模式2:负载均衡+共享存储模式—— 高可用与低延迟首选
原理
该模式通过“负载均衡器(如HAProxy)+ 多Mosquitto节点 + 外部共享存储(如Redis)”构建集中式集群,具体逻辑分为三步:第一步,负载均衡器作为客户端唯一入口,将客户端连接分发到后端的Mosquitto节点;第二步,所有Mosquitto节点通过外部共享存储(Redis)保存会话信息(订阅关系、未确认消息)和订阅映射,实现会话共享;第三步,节点间通过共享存储同步消息,避免消息丢失。
架构图
```
[客户端] → [HAProxy(负载均衡+健康检查)] → [Mosquitto Node 1]
→ [Mosquitto Node 2]
→ [Mosquitto Node 3]
[Redis(共享存储)]
```
核心依赖
负载均衡器:推荐使用HAProxy,其原生支持TCP健康检查;也可使用Nginx,但需配置stream模块以支持TCP转发。
共享存储:通常选用Redis,用于存储会话、订阅信息和消息,需配合Mosquitto的Redis插件(如`mosquitto-auth-plugin`)实现数据读写。
Mosquitto插件:需编译安装支持共享存储的插件,确保节点间能通过插件实现会话与消息同步。
优缺点
优点:节点通常部署在同地域,消息延迟低;支持会话共享,客户端切换节点无需重新订阅;负载均衡器自动分发压力,集群性能稳定。
缺点:依赖外部组件(HAProxy、Redis),部署复杂度较高;Redis需单独构建高可用架构(如Redis集群),否则会成为新的单点故障源。
适用场景
单数据中心、高并发场景,比如十万级设备连接的IoT系统;
对会话持久化、消息低延迟要求较高的业务,比如实时设备控制系统。
四、高可用集群部署(负载均衡+Redis模式)
以“3个Mosquitto节点 + HAProxy负载均衡 + Redis共享存储”为例,讲解具体部署步骤(基于Ubuntu 22.04系统)。
1.环境准备
部署前需明确各组件的版本要求、示例IP及作用。其中,Mosquitto需选择2.0+版本(推荐2.9.20),示例IP为192.168.1.101、192.168.1.102、192.168.1.103,作用是作为MQTT Broker节点;HAProxy需2.0+版本,示例IP为192.168.1.200,主要负责负载均衡与健康检查;Redis需6.0+版本,示例IP为192.168.1.300,用作共享存储以保存会话和订阅信息;客户端工具选用MQTTX 1.9+版本,用于测试集群连接与消息转发功能。
2.步骤1:部署Redis(共享存储)
a.安装Redis:执行`sudo apt update && sudo apt install redis-server -y`命令完成安装。
b.配置Redis允许远程访问:修改`/etc/redis/redis.conf`文件,将`bind`参数设为`0.0.0.0`(允许所有IP访问,生产环境需限制Mosquitto节点IP),将`protected-mode`设为`no`(关闭保护模式,生产环境需配合密码使用),添加`requirepass your_redis_password`配置Redis密码(该配置为必填项)。
c.重启Redis并验证:执行`sudo systemctl restart redis-server`重启服务,再通过`redis-cli -h 192.168.1.300 -a your_redis_password ping`命令验证,返回“PONG”即表示Redis正常运行。
3.步骤2:部署Mosquitto节点(3个节点配置一致)
3.1 安装Mosquitto与依赖
```bash
安装Mosquitto
sudo apt install mosquitto mosquitto-clients -y
安装编译插件依赖(用于Redis集成)
sudo apt install git build-essential libmosquitto-dev libhiredis-dev -y
```
3.2 编译安装Redis插件(mosquitto-auth-plugin)
```bash
克隆插件源码
git clone https://github.com/jpmens/mosquitto-auth-plug.git
cd mosquitto-auth-plug
复制配置模板并修改(指定Redis信息)
cp config.mk.in config.mk
sed -i 's/BACKEND_REDIS ?= no/BACKEND_REDIS ?= yes/' config.mk
sed -i 's/REDIS_CFLAGS = -I\\/usr\\/local\\/include/REDIS_CFLAGS = -I\\/usr\\/include\\/hiredis/' config.mk
sed -i 's/REDIS_LDFLAGS = -L\\/usr\\/local\\/lib -lhiredis/REDIS_LDFLAGS = -L\\/usr\\/lib\\/x86_64-linux-gnu -lhiredis/' config.mk
编译插件
make
将插件复制到Mosquitto插件目录
sudo cp auth-plug.so /usr/lib/x86_64-linux-gnu/mosquitto/
```
3.3 配置Mosquitto(`/etc/mosquitto/mosquitto.conf`)
```ini
基础配置
listener 1883 0.0.0.0
allow_anonymous true 测试环境允许匿名(生产环境需禁用,用Redis做认证)
persistence false 关闭本地持久化,依赖Redis共享存储
log_dest file /var/log/mosquitto/mosquitto.log 日志路径
Redis插件配置(会话与订阅共享)
auth_plugin /usr/lib/x86_64-linux-gnu/mosquitto/auth-plug.so
auth_opt_backends redis
auth_opt_redis_host 192.168.1.300
auth_opt_redis_port 6379
auth_opt_redis_password your_redis_password
auth_opt_redis_userdb 0 Redis数据库编号
auth_opt_redis_subdb 1 订阅信息存储的数据库编号
auth_opt_redis_superuser your_superuser 超级用户(可选)
```
3.4 启动Mosquitto并验证
```bash
重启Mosquitto
sudo systemctl restart mosquitto
sudo systemctl enable mosquitto 设置开机自启
验证节点是否正常运行
mosquitto_sub -h 192.168.1.101 -t \"test/topic\" & 后台订阅主题
mosquitto_pub -h 192.168.1.101 -t \"test/topic\" -m \"hello\" 发布消息
若能收到\"hello\",说明节点正常
```
4.步骤3:部署HAProxy(负载均衡)
4.1 安装HAProxy
```bash
sudo apt install haproxy -y
```
4.2 配置HAProxy(`/etc/haproxy/haproxy.cfg`)
```ini
全局配置
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
默认配置
defaults
log global
mode tcp MQTT基于TCP,需设置为tcp模式
option tcplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
统计页面(可选,用于查看集群状态)
listen stats
bind *:8080
stats enable
stats uri /haproxy-stats
stats auth admin:admin123 统计页面用户名密码
MQTT负载均衡配置(前端)
frontend mqtt_front
bind *:1883 监听MQTT默认端口
default_backend mqtt_back
MQTT后端节点配置
backend mqtt_back
balance roundrobin 轮询负载均衡算法(可选leastconn:最少连接优先)
option tcp-check 开启TCP健康检查
tcp-check connect 检查节点是否能连接
tcp-check send CONNECT\\r\\n 发送MQTT CONNECT命令
tcp-check expect string CONNACK 期望收到CONNACK响应(验证节点存活)
server mosq1 192.168.1.101:1883 check inter 3s fall 2 rise 2 节点1,每3秒检查,2次失败剔除,2次成功恢复
server mosq2 192.168.1.102:1883 check inter 3s fall 2 rise 2 节点2
server mosq3 192.168.1.103:1883 check inter 3s fall 2 rise 2 节点3
```
4.3 重启HAProxy并验证
```bash
sudo systemctl restart haproxy
sudo systemctl enable haproxy
验证负载均衡:通过HAProxy连接集群
mosquitto_sub -h 192.168.1.200 -t \"test/cluster\" &
mosquitto_pub -h 192.168.1.200 -t \"test/cluster\" -m \"cluster works\"
若能收到消息,说明HAProxy与后端节点通信正常
查看HAProxy统计页面:浏览器访问 http://192.168.1.200:8080/haproxy-stats,输入用户名admin/密码admin123,可看到3个节点均为“UP”状态
```
5.步骤4:集群故障转移测试
集群的核心价值是“高可用”,需验证故障节点是否被自动剔除:
a.停止其中一个Mosquitto节点(如192.168.1.101):执行`sudo systemctl stop mosquitto`。
b.查看HAProxy统计页面:192.168.1.101会被标记为“DOWN”,客户端连接会自动分发到102、103节点。
c.使用MQTTX工具连接HAProxy(192.168.1.200:1883),发布、订阅消息,验证服务正常运行。
d.重启192.168.1.101节点:执行`sudo systemctl start mosquitto`。
e.查看HAProxy统计页面:192.168.1.101会恢复为“UP”状态,重新加入集群。
五、集群配置关键要点与风险规避
1.禁用匿名访问,加强安全
生产环境中需关闭`allow_anonymous true`配置,通过Redis存储客户端账号密码(在`mosquitto.conf`中配置`auth_opt_redis_userdb`映射账号密码),同时启用SSL/TLS加密,具体需配置`listener 8883`并指定证书路径,避免消息被窃取或伪造。
2.确保会话与消息不丢失
客户端需设置`clean_session=false`,确保会话能持久化;
Redis需部署主从复制或集群架构,避免Redis成为单点故障源(可参考Redis Sentinel方案);
消息QoS等级需匹配业务需求,QoS 0(最多一次)适合非关键数据,QoS 1(至少一次)、QoS 2(恰好一次)适合关键数据(如设备控制指令)。
3.合理配置健康检查参数
HAProxy的`inter`(检查间隔)建议设置为3-5秒,`fall`(失败次数)设置为2-3次,`rise`(恢复次数)设置为2次;过短的检查间隔会增加节点压力,过长则无法及时发现节点故障。
4.避免消息风暴
集群中若大量客户端同时订阅同一主题,消息同步会导致节点带宽压力骤增。需通过“主题分区”分散消息流量,比如按设备ID划分主题(`topic/iot/device1`、`topic/iot/device2`),同时通过`max_connections`配置限制单节点的最大连接数。
六、集群监控与优化
1.监控方案:Prometheus + Grafana
Mosquitto监控:安装`mosquitto-exporter`(开源 exporter),通过该工具采集节点的连接数、消息吞吐量(发布/订阅量)、QoS分布等指标。
HAProxy监控:HAProxy原生支持Prometheus,需在`haproxy.cfg`中配置`stats socket`,再通过`haproxy-exporter`采集负载均衡器的连接数、节点状态等指标。
Grafana可视化:导入现成的Dashboard模板(如Mosquitto对应的Dashboard ID:12144,HAProxy对应的Dashboard ID:2428),实时查看集群运行状态。
2.性能优化
资源分配:每10万MQTT连接约需2GB内存,CPU核心数建议≥2,避免因CPU核心不足导致上下文切换频繁。
存储优化:Redis使用SSD存储,提升会话读写速度;Mosquitto日志需按大小切割(通过`log_rotate_size`配置),避免日志文件占满磁盘。
网络优化:集群节点与Redis需部署在同一局域网,减少跨网段带来的延迟;HAProxy配置`option tcp-smart-connect`启用TCP复用,提升连接效率。
七、结语
Mosquitto集群并非“银弹”,需根据业务规模(设备数量、消息量)、可用性要求(RTO/RPO)、部署环境(单/多数据中心)选择合适的架构模式。对于中小型场景,桥接模式足够满足需求;对于大规模、高可靠场景,负载均衡+共享存储模式是更优解。
随着IoT设备规模持续增长,Mosquitto集群的运维复杂度也会提升——建议结合自动化工具(如Ansible批量部署节点、Docker容器化管理)、监控告警体系(如Alertmanager配置节点故障告警),实现集群的稳定运行与高效维护。
点赞数:12
© 2021 - 现在 杭州极深数据有限公司 版权所有 联系我们 
浙公网安备 33018302001059号  浙ICP备18026513号-1号