vlambda博客
学习文章列表

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

mqtt集群搭建

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

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

nginx配置mqtt负载均衡

 
   
   
 
  1. #修改rabbitmq1节点ip为1.19的nginx配置

  2. vim /etc/nginx/nginx.conf


  3. http {

  4. }

  5. #在http外添加如下配置

  6. stream {

  7. upstream rabbitmqtt {

  8. server 192.168.1.17:1883;

  9. server 192.168.1.18:1883;

  10. server 192.168.1.19:1883;

  11. }


  12. server {

  13. listen 1884 so_keepalive=on;

  14. proxy_connect_timeout 60s;

  15. proxy_timeout 60s;

  16. proxy_pass rabbitmqtt;

  17. tcp_nodelay on;

  18. }

  19. }


  20. #测试nginx配置是否正确

  21. /usr/sbin/nginx -t


  22. #重新加载配置

  23. /usr/sbin/nginx -s reload

mqtt集群测试

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

MQTTX客户端工具测试

spring boot代码测试

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

mqtt连接配置,部分代码

 
   
   
 
  1. @Bean

  2. public MqttConnectOptions getMqttConnectOptions(){

  3. // MQTT的连接设置

  4. MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();

  5. // 设置连接的用户名

  6. mqttConnectOptions.setUserName(username);

  7. // 设置连接的密码

  8. mqttConnectOptions.setPassword(password.toCharArray());

  9. // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,

  10. // 把配置里的 cleanSession 设为false,客户端掉线后 服务器端不会清除session,

  11. // 当重连后可以接收之前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息

  12. mqttConnectOptions.setCleanSession(true);

  13. // 注意这里*******************************************************

  14. // 当第一个111连接上后,222不会在连,如果111挂掉后,重试连111几次失败后,会自动去连接222

  15. mqttConnectOptions.setServerURIs(hostUrl.split(","));

  16. // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制

  17. mqttConnectOptions.setKeepAliveInterval(20);

  18. mqttConnectOptions.setAutomaticReconnect(true);

  19. // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。

  20. mqttConnectOptions.setWill(willTopic, willContent.getBytes(), 2, false);

  21. mqttConnectOptions.setMaxInflight(1000000);

  22. return mqttConnectOptions;

  23. }

测试总结

普通集群测试

使用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应用,会报断开连接,然后马上会自动连上第二台,以此类推