当前位置: 首页 > article >正文

RabbitMQ HAProxy 负载均衡

在这里插入图片描述

文章目录

  • 前言
  • 当Java中指定的端口号绑定的rabbitmq服务挂掉了之后,我们的程序是否还能够成功访问到rabbitmq服务呢
  • 什么是 HAProxy 负载均衡
  • HAProxy 安装
  • 修改HAProxy配置文件
  • 使用HAProxy

前言

前面我们学习了 rabbitmq 搭建集群,并且为了解决集群中队列的高可用问题,使用仲裁队列替代普通的队列,但是其实这里还有一个问题,就是我们在使用 Java 连接 rabbitmq 的时候,需要指定 rabbitmq 服务的 IP 和端口号,如果该端口号绑定的 rabbitmq 服务挂掉了,那么我们的 Java 程序是否还能够访问到呢?

当Java中指定的端口号绑定的rabbitmq服务挂掉了之后,我们的程序是否还能够成功访问到rabbitmq服务呢

我们 Java 程序绑定的端口号是 5672,也就是 rabbit 服务:

在这里插入图片描述
然后我们先将 rabbit 服务保持启动状态,并且向队列中发送消息,然后启动程序,看是否能启动成功并且成功发送消息:

@RequestMapping("/producer")
@RestController
public class ProducerController {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @RequestMapping("/test")
    public String test() {
        rabbitTemplate.convertAndSend("","quorum.queue","rabbitmq test");
        return "消息发送成功";
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里是顺利启动并且成功发送消息了的,然后我们将 rabbit 服务给挂掉,再来启动 Java 程序:

在这里插入图片描述
启动之后,访问 127.0.0.1:8080/producer/test 向队列中发送消息:

在这里插入图片描述

可以发现报错了。既然这样的话是否就意味着,每次我们 Java 连接的 rabbitmq 服务挂掉之后就需要重新修改我们的代码吗?这里就可以用到我们的 HAProxy 负载均衡了。

什么是 HAProxy 负载均衡

在RabbitMQ集群中,如果所有客户端都连接到同一个节点,该节点的网络负载会显著增加,而其他节点则可能处于空闲状态,造成资源浪费。使用HAProxy作为负载均衡器,可以将客户端的连接请求分散到集群中的不同节点,实现负载均衡,从而避免单个节点过载,提高整个集群的处理能力和稳定性。HAProxy支持对后端服务器的健康检查,可以定期检测RabbitMQ集群中各个节点的可用性。一旦发现某个节点不可用,HAProxy会自动将该节点从负载均衡列表中移除,并将新的连接请求转发到其他健康的节点,确保服务的连续性和可用性。

在这里插入图片描述

HAProxy 安装

首先更新 apt 库:apt-get update

在这里插入图片描述
查找 HAProxy:apt list | grep haproxy

在这里插入图片描述
安装 haproxy:apt-get install haproxy

在这里插入图片描述
验证是否安装成功:systemctl status haproxy

在这里插入图片描述

查看 haproxy 版本:haproxy -v

在这里插入图片描述
如果要设置 haproxy 服务开机自启,可以使用:systemctl enable haproxy,关闭开启自启就是:systemctl disable haproxy

修改HAProxy配置文件

HAProxy 的配置文件默认在 /etc/haproxy/haproxy.cfg 路径下:

在这里插入图片描述
我们通过 vim 命令修改配置文件:

在这个配置文件中追加下面配置:

# haproxy web 管理界⾯
listen stats
	bind *:8100
	mode http
	stats enable
	stats realm Haproxy\ Statistics
	stats uri /
	stats auth admin:admin
# 配置负载均衡
listen rabbitmq
	bind *:5670
	mode tcp
	balance roundrobin
	server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
	server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
	server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
# haproxy web 管理界⾯
listen stats #设置⼀个监听器, 统计HAProxy的统计信息
	bind *:8100 #指定了监听器绑定到的IP地址和端⼝
	mode http #监听器的⼯作模式为HTTP
	stats enable #启⽤统计⻚⾯
	stats realm Haproxy\ Statistics
	stats uri /
	stats auth admin:admin #haproxy登录账号和密码
# 配置负载均衡
listen rabbitmq #设置监听器
	bind *:5670 #监听器绑定到的IP地址和端⼝, 也就是集群前端IP, 供producer和consumer来进⾏选择,由于5672端⼝已经默认使⽤, 这⾥选择5670端⼝
	mode tcp #由于RabbitMQ使⽤AMQP协议,它是⼀个基于TCP的协议,所以这⾥使⽤TCP模式
	balance roundrobin #指定负载均衡策略为轮询
	#负载均衡中的集群节点配置,这⾥选择的rabbit节点
	server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
	server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
	server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
  • server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
  • server rabbitmq1:定义 RabbitMQ 服务的内部标识,这里的 rabbitmq1 是指 haproxy 内部使用的,不是指 rabbtimq 服务的节点的名称
  • 127.0.0.1:5672:RabbitMQ 真实的IP和端口
  • check inter 5000:定义每隔多少毫秒检查 RabbitMQ 服务是否可用
  • rise 2:定义 RabbitMQ 服务在发生故障之后,需要多少次健康检查才能被再次确认可用
  • fall 3:定义需要经历多少次失败的健康检查之后,HAProxy 才会停止使用此 RabbitMQ 服务

HAProxy支持多种负载均衡算法,以满足不同的应用场景和需求。在RabbitMQ集群中常用的负载均衡算法包括:

  • 轮询(Round Robin):按照顺序依次将请求分发到后端服务器。
    加权轮询(Weighted Round Robin):根据后端服务器的配置和负载情况分配不同的权重,权重高的服务器将处理更多的请求。
  • 最少连接(Least Connections):动态地选择当前连接数最少的服务器来处理新的请求,以提高后端服务的利用效率。
  • 源地址哈希(Source Hash):根据客户端的IP地址进行哈希计算,将同一IP地址的客户端请求始终转发到同一台后端服务器,以保持会话的连续性。

配置完成之后,我们重启 HAProxy 服务:systemctl restart haproxy

然后通过配置中的管理页面端口来查看管理页面:

访问到时候会提示我们输入用户名和密码,这些就是配置文件中配置的用户名和密码:

在这里插入图片描述

使用HAProxy

使用 HAProxy 之后的 RabbitMQ 的使用和普通的是一样的,就是需要更改我们的 Java 代码连接 rabbitmq 的 IP 和端口号为 HAProxy 的 IP 和端口号:

在这里插入图片描述
然后我们的 rabbit 节点还是处于挂掉的状态,我们启动程序,并且生产消息:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用 HAProxy 就解决了 Java 代码绑定的 rabbitmq 挂掉之后,我们的 Java 程序无法连接到集群的问题了。


http://www.kler.cn/a/456213.html

相关文章:

  • SDK 指南
  • 【从零开始入门unity游戏开发之——C#篇35】C#自定义类实现Sort自定义排序
  • IPv6 基础协议-NDP
  • 【畅购电商】项目总结
  • 【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理
  • Animated Drawings:让纸上的角色动起来
  • 应对TensorFlow导入Keras时发生的错误问题
  • SPI实验 LED数码管
  • 用三种安全思维重新审视零信任网络
  • 云效流水线自动化部署web静态网站
  • opencl 封装简单api
  • CSDN编辑器
  • 长沙景区数据分析项目实现
  • Django实现异步视图adrf请求
  • Android Studio使用BottomNavigationView实现底部导航栏demo
  • 【Ext.js 初步入门】Ext.js 作用以及用法 概述
  • 企业内训|AI大模型在汽车行业的前沿应用研修-某汽车集团
  • Java MySQL 连接
  • 自动化测试- 自动化测试模型
  • RabbitMQ - 1 ( 7000 字 RabbitMQ 入门级教程 )
  • PyTorch框架实现的简单手写数字识别模型,使用MNIST数据集进行训练和测试
  • 32单片机从入门到精通之硬件架构——总线系统(二)
  • word中文献引用[]符号的上下标格式修改
  • 【反转链表系列】力扣206,92,25
  • WINDOWS对话框模板结构简析
  • 接口自动化测试平台项目环境搭建