前言:实验室由于项目需要,需要将原本的单体环境扩展为分布式的,刚好趁这个机会稍微了解了一下关于MQTT、负载均衡等知识
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种订阅/发布模式的消息传输协议,使用TCP/IP提供网络连接。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。 MQTT中存在三种角色:发布者(publisher)、消息代理(Broker)、订阅者(Subscriber)。其中发布者和订阅者是客户端,消息代理即服务器,消息发布者可以同时是消息订阅者。 MQTT提供了三种QoS等级:
至多一次:消息发布完全依赖底层TCP/IP网络,会发生消息丢失或重复。比如温度环境传感器,数据丢失几次无所谓,反正会有新的数据过来。还有就是一些普通app的消息推送,例如当天的一些新闻弹窗呀如果没有推送成功,设备再次上线也无法收到了。至少一次:确保消息送达,但可能会重复。有且只有一次:确保消息只到达一次,服务质量最高但开销也最大。比如一些即时通信app中,消息只能到达一次。MQTT只是一个网络协议,需要一个消息中间件,目前比较有名的有Mosquitto,Apollo,RabbitMQ,Emqx等。这里选用的是开源的emqx,官方网址在这里,此外还提供了功能更加丰富的Enterprise版等(肯定要收费啦)
由两台服务器来处理MQTT通信,Haproxy提供负载均衡功能,MQTT消息中间件采用了emqx,分别位于两台独立的服务器上面,由于某些原因= =,实际上只有两台物理机142和149,Haproxy采用的是容器,与其中一台MQTT共处于物理机142上面。
emqx具体安装参考了官网,主要是根据操作系统版本选择对应的emqx进行安装,安装完成后 安装的相关路径如一下所示:
# 配置文件、载入的plugins等路径 /etc/emqx # 数据路径 /var/lib/emqx # 日志路径 /var/log/emqxemqx安装完成后,修改配置文件emqx.conf。同理另一台emqx也是类似
## 修改结点名,通常设置为 名字@ip node.name = emqx@***.***.***.142 ## 修改集群策略为static,无需手动添加节点了 cluster.discovery = static ## 所有集群节点 cluster.static.seeds = emqx@***.***.***.142, emqx@***.***.***.149首先拉取Haproxy镜像
docker pull haproxy根据需求编写haproxy.cfg,内容如下,负载均衡策略采用roundrobin,即轮流调度
defaults log global option dontlognull option http-server-close retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s # front花呗渡边纲1883端口 frontend emqtt-front bind *:1883 mode tcp default_backend emqtt-backend # backend分发前台请求 backend emqtt-backend balance roundrobin server emq1 ***.***.***.142:1883 check server emq2 ***.***.***.149:1883 check # dashboard控制面板 frontend emqtt-admin-front bind *:18083 mode http default_backend emqtt-admin-backend backend emqtt-admin-backend mode http balance roundrobin server emq1 ***.***.***.142:18083 check server emq2 ***.***.***.149:18083 check编写Dockerfile,内容如下所示
FROM haproxy:latest COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg构建镜像并测试镜像是否成功的命令
docker build -t haproxy-emqx . docker run -it --rm --name haproxy-syntax-check haproxy-emqx haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg启动haproxy负载均衡容器,由于宿主机1883和18083端口已经被142的emqx所占用,分别修改为1884,18084
docker run -d --name emqx-haproxy -p 1884:1883 -p 18084:18083 haproxy-emqxemqx提供了较多的的插件,其中emqx_dashboard插件可以实时查看集群运行状态,此外也可以通过emqx_ctl cluster status命令查看