RabbitMQ集群架构模型和原理解析

1 RabbitMQ 主备模式

Warren,一个主/备方案(主节点如果挂了,从节点提供服务,和ActiveMQ利用Zookeeper做主/备一样) RabbitMQ主备原理图 它是由HaProxy路由到主节点,由主节点提供服务,当主节点发生故障时,HaProxy会帮我们把请求路由到备份节点,继续提供服务。当原来的主节点恢复了之后,他会成为原来备份节点的备份节点。

1.1 主备模式 - HaProxy配置

# 集群名字 
listen rabbitmq_cluster
# 配置TCP模式
bind 0.0.0.0:5672
# 简单的轮询
mode tcp
# 主节点
balance roundrobin
# 主节点,5秒钟检查一次,如果连续两次失败,则切换主节点
server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 2
# 备用节点
server bhz77 192.168.11.77:5672 backup check inter 5000 rise 2 fall 2

2 远程模式

远程模式,是远距离通信和复制,可以实现双活的一种模式,简称Shovel模式。 所谓Shovel就是我们可以把消息进行不同数据中心的复制工作,可以跨地域的让两个mq集群互联 这种模式,目前使用比较少,因为他的可靠性有待提高,并且他的配置也比较麻烦。

2.1 Shovel架构模型

当我们请求到RabbitMQ服务时,请求可以转发到下游的RabbitMQ服务去处理,他不但可以起到容灾的作用,也可以提高请求处理的效率。 比如有一个订单系统,使用了Shovel插件后,模型变成了近端同步确认,远端异步确认的方式,大大提高了订单确认速度,并且还能保证可靠性。 Shovel架构模型

2.2 Shovel集群配置步骤

  • 启动RabbitMQ插件
    • rabbitmq-plugins enable amqp_client
    • rabbitmq-plugins enable rabbitmq_shovel
  • 创建rabbitmq.config文件
  • 源与目的地服务器使用相同的配置文件

3 镜像模式

集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失。 这种模式在实际工作中用的最多,并且实现集群非常简单,一般的互联网大厂都会构建这种镜像集群模式。 Mirror镜像队列是高可靠的,它是内部是使用的数据同步,RabbitMQ底层是使用Erlang去实现的,是天然的交换机的方式,和原生socket一样低的延迟,在数据同步的时候,他的性能是非常好的。 并且我们在搭建集群的时候,一般采用奇数个节点,奇数个节点可以防止集群发生脑裂的现象。

3.1 RabbitMQ集群架构图

RabbitMQ集群架构图 最底层的三个是完全相同的RabbitMQ服务,中间层是两个HaProxy代理,负责去路由请求,其中使用KeepAlived实现故障转移,高可用。 这种部署的方式是有缺陷的,它不能支持横向的扩展,因为他的数据存储能力是有限的,当流量比较大的时候,由于消费能力不足,导致数据堆积比较大,这时即使在扩展一个服务,只会增加服务的负担,增加几个节点,就需要多同步几份数据。如果要更好的实现横向扩展,可以使用多活模式。

4 多活模式

这种模式也是实现异地数据复制的主流模式,因为Shovel模式配置比较复杂,所以一般来说实现异地集群都是使用这种双活或者多活模型来实现的。 这种模型需要依赖RabbitMQ的federation插件,可以实现持续的可靠的AMQP数据通信,多活模式实际配置与应用非常简单。 RabbitMQ部署架构采用双中心模式(多中心),那么在两套(或多套)数据中心中各部署一套RabbitMQ集群,各中心的RabbitMQ服务除了需要为业务提供正常的消息服务外,中心之间还需要实现部分队列消息共享。

4.1 多活集群架构图

多活集群架构图

4.2 多活模式 - Federation插件

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

Federation Exchanges,可以看成Downstream从Upstream主动拉取消息,但并不是拉取所有消息,必须是在Downstream上已经明确定义Bindings关系的Exchange,也就是有实际的物理Queue来接受消息,才会从Upstream拉取消息到Downstream。使用AMQP协议实施代理间通信,Downstream会将绑定关系组合在一起,绑定、解除绑定命令将发送到Upstream交换机。因此,Federation Exchange只接受具有订阅的消息(本处贴出官方图来说明); Federation插件