一、 RabbitMQ集群架构模式
主备模式(Warren)
- 主节点提供读写功能,备用节点不提供任何读写功能,只是做备用。在主节点宕机时,能实现自动切换成为主节点,主节点成为备份节点。 一般在并发数和数据量不高的情况下,这种模型好用且简单。
主节点和备份节点共享存储,当主节点宕机HaProxy会自动将备份节点切换为主节点
HaProxy配置:
listen rabbitmq_cluster
bind 0.0.0.0:5672
#配置TCP模式
mode tcp
#轮询
balance roundrobin
#主节点
#配置 inter 每隔 5 秒对mq集群进行健康检查,rise 2次成功返回证明服务器可用,fall 2次失败证明服务器不可用
server bhz76 192.168.1.104:5672 check inter 5000 rise 2 fall 2
#备份节点 backup 为备份
server bhz77 192.168.1.117:5672 backup check inter 5000 rise 2 fall 2
远程模式(Shovel)
远程模式可以实现 " 双活 "的一种模式,简称 Shovel模式,所谓的Shovel就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域将俩个mq集群互联,远距离通信和复制。
配置Shovel
- 启动rabbitmq插件,执行命令:
rabbitmq-plugins enable amqp_client
rabbitmq-plugins enable rabbitmq_shovel
- 创建rabbitmq.config 文件:touch /etc/rabbitmq/rabbitmq.config
- 配置配置
- 源服务器和目的服务器要使用相同的rabbitmq.config
镜像模式(Mirror)
集群模式非常经典的就是Mirror,保证100%数据不丢失,在实际工作中该模式使用最多,并且实现集群非常简单,一般互联网大厂都会构建这种镜像集群模式 。
Mirror镜像队列,目的为了保证rabbitmq数据的高可靠性解决方案,主要实现数据的同步,一般都是2-3个节点实现数据同步(对于100%数据可靠性解决方案一般是3节点)
架构图:
Application 应用服务 、 红色框内 镜像队列的组成 、 三个服务器中的broker里的队列要一致相等
蓝色 多个负载均衡服务
多活模式
多活模式也是实现异地数据复制的主流模式,因为Shovel模式配置复杂,一般实现异地集群都是使用多活模式来实现,这种模式依赖rabbitmq的federation插件,可以实现持续可靠的AMQP数据通信,多活模式在实际配置与应用非常简单
RabbitMQ部署架构采用双中心模式(多中心),那么在俩套(或多套)数据中心各部署一套RabbitMQ集群,各种新的RabbitMQ服务除了需要为业务提供正常的消息服务之外,中心之间还需要实现部分队列消息的共享。
架构图:
Federation:Federation插件是一个不需要构建Cluster,而是在broker之间传输消息的高性能插件,Federation插件可以在Brokers或者Cluster之间传输消息,连接双方可以使用不同的users和virtual hosts。双方也可以使用不同版本的RabbitMQ和Erlang。Federation插件使用AMQP协议通信,可以接受不连续的传输
架构图:
upstream :上游服务
federated : 下游服务
upstream link :Federation
上游数据到达 Exchange(X) 通过 upstream link 转到下游服务对应的 Exchange 中,下游的Exchange再通过绑定关系转发到队列中
Federation Exchanges ,可以看成Downstream 从 Upstream 主动拉取消息,但不是拉取所有消息,必须是在Downstream 上已经明确定义了绑定关系的Exchange,也就是有实际的物理Queue来接收消息,才会从Upstream 拉取消息到Downstream 。使用AMQP协议实施代理间通信,Downstream 会将绑定关系组合在一起,绑定/解除绑定命令将发送到Upstream交换机,所以,Federation Exchange 只接收具有订阅的消息。
二、 Docker构建RabbitMQ高可用集群镜像模式
1、拉取镜像
docker pull rabbitmq:management
docker pull haproxy:latest
2、创建docker网络,用于haproxy和rabbimq通信
docker network create rabbtimanet
3、查看网络
docker network ls
4、创建rabbitmq 容器
docker run -d --hostname rabbit1 --name rabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='KANG' -e RABBITMQ_NODENAME=rabbit1 --net=rabbtimanet rabbitmq:management
docker run -d --hostname rabbit2 --name rabbit2 -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='KANG' -e RABBITMQ_NODENAME=rabbit2 --net=rabbtimanet --link rabbit1:rabbit1 rabbitmq:management
docker run -d --hostname rabbit3 --name rabbit3 -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='KANG' -e RABBITMQ_NODENAME=rabbit3 --net=rabbtimanet --link rabbit1:rabbit1 --link rabbit2:rabbit2 rabbitmq:management
查看容器
docker ps
5、加入集群
#进入容器内部
docker exec -it rabbit2 /bin/bash
#将rabbit2加入到集群中
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit1@rabbit1
rabbitmqctl start_app
退出集群
# docker exec rabbitmq3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app"
–disc 表示设置为磁盘节点
–ram 表示设置为内存节点
忽略参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点
6、配置镜像
rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy
name: 策略名称
Pattern:^ 匹配符,一个^代表匹配所有
Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)
或者进入容器使用命令:
#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
7、创建Haproxy配置文件
vim /data/haproxy/haproxy.cfg
global
maxconn 10000 #默认最大连接数
log 127.0.0.1 local0 #[err warning info debug]
chroot /usr/local/sbin #chroot运行的路径
daemon #以后台形式运行haproxy
pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
defaults
log 127.0.0.1 local3
mode http #所处理的类别 (#7层 http;4层tcp )
maxconn 10000 #最大连接数
option dontlognull #不记录健康检查的日志信息
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
#stats refresh 30 #统计页面刷新间隔
retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置
balance roundrobin #默认的负载均衡的方式,轮询方式
#balance source #默认的负载均衡的方式,类似nginx的ip_hash
#balance leastconn #默认的负载均衡的方式,最小连接
timeout connect 5000 #连接超时
timeout client 50000 #客户端超时
timeout server 50000 #服务器超时
timeout check 2000 #心跳检测超时
####################################################################
listen http_front
bind 0.0.0.0:8002 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy?stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
#####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################
listen rabbitmq_admin
bind 0.0.0.0:8001
server rabbit1 rabbit1:15672
server rabbit2 rabbit2:15672
server rabbit3 rabbit3:15672
#多服务器之间的配置
#server rabbitmq3 29.1.223.113:15672
#server rabbitmq2 39.105.104.19:15672
#server rabbitmq1 33.20.102.79:15672
####################################################################
listen rabbitmq_cluster
bind 0.0.0.0:5677
option tcplog
mode tcp
timeout client 3h
timeout server 3h
option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
#check inter 2秒 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server rabbit1 rabbit1:5672 check inter 2s rise 2 fall 3
server rabbit2 rabbit2:5672 check inter 2s rise 2 fall 3
server rabbit3 rabbit3:5672 check inter 2s rise 2 fall 3
#多服务器间配置
#server rabbitmq3 39.105.104.19:5674 check inter 5s rise 2 fall 3
#server rabbitmq2 39.125.104.19:5673 check inter 5s rise 2 fall 3
#server rabbitmq1 39.105.101.19:5672 check inter 5s rise 2 fall 3
启动容器
docker run -d \
--name rabbitmq-haproxy \
-p 8002:8002 -p 5677:5677 -p 8001:8001 \
--net=rabbitmqnet \
-v /data/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
haproxy:latest
通过haproxy 访问集群
http://你的公网IP:8001
查看haproxy的状态
http://你的公网IP:8002/haproxy?stats