MQTT+Nginx+Keepalive实现 高可用+负载均衡的集群效果 - Go语言中文社区

MQTT+Nginx+Keepalive实现 高可用+负载均衡的集群效果


Mqtt是基于Tcp的发布/订阅模型的轻量级传输协议,由于Apache Active MQ 可以作为消息传输的中间件,就决定使用AMQ作为broker,但由于业务的需求,需要同时与大量的客户端进行同时通信,就不得不使用分布式的组织架构,采用集群的方式加大服务的承载能立,提高可用性。

经过研究发现AMQ的部署方式由多种,但每一种方式都各有利弊。

1.    主备模式:
一台服务器做master,当master 挂掉时slave住自动接管master的任务,对外提供服务。Master-slave 之间是数据互通的,但却不能做到负载均衡,对外提供服务的只有mater,虽然做到了高可用,但不能做到负载均衡,并且并不能提高节点的承载能力。
2.    使用zookeeper+keepalive实现伪集群
Zookeeper是一个第三方的调度软件,2N+1个节点下才能对外提供正常的服务。在这种部署模式下,多台broker组成一个集群,数据在三个节点之间进行备份,当正在提供服务的broker挂掉时,zookeeper会自动的推选出一个master,等之前的master恢复时会自动被zookeeper接管,接受调度。虽然做到了高可用,但是却不能提供负载均衡功能。
3.    使用文件目录共享或数据库共享的模式进行的集群
虽然实现了集群,但是也只是高可用,也不能实现负载。尤其时使用jdbc时,其性能受制于数据库的性能,并且数据库也要做高可用主备,不推荐使用。
4.    使用静态集群方式
在配置时可以很好的完成负载均衡,但是数据只是存储在一台broker上,当这台broker挂掉时,其消息就不会被消费,只能等这台broker重启,并且超过三台时,由于两两要进行数据的传输,所以配置就相当的麻烦,不推荐使用。
5.    使用动态发现的方式进行集群
与静态集群的原理类似,但配置简单。
6.    使用zookeeper +keepalive+Activemq 进行集群
Zookeeper+ activeMq 进行两个集群的配置,在使用keepalive 抽象出两个虚拟的ip,每个集群中都分别使用这两个虚拟IP进行通信(keepalive会自动根据绑定的网卡推选出可用的服务器—zookeeper接管的对外提供服务的broker的ip,保证服务可用)。这样两个原本互不相关的集群便实现了高可用+负载均衡。不过缺点也很明显,拓展集群不方便。

7.network of brokers部署方式 与4,5 两种方式类似

 

基于mqtt的特性考虑,可以采取折中的方案,使用实现了负载均衡+扩展性强的部署方式。Mqtt设计的初衷就是为了和计算能力弱的物联网设备或网络通信不佳的联网设备所使用的。在网络不加时即使是使用tcp协议也会经常出现报文丢失导致重发的情况,因此可以放弃部分高可用性,使用时效机制,在传输的数据上添加一个信息有效期,让终端设备自行判断报文数据的可用性,因此可以使用动态部署的方式,根据终端的数量灵活的增加服务器数量,提高吞吐量,增加承载能力。

activeMQ的集群部署方式是具有失效备缓机制(failover),因此,连接地址可以这样写,

failover:(uri1,...,uriN)?transportOptions 或者 failover:uri1,...,uriN

例子:

failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false

failover:(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100 (

如果这样使用报错你可以试试这个:failover://(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100  (this way works in ActiveMQ 4.1.1 the one above does not)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------当客户端不支持failover时,比如使用了mosquitto、基于eclipse.echo.mqttv3.开发时不支持这种连接方式,可以使用nginx+keepalive的方式将所有的broker地址 进行反向代理。

nginx自1.9版本,最新稳定版1.14 后支持tcp的流量转发,之前是直接转发http请求,也就是说只有浏览器地址栏的请求被转发,其他的tcp流量不会被转发。

不过这个功能在安装时是默认关闭的,可以使用下列方式进行安装。

1.解压nginx安装包

2.进入问价夹内,找到configure文件,将目录切换到这一层。

3  ./configure   --with-stream   (--with-stream 开启tcp/udp转发功能)

4.make

5 make install 

nginx 自动被安装到/usr/local/nginx 目录下,

添加简单的配置,

注意:stream与http要保持在同一级,不能写在http{}内部,这样访问nginx服务器所在的ip地址+18883时会自动将流量转发到192.168.88.26:18883 上,(mqtt是基于tcp的,所以在listen 端口上可以省略 tcp字段,如果是udp 要这么写    listen 18883 udp;)

------------------------------------------------------------------------------------------------------------------------------------------------

若果有多台broker 要配置权重值,流量通过tcp协议转发到目标broker上,在目标broker上用tcpdump 抓包依然时mqtt报文,方便开发中的调试。

-------------------------------------------------------------------------------------------------------------------------------------------------

两外准备一台nginx服务器做相同的操作,两台nginx 使用keepalive做主备,虚拟出来一个VIP(vertail  IP),提高可用性

 

==================================================================================

如果认为这篇文章帮到了你,那就请领个红包打赏下吧

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42327945/article/details/88399036
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-05-11 23:29:19
  • 阅读 ( 1937 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢