前言:实验室由于项目需要,需要将原本的单体环境扩展为分布式的,刚好趁这个机会稍微了解了一下关于MQTT、负载均衡等知识

MQTT协议

  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种订阅/发布模式的消息传输协议,使用TCP/IP提供网络连接。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
  MQTT中存在三种角色:发布者(publisher)、消息代理(Broker)、订阅者(Subscriber)。其中发布者和订阅者是客户端,消息代理即服务器,消息发布者可以同时是消息订阅者。
MQTT提供了三种QoS等级:

  1. 至多一次:消息发布完全依赖底层TCP/IP网络,会发生消息丢失或重复。比如温度环境传感器,数据丢失几次无所谓,反正会有新的数据过来。还有就是一些普通app的消息推送,例如当天的一些新闻弹窗呀如果没有推送成功,设备再次上线也无法收到了。
  2. 至少一次:确保消息送达,但可能会重复。
  3. 有且只有一次:确保消息只到达一次,服务质量最高但开销也最大。比如一些即时通信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,即轮流调度

defaultslog                     globaloption                  dontlognulloption http-server-closeretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10s# front花呗渡边纲1883端口
frontend emqtt-frontbind *:1883mode tcpdefault_backend emqtt-backend# backend分发前台请求
backend emqtt-backendbalance roundrobinserver emq1 ***.***.***.142:1883 checkserver emq2 ***.***.***.149:1883 check# dashboard控制面板
frontend emqtt-admin-frontbind *:18083mode httpdefault_backend emqtt-admin-backendbackend emqtt-admin-backendmode httpbalance roundrobinserver emq1 ***.***.***.142:18083 checkserver 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.测试

  1. 启动客户端,此时连接会话位于142,如下所示:
  2. 关闭142的emqx,会话转移至149
  3. 重新启动142的emqx,并关闭149的emqx ,会话又回到142

    客户端输出如下所示,两次断开然后自动建立MQTT连接

    (由于emqx实在太新了,且最近版本更新较为频繁,9月份,10月份连着发布了两个版本,中途发现也有一些问题,不知道是不是本身存在bug,最后要不要采用emqx还需要考虑)

基于Haproxy搭建MQTT(emqx)集群相关推荐

  1. 直播 | 基于kubeadm搭建Kubernetes HA集群

    分享时间:6月18日 20:30 分享主题:基于kubeadm搭建Kubernetes HA集群 分享人介绍: 张炯,上汽集团下属赛可出行运维工程师.10年工作经验,曾任职于Ctrip.SNDA,作为 ...

  2. Kafka基于Zookeeper搭建高可用集群实战

    Kafka基于Zookeeper搭建高可用集群实战 1 前言 1.1 高可用的由来 为何需要Replication? 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Bro ...

  3. 基于docker-swarm搭建持续集成集群服务

    前言 本文只为自己搭建过程中的一些简单的记录.如果实践中有疑问,可以一起探讨. 为了能在本机(macOS)模拟集群环境,使用了vb和docker-machine.整体持续集成的几个机器设施如下: 服务 ...

  4. 【理论+实验】HAProxy搭建高可用集群

    文章目录 一.HAProxy介绍 二.HAProxy的特点 三.HAProxy与LVS.Nginx的比对 四.HAProxy调度算法 五.实验 1.架构图 2.简要分析 3.实验步骤 4.日志管理 总 ...

  5. 基于WIN10搭建ES伪集群的实践

    依据ES官网介绍https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html,ES将结点分为Mas ...

  6. 基于Pgpool搭建PostgreSQL11的集群

    基于Pgpool-II4.1.0搭建PostgreSQL11集群 Pgpool介绍 pgpool相关介绍不在该文章中,需要者可以参考我的另一篇文章.传送门:pgpool介绍 环境准备 本次使用三台Ce ...

  7. ActiveMQ——基于Zookeeper搭建Replicated LevelDB集群

     消息的持久化和签收机制等都是为了保证消息的可靠性,但仅保证可靠性是不够的,有时我们还需要保证高可用性,这时就需要搭建ActiveMQ集群,以避免单点故障提升可用性.官方为我们介绍了三种集群搭建的方式 ...

  8. 云服务器搭建高可用keepalived+nginx+emqx集群

    云服务器搭建高可用keepalived+nginx+emqx集群 一.高可用emqx集群搭建 1 单机搭建emqx 2 配置认证和鉴权插件 3 搭建emqx集群 二.nginx搭建负载均衡 1 ngi ...

  9. Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建

    Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建 1. 前言 2. 安装三个Ubuntu 2.1 三个机器都关闭防火墙 2.2 三个机器都关闭swap 2.3 三个机器都 ...

最新文章

  1. DOCKER OVERLAY NETWORK consul 注册
  2. Socket编程(4)TCP粘包问题及解决方案
  3. 请使用 WITH MOVE 选项来标识该文件的有效位置。
  4. nginx 中location中root和alias的区别
  5. Android之用SingleTask和TaskAffinity解决手机截取的项目启动页面问题
  6. linux如何调试elf程序,Linux应用程序elf描述
  7. Oracle中随机抽取N条记录,使用Oracle分析函数随机抽取N条记录
  8. el-input的使用
  9. 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
  10. 【Best Time to Buy and Sell Stock II】cpp
  11. js或css文件后面跟参数的原因说明
  12. python全系列官方中文文档
  13. IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
  14. 守望先锋外挂(OWG)透视原理分析
  15. Agth 辅助工具(GAL用agth进行自动翻译工具)
  16. MaxCompute 助力衣二三构建智能化运营工具
  17. unity obi插件
  18. [矩阵论] Unit 6. 矩阵的 Kronecker 积与 Hadamard 积 - 知识点整理
  19. (三)Perl_列表与数组(元素访问、特殊索引$#、qw简写、列表赋值等)
  20. C# 从TTF文件加载自定义字体

热门文章

  1. 实现负债均衡的方式与负债均衡算法
  2. Vue——slot的含义是什么, slot之详细解释
  3. NOIP2010提高组初赛 c++————烽火传递
  4. GPS 凯立德 J08 没声音的问题解决
  5. 自定义拍照时 拍照界面_拍照时如何正确地看镜头?
  6. HDU3016 Man Down
  7. unity+live2d制作galgame框架
  8. W/System: A resource failed to call close. ******: Waiting for a blocking GC ProfileSaverFlattened
  9. 动作识别《X3D: Expanding Architectures for Efficient Video Recognition》
  10. python如何给一组数据打标签_用 python 给数据打标签,500 万条数据怎样提高效率?...