rabbitmq集群(一)介绍

rabbitmq,以下简写为RM

一:介绍

RM内建立集群有两个目标:

1、允许生产者和消费者在rabbit节点崩溃的情况下继续允许。

2、通过添加更多节点来线性扩展消息通信吞吐量。


二:集群架构

RM会始终记录以下四种类型的内部元数据:

队列元数据:队列名称和他们的属性(是否持久化,是否自动删除)

交换器元数据:交换器名称、类型和属性(可持久化等)

绑定元数据:一张表,展示了如何将消息路由到队列

vhost元数据:为vhost内的队列、交换器和绑定提供命名空间和安全属性

对于单一的节点,RM把以上这些信息存在内存,同时将标记为可持久化的队列和交换器,以及绑定关系存到硬盘,确保重启时可以重建队列和交换机。  当引入集群时,RM需要追踪新的元数据类型:集群节点的位置,还有节点与其他类型元数据的关系。 

RM集群内元数据存储有两种方式: 

1、存在硬盘上(独立节点默认设置)

2、存在RAM上


在深入集群节点和如何存储元数据前,先来理解一下集群环境中的队列和交换器行为。

集群中的队列:

单一节点中,队列所有信息(元数据,内容,状态)都存储于该节点上;在集群中,只有某个节点会存储队列的全部信息(该节点称为队列的所有者),而其他节点只存储队列的元数据和队列所有者的指针。  当集群节点崩溃时,会失去该节点的队列和所关联的绑定,这个时候我们怎么办呢?  有两种方法:

1、如果最开始时,队列被设置为可持久化,那么就恢复故障节点。

2、如果队列没有设置为可持久化,消费者可以重连到集群重新创建队列。(如果最开始队列设置持久化,那么重新连接集群创建队列时会得到404错误,这是为了确保失败节点恢复后加入集群,不会丢失原来的队列消息)

rabbitmq集群(一)介绍_第1张图片


问题:为什么默认状态下RM不将队列内容和状态复制到所有节点呢?

两个原因:

1、存储空间:如果所有节点都拥有队列的完整拷贝,那么添加新节点不会带来更多存储空间。

2、性能:如果每条信息都复制到所有节点,对于持久化消息,每一条都会触发磁盘活动。当增加节点时,网络和磁盘负载都会增加。


分布交换器:

其实交换器并不是一个实体,不像队列拥有自己的进程,它只是一个名称和一个队列绑定列表。  当消息发布到交换器时 ,其实是由信道(channel)根据消息的key去匹配列表,然后路由到队列中。

当创建一个exchange时,RM将查询列表添加到所有节点上,这样每个节点上的channel都可以访问它了。当节点故障时,只需要重新连接到集群即可使用,不用重新创建。



内存节点和磁盘节点:

单节点系统只允许磁盘类型的节点,否则重启RM后,所有系统配置信息会丢失。

在集群中,为了性能,大多数节点配置为内存节点,RM要求至少一个磁盘节点,但是一般我们配置两个或以上(根据需要),原因是:

1、磁盘节点故障后,集群可以运行,但是不能更改任何东西,如:创建队列,,创建交换器,,创建绑定,,添加用户,,更改权限,,添加或删除节点。所以设置只配置一个没有保障。

2、添加内存节点或是内存节点重启时,它会连接到预先配置的磁盘节点下载集群的元数据拷贝,那如果这个时候磁盘节点刚好故障怎么办?内存节点就无法找到集群。所以我们最好配置两个以上的磁盘节点,并且全部告知该内存节点。(只要内存节点可以找到一个磁盘节点,就可以加入集群)





下一节开始搭建集群


你可能感兴趣的:(rabbitmq集群)