【RabbitMQ学习笔记#11】RabbitMQ集群

2018年1月13日 0 条评论 734 次阅读 0 人点赞

在上一篇博客中主要讲的是如何在单主机上搭建集群。设置RabbitMQ集群是让RabbitMQ变成高可用性的两种方法之一,还有一种方法就是通过扩大程序的规模来提升性能

1、 RabbitMQ集群

RabbitMQ与其他消息通信服务器有所区别同时也是其最优秀的功能之一的就是其内建集群。
内建集群的主要目的有两个:

a) 运行消费者和生产者在RabbitMQ节点崩溃的情况下继续运行。

b) 通过更多的节点线性扩展消息通信吞吐量。

其实现方式主要是利用Erlang的OTP完成。

2、 集群架构

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

a) 队列元数据------队列的名称和属性

b) 交换器元数据---交换机的名称、类型和属性

c) 绑定元数据-----一张简单的表格展示了如何将消息路由到队列。(路由键和队列的关系)

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

在引入集群时,RabbitMQ会追踪新的元数据类型。

e) 集群节点位置

f) 节点与已记录的其他类型元数据的关系

在集群中也支持选择将元数据存储到磁盘上(独立节点的默认位置),或者仅仅存储在RAM中。

3、 集群中的队列

集群中的队列特点:

a) 不是每一个节点都有所有队列的完全拷贝。

b) 只会在单个节点而不是所有节点上创建完整的队列信息(元数据、状态、内容)。

c) 只有队列的所有者知道有关队列的所有信息。

因此当集群节点崩溃的时候,该节点的队列和关联的绑定就都消失了。在这种情况下,持久化的队列不能通过重建队列的方式恢复,仅能通过恢复故障节点使指定队列重回集群。

在默认情况下,RabbitMQ不会将队列内容和状态复制到所有节点,主要是因为存储空间和性能问题。

4、 分布式交换器

交换器的本质只是一个名称和一个队列绑定列表。信道才是真正的路由器。交换器只不过是一张查询表,创建一个新的交换器,RabbitMQ所要做的是将查询表添加到集群中的所有节点上。集群中的每一个节点都拥有每个交换器的所有信息。

那么问题就来了,消息已经发布到信道上,但是在路由完成之前节点发生故障的话,消息会怎么样?

答案:

AMQP的basic.publish命令不会返回消息的状态。这意味着当信道节点崩溃时信道可能仍然在路由消息,而生产者已经创建下一条消息了。在这种情况下,将会有消息丢失的风险。

解决方案:

1) 使用AMQP事务,在消息到达队列之前会一直阻塞;

2) 使用发送方确认(publisher confirm)模式来记录连接中断时尚未被确认的消息。

这两种方案也能在节点故障并且目的队列不复存在时检测到消息无法路由的情况。

5、 内存节点 OR 磁盘节点

内存节点:将所有的队列、交换器、绑定、用户、权限和vhost的元数据都仅存在内存中。

磁盘节点:将上述元数据存放在磁盘中

单节点系统只允许使用磁盘类型的节点,否则,每次重启RabbitMQ之后,所有关于系统的配置都会丢失。

当在集群中声明队列、交换器和绑定的时候,这些操作会直到所有集群节点都成功提交元数据变更后才返回。===>磁盘的写入时非常昂贵的。

RabbitMQ要求在集群中至少有一个磁盘节点。当内存节点加入或者离开集群的时候,该节点必须要将该变更通知到至少一个磁盘节点。如果该磁盘节点崩溃,集群可以继续路由消息,但是不能进行创建队列、交换器、绑定,添加用户,更改权限,添加或删除集群节点。

realks

这个人太懒什么东西都没留下

文章评论(0)