需求:
通过Haproxy以轮询或者其它方式实现负载均衡,并且在Haproxy管理页面能看到均衡后的主机切换效果和作用体现。进而再测试SSL的方式实现以上效果。
环境(非Docker):
主机1:emqx_node1: 10.88.78.184 | 主机2: emqx_node2: 10.88.78.84
因资源有限,Haproxy搭在主机1: 10.88.78.184
过程:
我是通过static的方式自动将两台主机集群,通过https://www.emqx.io/docs/zh/v5/deploy/cluster/lb-haproxy.html#负载均衡策略此链接内的“构建集群”文档进行配置,Haproxy页面也起来了,上述链接文档内是Docker的简单步骤,Haproxy有很多内容感觉并不完整,前后不连贯,并且不严谨,让人摸不着头脑,此外Google搜索了教程Haproxy参考搭建和配置的,当然包括搜索了EMQX相关结果。
成果:
1.正常访问Haproxy的stats页面,且能看到此集群(2个node)
2.使用IP+Port 可正常访问节点页面地址,如10.88.78.184:18083
3.MQTT客户端可正常连接以上两个节点,并能正常收发消息(订阅)
问题:
1.因文档模糊教学使我不知道我的配置是否正确和权威,包括emqx.conf和haproxy.cfg
2.现在配置好后,不知道怎么验证此负载均衡
(举例说明:(1)当我作为用户去访问我的两节点时,我需要知道用户访问的是我的哪个节点,最好可以在Haproxy上能直观体现,(2)当我DOWN掉node1时,用户访问自动跳转node2,而用户自己无感知)
3. 我应该如何访问去验证2中的需求。
4.当我配置2个frontend模块时,重启时Haproxy时,日志显示1883端口冲突。
5.更新至新版本emqx后,发现emqx.conf和以前不一样了,变的简单了。请参考下边两节点的emqx.conf配置文件。监听端口的相关模块是否移置到其它地方了。
6.我是通过static方式创建集群,现在问题是,当我使用MQTT客户端连接其中一个时,在10.88.78.184:18083和10.88.78.84:18083 客户端中都有显示此TCP连接,(配置文件请查看node1 emqx.conf和node2 emqx.conf)
7.基于问题6(图在正面):当我使用Haproxy代理访问时,我down掉78.184,使用mqtt客户端连接78.184,依然正常连接,且web页面中的客户端依然显示的是78.184连接的mqtt,而不是78.84, 并且在mqtt连接正常时,我down掉78.184,mqtt会重新连接多次再正常连接,此时连接的依然还是78.184.
另外,为什么78.184和78.84两个页面会显示相同的用户连接呢,这样的话,是实现负载均衡了吗
我理解的负载均衡是,当我使用MQTT发送消息时给184时,只184收到,而不是184和84的Web页面都能看到,或者是,当我这次访问的是184,下次或下下次我访问的应该是84而不是184.或者两个客户端都能收到消息。或者是,184挂了,84马上能顶上,而且客户端显示的应该是84而不是184.
应用于生产环境:我是用户,我来请求1000个主机的集群,那么1000个主机中都有我的请求,这样是不是不合理,应该是我请求一次,根据权重设置只有一个主机有我的请求,当我下次请求时,可能请求在其它主机上。
建议:希望尽快更新教学文档,提高前后步骤的连贯性和严谨性,并且附详细图示或代码块,让用户一看就知道我这么配置是正确的(小白教学),其中一些配置原理应予以释义
问题4贴图
问题4贴图2
问题7贴图如下(描述能力有限,麻烦结合问题7查看,谢谢。):
[有些问题在图里]我将184的emqx.conf中的1883端口改为了1884,是为了让haproxy使用1883转发前端请求。
问题1):为什么1883还在连接结束和监听状态(已重启emqx服务)
问题2):我现在使用mqtt访问10.88.78.184:1883(haproxy的前端地址)
问题3)我现在down掉10.88.78.184 这台的emqx ,在mqtt访问10.88.78.184:1883,并且发送订阅消息
到10.88.78.84:18083查看连接的客户端和收到的消息
问题4)当我把184emqx服务开启
我只能描述到这儿了,如果看的不太明白,是我文字描述不行。请见谅,只能描述成这样了。
最后,麻烦你准确描述一下,haproxy结合emqx集群可以做什么事情(用白话描述尽量准确),看是否能够验证我理解的是对的。麻烦了,谢谢。
配置文件贴图
Haproxy页面贴图
节点集群贴图
MQTT客户端正常连接贴图
节点页面中的集群贴图(2个节点页面显示一样)
教学文档贴图(问题3验证方式?不确定,请指导)
node1 emqx.conf
node2 emqx.conf
以上,感谢~
感谢反馈。
1.因文档模糊教学使我不知道我的配置是否正确和权威,包括emqx.conf和haproxy.cfg
配置手册目前还在改版完善中,最近我们会上线一个。
2.现在配置好后,不知道怎么验证此负载均衡
(举例说明:(1)当我作为用户去访问我的两节点时,我需要知道用户访问的是我的哪个节点,最好可以在Haproxy上能直观体现,(2)当我DOWN掉node1时,用户访问自动跳转node2,而用户自己无感知)
3. 我应该如何访问去验证2中的需求。
HAProxy 的 Stats 我没怎么用过。我一般的测试方法,是建立多个链接试试,然后再通过 EMQX Dashboard 看是否能正常分布在两个节点上。
4.当我配置2个frontend模块时,重启时Haproxy时,日志显示1883端口冲突。
这是一个 HAProxy 的使用问题,看起来应该是 emqx 的 1883 和 你 HAProxy 的 frontend
配置的 1883 端口冲突了。和多个 frontend 应该没有关系。
5.更新至新版本emqx后,发现emqx.conf和以前不一样了,变的简单了。请参考下边两节点的emqx.conf配置文件。监听端口的相关模块是否移置到其它地方了。
新的 emqx 版本,将配置简化(省略)了。所以这些 listener 目前是默认开启的状态。配置并未移动到其它地方去。
你的ha跟某个节点在同一个服务器上,1883已经被emqx占用所以haproxy 无法启动
通过 haproxy状态页面可以看到每个 emqx 节点分别负载了多少链接
mqttx 是一个客户端工具 可以创建多个连接连接到 emqx 在任意服务器上都能执行,只要能连接到 haproxy
通过 emqx 客户端列表详情页 节点字段可以看到客户端连接到那个节点上
首页的指标也可以看到每个节点有多少个连接
@heeejianbo @wivwiv 请看一下用户在主贴里新加的问题
@bintong2689
你的验证方法有错。
EMQX Dashboard 提供的信息是集群层面的,不管从哪个节点访问 客户端列表 页面看到的都是集群中所有节点的数据。这个有助于管理客户端
正如昨天所说,验证方法有 2 个:
- 通过 emqx 客户端列表详情页,节点字段可以看到客户端连接到那个节点上
- 首页的指标也可以看到每个节点有多少个连接
现在我将集群功能关闭,配置文件恢复原样,使用MQTTX直连Haproxy(10.88.78.184:1883)
在客户端创建了四个连接至Ha的连接,用于验证当关闭EMQX1时,这四个连接会不会自动挪至EMQX2
结论是,有两个跳转过去(客户端工具观察是断开重连),其它两个有一个直接断开未重连,有一个一直显示“正在重连-已连接-正在重连-已连接…”
我想要的效果是:四个连接不断开并不重连自动跳转至EMQX2(无感)
(集群环境下的此需求待测试)
TCP 长连接的特性决定了无法实现此需求,EMQX 断开会导致客户端也断开,需要客户端通过重连机制重新尝试连接,由 haproxy 为其分配可用的节点。