先来介绍一下RabbitMQ集群
RabbitMQ集群有两种模式,一种是普通模式,即默认的集群模式,另外一种为镜像模式,可以把队列做成镜像队列
我们在学习两种模式之前,先来了解下一些关于RabbitMQ集群的概念
元数据:包括队列元数据,交换器元数据,交换器元数据,vhost元数据
(1)队列元数据:队列名称和它的属性;
(2)交换器元数据:交换器名称、类型和属性;
(3)绑定元数据:一张简单的表格展示了如何将消息路由到队列;
(4)vhost元数据:为vhost内的队列、交换器和绑定提供命名空间和安全属性;
由于RabbitMQ集群会始终同步这四种类型的内部元数据,所以当用户访问其中任何一个RabbitMQ节点时,通过rabbitmqctl查询到的队列,交换机等信息都是相同的。
节点:RabbitMQ集群中包含两种节点:磁盘节点、内存节点
磁盘节点:将元数据存放在硬盘,一个集群至少有一个磁盘节点,元数据至少保存在一个磁盘上,内存节点重启后去磁盘节点拷贝当前集群元数据。如果磁盘节点全挂掉了,集群无法创建新的东西,但是仍然能继续使用已经存在的东西
内存节点:内存节点的元数据存放在内存中,性能比磁盘节点好。其性能只体现在资源管理上,比如增加或删除队列,虚拟主机,交换机等,发送和接受message速度同磁盘节点一样。
RabbitMQ的两种模式
普通模式
在普通集群里,元数据信息在所有节点上是一致的,但是队列的完整内容却只存在创建它的节点上,各个节点仅有相同的队列元数据。当生产者发送消息到节点A的队列中后,消费者从节点C拉取时,RabbitMQ会临时在节点A与节点C之间进行消息传输,把节点A中的消息实体取出并经过节点C发送给消费者。
但是该模式存在一个问题:当节点A发生故障后,节点C无法取到节点A中还未被消费的消息实体。如果队列没有做持久化,那么其它节点可以创建同样的队列继续运作,但是这样队列不持久化,消息就没持久化,那么存在该队列上的消息将永久性丢失,如果做了消息持久化,由于队列也被持久化了,其它节点无法创建对应队列,那么只有等节点A故障恢复后,消息才能被其他节点消费。
镜像模式
镜像模式是在普通模式的基础上,把需要的队列做成镜像队列,存在于多个节点来实现高可用(HA)。因为该模式会主动地将镜像队列的消息实体在各镜像节点间进行同步,即将镜像队列的队列内容同步到各个镜像节点上,所以在消费者拉取数据时不需要需临时拉取。此处注意,如果队列不是镜像队列,则其队列内容不会被同步到各个节点上。
但是该模式除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被大量消耗。通常地,对可靠性要求较高的场景建议采用镜像模式。
RabbitMQ集群