mqtt集群搭建并使用nginx做负载均衡_亲测得结论

本文详细介绍了如何搭建RabbitMQ集群并启用mqtt插件,配置nginx进行mqtt负载均衡,以及使用Springboot进行连接测试。测试结果显示,集群在单机故障时能自动切换到其他节点,保证服务连续性。

mqtt集群搭建

RabbitMQ集群搭建和测试总结_亲测

搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了

nginx配置mqtt负载均衡

#修改rabbitmq1节点ip为1.19的nginx配置
vim /etc/nginx/nginx.conf

http {
}
#在http外添加如下配置
stream {
    upstream rabbitmqtt {
        server 192.168.1.17:1883;
        server 192.168.1.18:1883;
        server 192.168.1.19:1883;
    }

    server {
        listen       1884 so_keepalive=on;
        proxy_connect_timeout 60s;
        proxy_timeout 60s;
        proxy_pass rabbitmqtt;
        tcp_nodelay on;
    }
}

#测试nginx配置是否正确
/usr/sbin/nginx -t

#重新加载配置
/usr/sbin/nginx -s reload

mqtt集群测试

上面nginx配置的对外负载均衡代理端口是:1884

MQTTX客户端工具测试

官方下载地址: https://mqttx.app/zh

在这里插入图片描述

spring boot代码测试

spring boot集成mqtt协议发送和订阅数据

mqtt连接配置,部分代码

@Bean
public MqttConnectOptions getMqttConnectOptions(){
    // MQTT的连接设置
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    // 设置连接的用户名
    mqttConnectOptions.setUserName(username);
    // 设置连接的密码
    mqttConnectOptions.setPassword(password.toCharArray());
    // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,
    // 把配置里的 cleanSession 设为false,客户端掉线后 服务器端不会清除session,
    // 当重连后可以接收之前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息
    mqttConnectOptions.setCleanSession(true);
    // 注意这里*******************************************************
    // 设置发布端地址,多个用逗号分隔, 如:tcp://111:1883,tcp://222:1883
    // 当第一个111连接上后,222不会在连,如果111挂掉后,重试连111几次失败后,会自动去连接222
    mqttConnectOptions.setServerURIs(hostUrl.split(","));
    // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
    mqttConnectOptions.setKeepAliveInterval(20);
    mqttConnectOptions.setAutomaticReconnect(true);
    // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。
    mqttConnectOptions.setWill(willTopic, willContent.getBytes(), 2, false);
    mqttConnectOptions.setMaxInflight(1000000);
    return mqttConnectOptions;
}

测试总结

普通集群测试

使用mqttx工具分别连接三台rabbitmq的1883端口,不使用nginx代理时

1 同时都订阅topic:aaa/#,任意一台发送topic:aaa/bbb的数据,三台都能收到数据

2 同时都订阅topic:bbb,任意一台发送topic:bbb的数据,一样的,三台都能收到数据

3 rabbitmqctl stop_app命令,停一台rabbitmq应用,2台同时订阅,任意一台发数据,2台都能收到数据

4 rabbitmqctl stop_app命令,停2台rabbitmq应用,另外一台,能正常使用

使用nginx负载均衡测试

使用mqttx工具

1 分别连接三台1883端口,订阅三台的topic:aaa/#,然后连接一台nginx的1884端口,订阅nginx的一台topic:aaa/#,使用nginx那台1884端口的发数据,4个都能收到数据,另外三台任一台发送,4个都能收到数据

2 rabbitmqctl stop_app命令,停一台rabbitmq应用,nginx订阅的那台,一样能收到数据,发送数据

结论: nginx会自动连接到正常的一台rabbitmq,当一台挂了之后,自动连接下一台

使用spring-mqtt代码测试,连接nginx端口:1884

代码里的配置nginx的ip和代理端口
yaml文件:
username: admin
password: beyond_2021
url: tcp://192.168.1.19:1884

1 停掉一台rabbitmq应用,会断开连接,自动连上另一台,再停掉一台rabbitmq应用,又断开连接,自动连上另一台

代码配置:
url: tcp://192.168.1.17:1883,tcp://192.168.1.18:1883,tcp://192.168.1.19:1883

1 代码默认只会连第一台17,如果第一台连不上时,重试后,会连第二台,以此类推

2 停掉第一台rabbitmq应用,会报断开连接,然后马上会自动连上第二台,以此类推

MQTT集群搭建有多种方式,以下为几种常见方法: ### ActiveMQ + MQTT集群搭建(虚机版本) - 下载apache-activemq-5.15.12-bin.tar.gz ,后续可结合Springboot进行使用配置。MQTT协议轻量级和简单,适合连接大量设备和传输数据,在资源受限的物联网环境优势明显,且因其可靠性、灵活性和互通性在物联网行业广泛应用 [^1]。 ### RabbitMQ + MQTT集群搭建使用nginx负载均衡 - 搭建好RabbitMQ集群开启mqtt插件功能,mqtt集群搭建完成。 - nginx配置mqtt负载均衡: - 修改rabbitmq1节点ip为1.19的nginx配置,编辑`/etc/nginx/nginx.conf` 。 - 在http外添加如下配置: ```nginx stream { upstream rabbitmqtt { server 192.168.1.17:1883; server 192.168.1.18:1883; server 192.168.1.19:1883; } server { listen 1884 so_keepalive=on; proxy_connect_timeout 60s; proxy_timeout 60s; proxy_pass rabbitmqtt; tcp_nodelay on; } } ``` - 测试nginx配置是否正确:`/usr/sbin/nginx -t` - 重新加载配置:`/usr/sbin/nginx -s reload` [^2]。 ### EMQX MQTT服务器集群搭建 #### 方式一:通过docker镜像下载 使用docker命令直接下载EMQX镜像,示例命令如下: ```bash docker run -tid --name emqx --restart=always --cpus=0.6 \ --network host \ -e EMQX_LISTENER__TCP__EXTERNAL=1883 \ -e EMQX_NAME=emqx \ -e EMQX_HOST=192.168.31.160 \ -e EMQX_MANAGEMENT__LISTENER__HTTP=18080 \ -e EMQX_CLUSTER__NAME=ys_emqxcl \ -e EMQX_CLUSTER__DISCOVERY=manual \ -e EMQX_NODE__DIST_LISTEN_MIN=6369 \ -e EMQX_NODE__DIST_LISTEN_MAX=7369 \ -e EMQX_NODE__COOKIE=emqxsecretcookie \ emqx/emqx:4.3.10 ``` 无docker需求的可自行从EMQX官网进行下载,安装方式大致相同 [^4]。 #### 方式二:配置节点监听端口 例如,在emqx.conf中的`node.name = emqx@192.168.0.12` 应使节点的监听端口为4370,而emqx1(或emqx - 1)的端口为4371,以此类推,涉及集群RPC端口的配置 [^3]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值