1、集群的必要性
MQTT 是专门为物联网设备设计的一套标准的通信协议。这套协议在消息模型和功能上与普通的消息队列协议是差不多的,最大的区别在于应用场景不同。在物联网应用场景中,IoT 设备性能差,网络连接不稳定。服务端面临的挑战主要是,需要支撑海量的客户端和主题。
已有的开源的 MQTT 产品,对于协议的支持都不错,在客户端数量小于十万级别的情况下,可以选择。对于海量客户端的场景,服务端必须使用集群来支撑,可以选择收费的云服务和企业版产品。也可以选择自行来构建 MQTT 集群。
自行构建集群,最关键的技术点就是,通过前置的 Proxy 集群来解决海量连接、会话管理和海量主题这三个问题。前置 Proxy 负责在 Broker 和客户端之间转发消息,通过这种方式,将海量客户端连接收敛为少量的 Proxy 与 Broker 之间的连接,解决了海量客户端连接数的问题。维护会话的实现原理,和 Tomcat 维护 HTTP 会话是一样的。对于海量主题,可以在后端部署多组 Broker 小集群,每个小集群分担一部分主题这样的方式来解决。
极客时间 消息队列高手课 https://time.geekbang.org/column/article/139968?utm_source=pinpaizhuanqu&utm_medium=geektime&utm_campaign=guanwang&utm_term=guanwang&utm_content=0511
2、集群的网络架构图
这个图从左向右看,首先接入的地址最好是一个域名,这样域名的后面可以配置多个 IP 地址做负载均衡,当然这个域名不是必需的。也可以直接连接负载均衡器。负载均衡可以选择像 F5 这种专用的负载均衡硬件,
也可以使用 Nginx 这样的软件,只要是四层或者支持 MQTT 协议的七层负载均衡设备,都可以选择。
负载均衡器的后面,需要部署一个 Proxy 集群,这个 Proxy 集群承担了三个重要的作用:第一个作用是来承接海量 IoT 设备的连接,第二个作用是来维护与客户端的会话,第三个作用是作为代理,在客户端和 Broker 之间进行消息转发。
在 Proxy 集群的后面是 Broker 集群,负责保存和收发消息。
极客时间 消息队列高手课 https://time.geekbang.org/column/article/139968?utm_source=pinpaizhuanqu&utm_medium=geektime&utm_campaign=guanwang&utm_term=guanwang&utm_content=0511
3、Mosquitto的分布式集群部署
如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。
首先集群需要2台以上的Mosquitto服务器。安装方式同上。
先了解下Mosquitto集群模式的逻辑图,如下:
可以看出,无论在那台服务器中订阅了信息,无论在那台服务器上发布信息,订阅者都可以收到发布的信息。那么下一步我们着手搭建集群服务器,为了方便只演示2台服务器之间的集群搭建。
集群部署有一个专有名词叫做“桥接”,实现桥接的方式需要修改config.mk与mosquitto.conf文件。值得说明的是如果有10台服务器做Mosquitto集群,每台服务器上将桥连接打开,然后只需要更改一台服务器上的Mosquitto.conf文件即可,其他服务器的Mosquitto.conf文件不需要做任何改动。大大方便了集群的维护。如果有新的服务器加入或删除只需要修改主服务器的Mosquitto.conf即可。
3.1、开启服务器桥连接
进入安装目录
cd mosquitto-1.4.9/
打开config.mk文件
vi config.mk
找到WITH_BRIDGE:=yes 将签名的“#”号去掉开启桥连接模式。(默认是开启的,为了无误查看一下)
3.2、配置Mosquitto.conf的桥连接属性
进入etc目录,并且打开Mosquitto.conf文件
cd /etc/mosquitto/
vi mosquitto.conf
找到Bridges节点,在下面加入如下代码:
connection mytest
address 10.19.22.53:1883
topic room1/# both 2 sensor/ myhouse/
bridge_protocol_version mqttv311
notifications true
cleansession true
try_private true
start_type automatic
---------------------------------------------------------------------------------
connection 连接名称,可以随便取
address 连接的另外服务器地址和端口号,如果有多台服务器,可以写多个address
topic 主题名称,“#”为通配符,表示发布端可以在room1/后面接任何文字
both 服务质量,2代表只有一次
sensor/ 本地前缀标识,可以随便命名
myhouse/ 远程前缀标识,可以随便命名
bridge_protocol_version mqttv311 桥连接协议版本MQTT3.11
notifications 是否发布桥接的状态信息
cleansession 桥接断开时,是否清除远程服务器中的消息
start_type 桥接模式,目前有三种:automatic、lazy、once
设置好之后保存退出。
3.3、开启服务器
第一步先确保从服务器先开启,第二步重新启动主服务器的Mosquitto服务。如果配置无误主服务器在开启的时候,会自动连接所有从服务器,显示如下:
Mytest实在Mosquitto.conf配置中设定的我的连接名称,后面是从服务器的地址与端口号
如上图所示,主服务器与从服务器已经桥接完成。
3.4、验证发布/订阅
集群的特点在任何服务器上都可以订阅与发布,并且订阅者可以收到在任何服务器中发送去信息。
测试场景:在从服务器中订阅一条信息,在主服务器中发布一条信息,从服务器的订阅者可以收到从主服务器中发布的消息。
(1)在从服务器中键入一下命令:
mosquitto_sub -t myhouse/room1/#
注意:myhouse/ 是编写Mosquitto.conf中topic的远程前缀。
room1/#是topic中的订阅主题
(2)在主服务器中键入一下命令:
mosquitto_pub -t sensor/room1/temperature -m '26.3'
注意:sensor/ 是编写Mosquitto.conf中topic的本地前缀。
room1/ 是topic中的订阅主题
temperature 相当与“#”通配符
如果Mosquitto.conf配置无误,并且本地前缀与远程前缀拼写正确,那么会显示如下图信息,表示集群配置成功
在从服务器订阅,在主服务器发送,从服务器订阅者收到信息:
4、多集群部署
配置3台服务集群与3+n台理论一样,所以这里配置3台服务集群作为演示。
4.1、安装服务器
首先在上述2台服务器基础上,再增加一台服务器,配置步骤请参考第二篇博文。
4.2、配置服务器
假设有3台服务器分别是
192.168.0.53
192.168.0.88
192.168.0.89
其中53为主服务器,88与89为从服务器。
所以在88与89上只需要正常安装Mosquitto服务即可,其他不需要做任何配置。
重点还是在53的mosquitto.conf中配置。
依然打开mosquitto.conf,找到Bridge节点,重新复习一下节点中每个配置项的含义
#connection <name>
#address <host>[:<port>] [<host>[:<port>]]
#topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]
笔者一开始错误的认为红色字体部分是配置第二台服务器使用的,但是笔者错了。每一个connection只能有一个IP地址,address红色的部分是留有多个ip的保存。(貌似是对前地址的一个备份,如果前地址服务器挂了可以立马接手备用服务器,笔者尚未证实)
如果想增加一台服务器只需要重新添加connection、address、topic节点即可。因此Bridge节点变成下面形式:
connection mytest
address 192.168.0.88:1883
topic room1/# both 2 sensor/ myhouse/
connection mytest2
address 192.168.0.89:1883
topic room1/# both 2 sensor/ myhouse/
bridge_protocol_version mqttv311
notifications true
cleansession true
try_private true
start_type automatic
红色部分为新增加的服务器。重启Mosquitto服务器即可。
4.3、测试订阅、发布
测试理论与第一节类似:
分别在88与89服务器中输入mosquitto_sub -t myhouse/room1/# 订阅信息
在53服务器中输入mosquitto_pub -t sensor/room1/temperature -m '26.3' 发布消息
同事88与89都会收到“26.3”这条信息。如果只有一台服务器收到说明配置有问题。
以上配置完成了对Mosquitto服务器的基础配置