前言:实验室由于项目需要,需要将原本的单体环境扩展为分布式的,刚好趁这个机会稍微了解了一下关于MQTT、负载均衡等知识
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上面。
安装
1. emqx
emqx具体安装参考了官网,主要是根据操作系统版本选择对应的emqx进行安装,安装完成后
安装的相关路径如一下所示:
# 配置文件、载入的plugins等路径
/etc/emqx
# 数据路径
/var/lib/emqx
# 日志路径
/var/log/emqx
emqx安装完成后,修改配置文件emqx.conf。同理另一台emqx也是类似
## 修改结点名,通常设置为 名字@ip
node.name = emqx@***.***.***.142
## 修改集群策略为static,无需手动添加节点了
cluster.discovery = static
## 所有集群节点
cluster.static.seeds = emqx@***.***.***.142, emqx@***.***.***.149
2. Haproxy
首先拉取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-emqx
运行及测试
1.dashboard
emqx提供了较多的的插件,其中emqx_dashboard插件可以实时查看集群运行状态,此外也可以通过emqx_ctl cluster status命令查看
2.测试
- 启动客户端,此时连接会话位于142,如下所示:
、
- 关闭142的emqx,会话转移至149
- 重新启动142的emqx,并关闭149的emqx ,会话又回到142
客户端输出如下所示,两次断开然后自动建立MQTT连接
(由于emqx实在太新了,且最近版本更新较为频繁,9月份,10月份连着发布了两个版本,中途发现也有一些问题,不知道是不是本身存在bug,最后要不要采用emqx还需要考虑)