四、集群的负载均衡
HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的 TCP 协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。为了实现 RabbitMQ 集群的软负载均衡,这里可以选择HAProxy。
4.1、HAProxy 安装
HAProxy 的安装也很简单,单独部署在一台服务器上,通过如下命令即可安装完成!
yum install haproxy
编辑 HAProxy 配置文件:
vim /etc/haproxy/haproxy.cfg
我们只需要在文件末尾加上如下配置即可!
#绑定配置 listen rabbitmq_cluster bind 0.0.0.0:5672 #配置TCP模式 mode tcp #加权轮询 balance roundrobin #RabbitMQ集群节点配置 server rmq_node1 197.168.24.206:5672 check inter 5000 rise 2 fall 3 weight 1 server rmq_node2 197.168.24.233:5672 check inter 5000 rise 2 fall 3 weight 1 server rmq_node3 197.168.24.234:5672 check inter 5000 rise 2 fall 3 weight 1 #haproxy监控页面地址 listen monitor bind 0.0.0.0:8100 mode http option httplog stats enable stats uri /stats stats refresh 5s
绑定配置参数说明:
-
bind
:这里定义了客户端连接连接 IP 地址和端口号,用于客户端连接 -
balance roundrobin
:表示加权轮询负载均衡算法
RabbitMQ 集群节点配置说明:
-
server rmq_node1
:定义HAProxy内RabbitMQ服务的标识 -
197.168.24.206:5672
:标识了后端RabbitMQ的服务地址 -
check inter 5000
:表示每隔多少毫秒检查RabbitMQ服务是否可用,示例参数值为 5000 -
rise 2
:表示 RabbitMQ 服务在发生故障之后,需要多少次健康检查才能被再次确认可用,示例参数值为 2 -
fall 2
:表示需要经历多少次失败的健康检查之后,HAProxy 才会停止使用此RabbitMQ服务,示例参数值为 2 -
weight 1
:表示权重比例,值越低,会优先进行数据分配,示例参数值为 1
启动 HAProxy:
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
登录http://ip:8100/stats
web 管理界面,即可进行监控查看!
五、Java 客户端使用
如果是配置了 HAProxy 代理服务器,可以直接使用 HAProxy 代理服务器地址即可!
//ConnectionFactory创建MQ的物理连接 connectionFactory = new ConnectionFactory(); connectionFactory.setHost("197.168.24.207"); //代理服务器地址 connectionFactory.setPort(5672); //代理服务器端口 connectionFactory.setUsername("admin"); //guest只能在本机进行访问,通过代理服务器发送消息时需要重新建立用户 connectionFactory.setPassword("admin"); //guest connectionFactory.setVirtualHost("/"); //虚拟主机
如果没有代理服务器,使用Spring
的CachingConnectionFactory
类进行配置。
以SpringBoot
项目为例,配置文件如下:
spring.rabbitmq.addresses=197.168.24.206:5672,197.168.24.233:5672,197.168.24.234:5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/
RabbitConfig
配置类如下:
@Configuration public class RabbitConfig { /** * 初始化连接工厂 * @param addresses * @param userName * @param password * @param vhost * @return */ @Bean ConnectionFactory connectionFactory(@Value("${spring.rabbitmq.addresses}") String addresses, @Value("${spring.rabbitmq.username}") String userName, @Value("${spring.rabbitmq.password}") String password, @Value("${spring.rabbitmq.virtual-host}") String vhost) { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setAddresses(addresses); connectionFactory.setUsername(userName); connectionFactory.setPassword(password); connectionFactory.setVirtualHost(vhost); return connectionFactory; } /** * 重新实例化 RabbitAdmin 操作类 * @param connectionFactory * @return */ @Bean public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){ return new RabbitAdmin(connectionFactory); } /** * 重新实例化 RabbitTemplate 操作类 * @param connectionFactory * @return */ @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory); //数据转换为json存入消息队列 rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } }
六、总结
本文主要详细介绍了 RabbitMQ 集群的工作原理和如何搭建一个具备负载均衡能力的 RabbitMQ 集群的方法。
限于笔者的才疏学浅,对本文内容可能还有理解不到位的地方,如有阐述不合理之处还望留言一起探讨。