1、集群搭建
一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性、并发性、吞吐量和消息堆积能力等问题的考虑,在生产环境上一般都会考虑使用RabbitMQ的集群方案。
2、集群方案的原理
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的COOKIE来实现)。
RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。
haproxy请求分发
可以理解为通过nginx来作后端的负载均衡,HaProxy可以通过监听一个统一的端口对外提供能力,然后内部进行分发。除支持http7层处理外,还顺便为mysql支持4层转发。
程序进行访问时,就不再访问具体的rabbitmq机器,而是访问这个HaProxy所在的机器。这里就提到需要一个额外的机器来提供服务,但是由于只为HaProxy使用,其根据很低,一个最低配机器即可,费用不大。同时,相应的端口也填写HaProxy所暴露的端口即可。对外即认为也只仍然只有一个rabbitmq,即对外是透明的。
KeepAlived高可用
保证服务不会单点的作法就是加机器,但加机器就会出现多个ip,如何保证前端程序使用单个ip又能保证后端的实际处理机器为多台,这就是KeepAlived的作用。
我们为了保证HaProxy的高可用,已经又加了一个机器,即为HaProxyA和HaProxyB。
通过KeepAlived,我们可以创造出第3个IP,由ip3来对外提供服务,但是与HaProxy的转发性质不同,这里的ip3实际上就是HaProxyA和HaProxyB的一个同名映射。可以理解为HaProxyA和HaProxyB都在争抢这个ip,哪个争抢到了,就由哪个来提供服务。
3、使用多台服务器进行集群搭建
官方文档:https://www.rabbitmq.com/clustering.html
hostnamectl set-hostname m1
hostnamectl set-hostname m2
scp /var/lib/rabbitmq/.erlang.COOKIE m2:/var/lib/rabbitmq/.erlang.COOKIE
[root@rabbitmq2 ~]
[root@rabbitmq2 ~]
[root@rabbitmq2 ~]
[root@rabbitmq2 ~]
[root@rabbitmq2 ~]
rabbitmqctl cluster_status
4、负载均衡-HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
安装HAProxy
yum install haproxy
vim /etc/haproxy/haproxy.cfg
systemctl start haproxy
systemctl status haproxy.service
http://服务器IP:1080/haproxy_stats
配置HAProxy
配置文件路径:/etc/haproxy/haproxy.cfg
globallog 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/stats
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000
listen rabbitmq_clusterbind 0.0.0.0:5672option tcplogmode tcp option clitcpkatimeout connect 1s timeout client 10stimeout server 10sbalance roundrobinserver node1 节点1 ip地址:5672 check inter 5s rise 2 fall 3 server node2 节点2 ip地址:5672 check inter 5s rise 2 fall 3
listen http_frontbind 0.0.0.0:1080stats refresh 30sstats uri /haproxy_statsstats auth admin:admin
haproxy.cfg配置详解
listen rabbitmg cluster
bind 0.0.0.0:5672
option tcplog
mode tcp
option clitcpka
timeout connect 1s
timeout client 10s
timeout server 10s
balance roundrobin
server node1 192.168.132.137:5672 check inter 5s rise 2 fall 3
server node2192.168.132.139:5672 check inter 5s rise 2 fall 3
listen http front
bind 0.0.0.0:1080
stats uri /haproxy?stats
stats auth admin:admin
注意,此时连接的rabbitmq的ip是HAProxy服务的IP地址和设置的监听端口号。