1.RabbitMQ是消息队列中间件是分布式系统中重要的组件,其作用是:系统应用耦合,异步消息,流量削锋等。由erlang开发的AMQP(Advanved
Message Queue)的开源实现,官方地址:http://www.rabbitmq.com <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
<https://download.csdn.net/download/zhuyu19911016520/10394016>
rabbitmq-server-3.6.15
<https://download.csdn.net/download/zhuyu19911016520/10394012>
erlang-20.2.2 <https://download.csdn.net/download/zhuyu19911016520/10394001>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信