1.RabbitMQ是消息队列中间件是分布式系统中重要的组件,其作用是:系统应用耦合,异步消息,流量削锋等。由erlang开发的AMQP(Advanved Message Queue)的开源实现,官方地址:http://www.rabbitmq.com

2.Haproxy提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。(负载均衡策略有很多:轮询、加权轮询、源地址哈希、最小连接数等等)

3.为什么使用集群?面对大量业务访问、高并发请求可以使用高性能的服务器来提升RabbitMQ服务的负载能力。当单机容量达到极限时,采取集群的策略来对负载能力做进一步的提升和提升系统稳定性,但是这里还存在一个负载不均衡的问题。如果一个集群中有3个节点,所有的客户端都与其中的单个节点node1建立TCP连接,那么node1的网络负载必然会大大增加而显得难以承受,其他节点又由于没有那么多的负载而造成硬件资源的浪费。通过使用 haproxy 的负载策略来转发客户端的请求到RabbitMQ集群中,缓解队列集群中单一节点网络负载等情况

4.RabbitMQ集群搭建百度上很多,下面是搭建成功后的样子,有3台RabbitMQ节点,1台Haproxy节点,需要注意的是:每个集群节点必须具有相同的 cookie,文件位置/var/lib/rabbitmq/.erlang.cookie, 把node2、node3设置成和node1一样的即可,权限是400

192.168.68.128 node1
192.168.68.129 node2
192.168.68.130 node3
--------------------
192.168.68.131 haproxy

这里写图片描述

5.Haproxy搭建自行百度,在配置文件/etc/haproxy/haproxy.cfg 的后面加上以下配置,启动后访问监控页面可以看到RabbitMQ的3个节点已经在页面左下角了,

### haproxy 监控页面地址是:http://192.168.68.131:9188/haproxy_status
listen admin_stats
    bind *:9188
    mode http
    log 127.0.0.1 local3 err
    stats refresh 60s
    stats uri /haproxy_status
    stats realm welcome login\ Haproxy
    stats auth admin:123456
    stats hide-version
    stats admin if TRUE
    
### rabbitmq 集群配置,转发到
listen rabbitmq_cluster
    bind *:5672
    mode tcp
    balance roundrobin
    server rabbitnode1 192.168.68.128:5672 check inter 2000 rise 2 fall 3 weight 1
    server rabbitnode2 192.168.68.129:5672 check inter 2000 rise 2 fall 3 weight 1
    server rabbitnode3 192.168.68.130:5672 check inter 2000 rise 2 fall 3 weight 1

这里写图片描述

6.测试 haproxy + rabbitmq 集群环境,试验 haproxy 是否转发了客户端的请求,使用 Java SpringBoot 实现 , 新建Maven项目,引用spring-boot-starter-amqp的依赖和application.properties中配置连接地址、密码

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# 注意,此处连接的不在是rabbitmq节点了,而是Haproxy代理节点
spring.rabbitmq.host=192.168.68.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
###在RabbitMQ的管理页面中,已经创建了一个 zy_host 虚拟机,绑定了admin用户
spring.rabbitmq.virtual-host=zy_host

项目中配置一个 hello 的队列名,新建2个类,用来生产消息和消费消息

@Configuration
public class RabbitConfig {
    @Bean
    public Queue Queue() {
        return new Queue("hello");
    }
}

@Component
public class HelloSender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send(){
        String context = "hello "+ new Date();
        System.out.println("Sender : " + context);
        rabbitTemplate.convertAndSend("hello",context);
    }
}

@Component
@RabbitListener(queues = "hello")
public class HelloReceiver {

    @RabbitHandler
    public void process(String context){
        System.out.println("Receiver : " + context);
    }

}

在RabbitmqApplicationTests中进行测试,程序配置地址都是 haproxy 地址,没有连接rabbitmq集群中的节点,请求由 haproxy 转发到了 rabbitmq集群中
这里写图片描述
这里写图片描述

由于文章篇幅,就没有详细介绍RabbitMQ、Haproxy 的搭建过程,请朋友们自行搭建,遇坑越多经验越多,哈哈。当然此时还算不上真正的高可用,要是 haproxy 机器挂了怎么办,使用 keepalived 监听 haproxy 节点是否挂机,挂了启用备份的 haproxy 节点,从而达到高可用(以后的研究了写出来)

关于RabbitMQ还想提几点,队列有。1.单机模式,2.普通模式集群,3.镜像队列,在普通模式上搭建起来的镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作,在 某台 rabbitmq节点上,执行 : rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’ 可以把队列设置为镜像队列

这里写图片描述

所用的软件下载地址:
haproxy-1.6.9.tar.gz
rabbitmq-server-3.6.15
erlang-20.2.2

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐