https://github.com/hui6075/mosquitto-cluster/blob/master/readme-zh_cn.md
安装环境
820 cd /home
821 ll
822 mkdir mosquitto
823 ll
824 cd mosquitto/
825 ll
826 rz
827 yum install lrzsz
828 git clone https://github.com/hui6075/mosquitto-cluster.git
829 yum -y install git
830 git ?version
831 git -version
832 git --version
833 yum -y install docbook-style-xsl
834 find / -name docbook.xsl
835 ll
836 git clone https://github.com/hui6075/mosquitto-cluster.git
837 ll
838 tar -zcvf mosquitto-cluster.tar.gz mosquitto-cluster
839 ll
840 sz mosquitto-cluster.tar.gz
841 ll
842 history
843 cd mosquitto-cluster && vim config.mk
844 ll
845 /etc/
846 ll
847 cd /etc/
848 ll
849 cd ..
850 lll
851 ll
852 cd home/mosquitto/mosquitto-cluster
853 ll
854 yum install gcc gcc-c++
855 yum install openssl-devel
856 yum install c-ares-devel
857 yum install libuuid-devel
858 yum install wget
859 yum install cmake
860 yum install build-essential python quilt devscripts python-setuptools python3
861 yum install libssl-dev libc-ares-dev uuid-dev daemon openssl-devel
862 yum install libxslt
863 ll
864 history
865 find / -name docbook.xsl
866 cd man/
867 vim manpage.xsl
868 cd ..
869 ll
870 make && make install
871 history
Mosquitto集群
在Mosquitto集群中,客户端可以在任何节点上订阅主题,也可以在任何节点上发布消息,集群会保证消息按需转发到正确的节点。
为了均衡负载及避免单点故障,Mosquitto集群实现为完全去中心化、自治的方式。
编译安装
> git clone https://github.com/hui6075/mosquitto-cluster.git
> cd mosquitto-cluster && vi config.mk
安装
通过命令查找文件 docbook.xsl,在本机中也没有发现,因此基本可以确定是找不到这个文件所致:
[root@localhost mosquitto-1.2]# find / -name docbook.xsl
解决办法:
1.安装docbook-style-xsl
使用命令:yum -y install docbook-style-xsl
2.查看文件docbook.xsl被安装到了哪里:
例如:
[root@localhost tools]# find / -name docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/epub/docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/fo/docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/html/docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/manpages/docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/xhtml/docbook.xsl
/usr/share/sgml/docbook/xsl-stylesheets-1.78.1/xhtml-1_1/docbook.xsl
3.搜索到之后,将上面红字中的地址修改到文件manpage.xsl里的对应位置;
# WITH_BRIDGE:=yes
WITH_CLUSTER:=yes
> make && make install
部署
在所有节点上安装Mosquitto,并把节点名、IP、端口号写进配置文件mosquitto.conf,例如:
node_name node1
node_address 192.168.1.1:1883
node_name node2
node_address 192.168.1.2:1883
然后配置负载均衡器,把所有节点的地址:端口号作为后端服务地址。Mosquitto是单进程实现,建议单机多实例部署,并把TLS终结在负载均衡器。
Mosquitto集群特性
客户端的连接/订阅/取消订阅消息广播到集群内其他节点,发布消息按需转发。
环路避免
任何节点对于来自其他节点的发布消息只会发送给客户端,对于来自其他节点的订阅/取消订阅消息不会被转发。
避免重复订阅
对于每个来自客户端的订阅主题,以引用计数的方式保存在本地,只有在收到新的客户端主题订阅消息,或者主题不再被任何客户端订阅时进行转发。
私有消息
为支持集群session及保留消息,Mosquitto集群引入了如下私有消息:
PRIVATE SUBSCRIBE
固定头部|报文标识符|主题过滤器|QoS|客户端标识符|订阅标识符
PRIVATE RETAIN
固定头部|主题过滤器|QoS|[报文标识符]|客户端标识符|订阅标识符|接收时间戳|有效载荷
SESSION REQ
固定头部|客户端标识符|会话清除标识
SESSION RESP
固定头部|客户端标识符|报文标识符|订阅数量|订阅1(主题过滤器|QoS)|...|订阅N|发布消息数量|发布消息1(主题过滤器|状态|方向|重复标识|QoS|报文标识符|有效载荷)|...|发布消息N|
集群会话支持
每次客户端连接时,若本地没有发现会话信息,则广播SESSION REQ消息,其他节点收到此请求时若发现此客户端的会话信息,则断开/清除此客户端/上下文,若会话清除标识被设为FALSE,则返回此客户端的订阅状态及未完成的QoS为0和1的发布消息。此特性可以通过配置文件禁用,但压测和性能采样结果表明此特性在大并发的情况下并不会带来特别大的开销。
集群保留消息支持
每次收到来自于客户端的订阅时,节点会广播PRIVATE SUBSCRIBE,如果存在保留消息,其他节点会把此保留消息及接收时间通过PRIVATE RETAIN消息返回给此节点,因此客户端得以收到集群中绝对时间戳最晚的保留消息。
QoS支持
所有发布消息以原始QoS在集群内转发,但被节点当做QoS为0进行处理。实际转发给客户端的发布消息按照协议取发布QoS和订阅QoS两者较小值。
其他特性
集群间消息处理时不进行校验。集群间建立连接时发送所有本地先前的订阅关系。
设计思想
Mosquitto集群目标
水平扩展,避免单点故障,整个集群对外表现为一个完整的逻辑MQTT代理。
每次收到客户端的订阅消息时,通知其他节点此话题被订阅;每次收到客户端的发布消息时,把消息路由到正确的节点上。
节点与其他节点间只有一条逻辑通道,为了承载不同客户端的订阅/发布消息,引入了一些私有消息,包含客户端标识符、订阅标识符、时间戳等等,以帮助节点做出正确的路由和转发。
转发规则:
转发来自于客户端的本节点新发生的订阅;当话题不再被任何客户端订阅时广播取消订阅消息;不转发任何系统话题。
Benchmark
使用krylovsk/mqtt-benchmark对集群进行简单的基准测试,集群吞吐率在3个以上节点时受限于客户端从而停止增长。
n=10k表示每个客户端发送10000条消息, c=100表示总共启动100个客户端。
消息长度1000字节,QoS选取为2。
更详细的Tsung压测报告: https://github.com/hui6075/mosquitto-cluster/tree/master/benchmark