一、 RabbitMQ集群架构模式

主备模式(Warren)

  1. 主节点提供读写功能,备用节点不提供任何读写功能,只是做备用。在主节点宕机时,能实现自动切换成为主节点,主节点成为备份节点。 一般在并发数和数据量不高的情况下,这种模型好用且简单。

    主节点和备份节点共享存储,当主节点宕机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集群互联,远距离通信和复制。

rabbitmq架构设计 rabbitmq集群架构_rabbitmq架构设计


配置Shovel

  1. 启动rabbitmq插件,执行命令:
rabbitmq-plugins enable amqp_client

rabbitmq-plugins enable rabbitmq_shovel
  1. 创建rabbitmq.config 文件:touch /etc/rabbitmq/rabbitmq.config
  2. 配置配置
  3. 源服务器和目的服务器要使用相同的rabbitmq.config

镜像模式(Mirror)

集群模式非常经典的就是Mirror,保证100%数据不丢失,在实际工作中该模式使用最多,并且实现集群非常简单,一般互联网大厂都会构建这种镜像集群模式 。

Mirror镜像队列,目的为了保证rabbitmq数据的高可靠性解决方案,主要实现数据的同步,一般都是2-3个节点实现数据同步(对于100%数据可靠性解决方案一般是3节点)

架构图:

rabbitmq架构设计 rabbitmq集群架构_负载均衡_02


Application 应用服务 、 红色框内 镜像队列的组成 、 三个服务器中的broker里的队列要一致相等

蓝色 多个负载均衡服务

多活模式

多活模式也是实现异地数据复制的主流模式,因为Shovel模式配置复杂,一般实现异地集群都是使用多活模式来实现,这种模式依赖rabbitmq的federation插件,可以实现持续可靠的AMQP数据通信,多活模式在实际配置与应用非常简单

RabbitMQ部署架构采用双中心模式(多中心),那么在俩套(或多套)数据中心各部署一套RabbitMQ集群,各种新的RabbitMQ服务除了需要为业务提供正常的消息服务之外,中心之间还需要实现部分队列消息的共享。

架构图:

rabbitmq架构设计 rabbitmq集群架构_服务器_03


Federation:Federation插件是一个不需要构建Cluster,而是在broker之间传输消息的高性能插件,Federation插件可以在Brokers或者Cluster之间传输消息,连接双方可以使用不同的users和virtual hosts。双方也可以使用不同版本的RabbitMQ和Erlang。Federation插件使用AMQP协议通信,可以接受不连续的传输

架构图:

rabbitmq架构设计 rabbitmq集群架构_服务器_04


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

rabbitmq架构设计 rabbitmq集群架构_服务器_05


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

rabbitmq架构设计 rabbitmq集群架构_rabbitmq架构设计_06


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"

rabbitmq架构设计 rabbitmq集群架构_docker_07


–disc 表示设置为磁盘节点

–ram 表示设置为内存节点

忽略参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点

6、配置镜像
rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy

rabbitmq架构设计 rabbitmq集群架构_负载均衡_08


rabbitmq架构设计 rabbitmq集群架构_rabbitmq架构设计_09

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

rabbitmq架构设计 rabbitmq集群架构_负载均衡_10


查看haproxy的状态

http://你的公网IP:8002/haproxy?stats

rabbitmq架构设计 rabbitmq集群架构_负载均衡_11