基于Haproxy搭建MQTT(emqx)集群
前言:实验室由于项目需要,需要将原本的单体环境扩展为分布式的,刚好趁这个机会稍微了解了一下关于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,即轮流调度
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.测试
- 启动客户端,此时连接会话位于142,如下所示:
、 - 关闭142的emqx,会话转移至149
- 重新启动142的emqx,并关闭149的emqx ,会话又回到142
客户端输出如下所示,两次断开然后自动建立MQTT连接
(由于emqx实在太新了,且最近版本更新较为频繁,9月份,10月份连着发布了两个版本,中途发现也有一些问题,不知道是不是本身存在bug,最后要不要采用emqx还需要考虑)
基于Haproxy搭建MQTT(emqx)集群相关推荐
- 直播 | 基于kubeadm搭建Kubernetes HA集群
分享时间:6月18日 20:30 分享主题:基于kubeadm搭建Kubernetes HA集群 分享人介绍: 张炯,上汽集团下属赛可出行运维工程师.10年工作经验,曾任职于Ctrip.SNDA,作为 ...
- Kafka基于Zookeeper搭建高可用集群实战
Kafka基于Zookeeper搭建高可用集群实战 1 前言 1.1 高可用的由来 为何需要Replication? 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Bro ...
- 基于docker-swarm搭建持续集成集群服务
前言 本文只为自己搭建过程中的一些简单的记录.如果实践中有疑问,可以一起探讨. 为了能在本机(macOS)模拟集群环境,使用了vb和docker-machine.整体持续集成的几个机器设施如下: 服务 ...
- 【理论+实验】HAProxy搭建高可用集群
文章目录 一.HAProxy介绍 二.HAProxy的特点 三.HAProxy与LVS.Nginx的比对 四.HAProxy调度算法 五.实验 1.架构图 2.简要分析 3.实验步骤 4.日志管理 总 ...
- 基于WIN10搭建ES伪集群的实践
依据ES官网介绍https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html,ES将结点分为Mas ...
- 基于Pgpool搭建PostgreSQL11的集群
基于Pgpool-II4.1.0搭建PostgreSQL11集群 Pgpool介绍 pgpool相关介绍不在该文章中,需要者可以参考我的另一篇文章.传送门:pgpool介绍 环境准备 本次使用三台Ce ...
- ActiveMQ——基于Zookeeper搭建Replicated LevelDB集群
消息的持久化和签收机制等都是为了保证消息的可靠性,但仅保证可靠性是不够的,有时我们还需要保证高可用性,这时就需要搭建ActiveMQ集群,以避免单点故障提升可用性.官方为我们介绍了三种集群搭建的方式 ...
- 云服务器搭建高可用keepalived+nginx+emqx集群
云服务器搭建高可用keepalived+nginx+emqx集群 一.高可用emqx集群搭建 1 单机搭建emqx 2 配置认证和鉴权插件 3 搭建emqx集群 二.nginx搭建负载均衡 1 ngi ...
- Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建
Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建 1. 前言 2. 安装三个Ubuntu 2.1 三个机器都关闭防火墙 2.2 三个机器都关闭swap 2.3 三个机器都 ...
最新文章
- DOCKER OVERLAY NETWORK consul 注册
- Socket编程(4)TCP粘包问题及解决方案
- 请使用 WITH MOVE 选项来标识该文件的有效位置。
- nginx 中location中root和alias的区别
- Android之用SingleTask和TaskAffinity解决手机截取的项目启动页面问题
- linux如何调试elf程序,Linux应用程序elf描述
- Oracle中随机抽取N条记录,使用Oracle分析函数随机抽取N条记录
- el-input的使用
- 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
- 【Best Time to Buy and Sell Stock II】cpp
- js或css文件后面跟参数的原因说明
- python全系列官方中文文档
- IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
- 守望先锋外挂(OWG)透视原理分析
- Agth 辅助工具(GAL用agth进行自动翻译工具)
- MaxCompute 助力衣二三构建智能化运营工具
- unity obi插件
- [矩阵论] Unit 6. 矩阵的 Kronecker 积与 Hadamard 积 - 知识点整理
- (三)Perl_列表与数组(元素访问、特殊索引$#、qw简写、列表赋值等)
- C# 从TTF文件加载自定义字体
热门文章
- 实现负债均衡的方式与负债均衡算法
- Vue——slot的含义是什么, slot之详细解释
- NOIP2010提高组初赛 c++————烽火传递
- GPS 凯立德 J08 没声音的问题解决
- 自定义拍照时 拍照界面_拍照时如何正确地看镜头?
- HDU3016 Man Down
- unity+live2d制作galgame框架
- W/System: A resource failed to call close. ******: Waiting for a blocking GC ProfileSaverFlattened
- 动作识别《X3D: Expanding Architectures for Efficient Video Recognition》
- python如何给一组数据打标签_用 python 给数据打标签,500 万条数据怎样提高效率?...