文章目录
- 前言
- 一、普通集群(副本集群)
- 1.架构图
- 二、镜像集群
- 1.架构图
前言
在之前我们是以单节点的形式来运行mq。在真正的生产实践中,mq主要用来完成两个应用系统间的通信,如果在某一时刻mq宕机了,会导致系统瘫痪,就是无法进行通信。
所谓集群架构,就是由多个mq服务节点共同去对消息传递进行服务。如果其中某一个节点宕机的话,不影响整个系统的正常使用。
RabbitMQ提供了两种集群:
- 普通集群(副本集群)
- 镜像集群
提示:以下是本篇文章正文内容,下面案例可供参考
一、普通集群(副本集群)
All data/state required for the operation of a RabbitMQ broker is replicated across all nodes. An exception to this are message queues, which by default reside on one node, though they are visible and reachable from all nodes. To replicate queues across nodes in a cluster --摘自官网
默认情况下:RabbitMQ代理操作所需的所有数据/状态都将跨所有节点复制。这方面的一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问
1.架构图
队列才是真正我们存消息的
在rabbitmq集群中,有三个节点,如下图,一个蓝色的,两个橙色的,这三个节点构成了一个集群,在普通集群中,会有一个主节点master节点主节点和两个slave节点从节点,日后,主节点上的所有数据,exchang包括所有的虚拟主机啊用户啊都可以复制到slave节点上,但是有个意外,就是主节点的队列是无法同步到slave节点上的。也就是说默认情况下,消息队列位于一个节点上,指的节点就是master节点。
一旦搭建这个集群之后,虽然我们可以从slave节点上看到相应的master节点创建的队列以及数据,但是实际上这个队列仅仅在master中存储。所以在slave节点上是能看到队列,但是对队列的操作是有限制的。所以这个集群也管他叫主从复制集群,主从模式,准确点来讲,可以叫主备模式。
所谓主备模式,主节点是用来真正和生产者打交道的,而slave节点仅仅是用来同步主节点的相应数据,同步除队列之外其他数据。当从某一时刻,主节点宕机掉后,slave也无法自动去切换成master节点。因为只有一个节点存储队列信息。那从节点仅仅只是起到了备份的作用,只有在某一时刻,master节点恢复之后,从slave节点拿取把它的原始数据恢复。
其实主备架构最大的优点,解决了在某一时刻,master节点宕机时,出现消息队列丢失的问题
核心解决问题: 当集群中某一时刻master节点宕机,可以对Queue中信息,进行备份
说白了,就是贮备,就是slave勤勤俭俭的备份,没有办法在故障时,出现一个自动故障转移,这是不行的。
这里有点需要大家注意的是:
由于slave它起到了一个master的备份,但备份的仅仅是交换机,但当然slave可以看到队列,所以消费者可以直接去对接master,同时也可以对接slave(尽管它们可以从所有节点看到和访问)
消费者绑定队列,队列只在master,为啥slave可以对接消费者?
所有队列的原数据slave都会有一份,但这队列的真实里面消息在master。
如果消费者监听的是两个slave,怎么可以拿到消息呢,是因为如果消费者绑定了slave,消费者去订阅消息队列时,它这个slave会去跟master去调,然后由master发给slave,再给消费者这样的一个过程。
RabbitMQ的主备架构,跟之前接触的主备架构不一样,主备架构中,主节点用来提供对外工作,从节点不做任何操作,仅仅用来同步数据。
RabbitMQ的主备架构的主节点也是对外工作,但它的从节点说同步数据还不太准确,因为它不能同步队列里的相关信息,它可以在一定程度上可以减少消费者对主节点的压力,消费者可以订阅从节点,也可以订阅主节点。但是没有办法做到跟之前主备架构一样,所以可以管它这个模式叫副本。但实际开发中,基本来讲,很少用这个模式,基本上用的是高可用的模式,指的就是镜像模式。
为什么不咋用,还讲副本集群,直接讲镜像集群?
因为镜像集群是基于副本集群的基础之上,所以需要学习。
二、镜像集群
This guide covers mirroring (queue contents replication) of classic queues --摘自官网
By default, contents of a queue within a RabbitMQ cluster are located on a single node (the node on which the queue was declared). This is in contrast to exchanges and bindings, which can always be considered to be on all nodes. Queues can optionally be made mirrored across multiple nodes. --摘自官网
镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升MQ集群的整体高可用性。
所谓镜像集群,可以真正做到保证消息百分之百不丢失,同时它还可以做到主节点在一某时刻失败它会自动的去做转换,自动的去做故障转移,保证系统的高可用。
在镜像集群里面,它引入了镜像的概念,就是日后它可以通过镜像去同步镜像里面包含的队列的数据,通过这种方式,就能保证master宕机时,由于我通过镜像的同步,slave也有queue信息,所以可以进行失败自动切换