四、集群的负载均衡
HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的 TCP 协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。为了实现 RabbitMQ 集群的软负载均衡,这里可以选择HAProxy。
4.1、HAProxy 安装
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 集群的方法。
限于笔者的才疏学浅,对本文内容可能还有理解不到位的地方,如有阐述不合理之处还望留言一起探讨。
默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据
TencentOS Server (tlinux 3.1)配置 docker,compose 工具,并一键部署多容器(redis,rabbitmq)。TencentOS Server 是腾讯公司自主研发的定制化服务器操作系统。该系统集成了众多服务 器系列的优点,加入自主研发的软件,便于用户操作使用,提供全方位(内核及用户态)的 操作系统支持...
大概一年多前写过一个部署ELK系列的博客文章,前不久刚好在部署一个ELK的解决方案,我顺便就把一些基础的部分拎出来,再整合成一期文章。大概内容包括:搭建ELK集群,以及写一个简单的MQ服务。
Message Queue(消息队列),在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信。
就是两个子系统之间进行通信,有两种选择,第一种是直接远程调用,第二种是借助第三方完成通信。
发送方称为生产者,接收方称为接受者。
AMQP架构中有两个主要组件:Exchange和Queue,两者都在服务端,又称Broker,由RabbitMQ实现的。客户端通常有Producer和Consumer两种类型