RabbitMQ | HAProxy - 给 RabbitMQ集群 集成负载均衡

打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

HAProxy


概述

1)试想一个问题:当 RabbitMQ 一个集群中有 3 个节点时,我们写代码时,因该访问哪个节点呢?
当然时恣意一个节点都可以~
但是存在几个问题:


  • 如果设置文件中写死访问的是 node1,但是 node1 挂了,不就是变相的等于 mq集群 团体不可用了吗,以是最好是有一个同一的入口,一个节点故障时,流量可以及时转移到其他节点.
  • 如果所有客户端都和 node1 建立连接,那么 node1 的负担会大大增长,而其他节点的负担不大导致资源浪费.
2)使用 HAProxy 就可以实现流量的负载均衡.
HAProxy(High Availability Proxy)是一个开源的负载均衡和 TCP/HTTP 应用步调的代理服务器,它可以提供高可用,负载均衡和代理功能. HAProxy 重要用于分发网络流量到多个后台服务器,以进步网络的可靠性和性能.
例如 RabbitMQ,未来我们只需要在 SpringBoot 项目中设置 RabbitMQ 的连接地址为 HAProxy 设置的地址,那么所有 SpringBoot 访问请求都会先经过 HAProxy ,然后再由 HAProxy 分发给 MQ 集群中的不同实例.
Docker 摆设 HAProxy

1)镜像
  1. docker pull haproxy:3.0.3
复制代码
2)vim 编辑 ~/env/haproxy/conf/haproxy.cfg 设置文件(未来挂载的设置文件)
  1. # haproxy web 管理界面
  2. listen stats # 设置一个监听器,统计 HAProxy 的统计信息
  3.     bind *:8100 # 指定监听器的 ip 和 port
  4.     mode http # 监听器的工作模式为 HTTP
  5.     stats enable # 启用统计页面
  6.     stats realm HAProxy\ Statistics
  7.     stats uri /
  8.     stats auth root:1111 # haproxy 登录账号和密码
  9. # 配置 mq 负载均衡
  10. listen rabbitmq # 设置监听器
  11.     bind *:5670 # 监听器绑定 ip 和 port,将来 SpringBoot 访问 mq 就是这个 ip 和 端口
  12.     mode tcp # 因为 rabbitmq 使用 amqp 协议时基于 tcp 的
  13.     balance roundrobin # 负载均衡策略: 轮询
  14.     # 集群节点配置,这里使用 rabbit 节点
  15.     server rabbitmq1 100.112.226.113:5672 check inter 5000 rise 2 fall 3
  16.     server rabbitmq2 100.112.226.113:5673 check inter 5000 rise 2 fall 3
  17.     server rabbitmq3 100.112.226.113:5674 check inter 5000 rise 2 fall 3
  18.     # rabbitmq1、2、3 时自定义的
  19.     # check... 是健康检测相关
复制代码
3)启动
  1. docker run -d \
  2. --name haproxy \
  3. -p 28100:8100 \
  4. -p 25670:5670 \
  5. -v ~/env/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
  6. haproxy:3.0.3
复制代码
这些端口是与上面编写的设置文件一一对应的:


  • -p 28100:8100: 设置文件中设置的 web 端口,未来通过这个端口就可以访问到 HAProxy Web控制台.
  • -p 25670:5670:SpringBoot 设置文件中的 RabbitMQ 端口未来就写这个,HAProxy 就会将这些流量举行分发到集群的各个节点.
  • /usr/local/etc/haproxy/haproxy.cfg:容器内的设置文件地址不一定是这个,会随着镜像的版本变革而变革,如果容器启动失败,看一下日记就知道了.
4)访问 http://env-base:18100/ 就可以看到管理界面

人家直接连健康检测都设置好了~
Spring AMQP 集成

1)把 rabbitmq 端口改成 haproxy 的即可,haproxy 就会主动将收到的流量做分流.
  1. spring:
  2.   application:
  3.     name: rabbitmq
  4.   rabbitmq:
  5.     host: env-base
  6.     port: 15670 # HAProxy 监听器端口
  7.     username: root
  8.     password: 1111
复制代码
2)队列设置
  1. @Configuration
  2. class QuorumConfig {
  3.     @Bean
  4.     fun quorumQueue(): Queue = QueueBuilder
  5.         .durable(MQConst.QUORUM_QUEUE)
  6.         .quorum()
  7.         .build()
  8. }
复制代码
3)生产者接口
  1. @RestController
  2. @RequestMapping("/mq")
  3. class MQApi(
  4.     private val rabbitTemplate: RabbitTemplate
  5. ) {
  6.     @GetMapping
  7.     fun quorum(): String {
  8.         rabbitTemplate.convertAndSend("", MQConst.QUORUM_QUEUE, "quorum msg 1")
  9.         return "ok"
  10.     }
  11. }
复制代码
4)未来无论哪个 mq 宕机,只有有一个实例还在运行,就可以提供服务.
例如如下 mq3 为 Leader

现在手动让 mq3 宕机,然后触发生产者接口,最后检察 HAProxy 管理平台,可以看到流量分发的 mq2 上了

现在手动让 mq2 宕机,然后触发生产者接口(由于是轮询策略,因此大概会服务器报错,不过没关系,多触发频频,就会将流量分到可用的机器上),最后检察 HAProxy 管理平台,可以看到流量分发的 mq1 上了

   Ps:但是一定要确保 HAProxy 为可用,因此发起 HAProxy 也设置为集群.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表