一、RabbitMQ
集群简介
1、默认集群原理
1-1、RabbitMQ 集群简介
单台 RabbitMQ 服务器处理消息的能力是有瓶颈的,而且可靠性还无法保证,所以需要通过集群来提高消息的吞吐量和提高数据可靠性。
由于 RabbitMQ 本身是基于 Erlang 编写,而 Erlang 语言天生具备分布式特性(通过同步 Erlang 集群各节点的 erlang.cookie 来实现)。因此,RabbitMQ 天然支持集群,并且还能通过水平扩展节点的方式提高吞吐量。
在一个多节点的 RabbitMQ 集群中,Exchange(交换器)的元数据(Metadata)信息在所有节点上都是一致的,而 Queue(存放消息的队列)的完整数据只会存在于创建它的那个节点上,其他节点只知道这个 Queue 的 Qetadata 信息和一个指向 Queue 的 owner node 的指针(起到消息转发作用)。
1-2、RabbitMQ 集群同步的元数据
RabbitMQ 集群会始终同步以下四种类型的内部元数据:
- Queue 元数据:队列名称和它的属性;
- Exchange 元数据:交换器名称、类型和属性;
- Binding 元数据:一张简单的表格展示了如何将消息路由到队列;
- VHost 元数据:为 VHost 内的队列、交换器和绑定提供命名空间和安全属性;
所以,当用户访问其中任何一个 RabbitMQ 节点时,通过 rabbitmqctl 查询到的 Queue/Exchange/Binding/VHost 等信息都是相同的。
1-3、为什么 RabbitMQ 集群只同步元数据
第一,存储空间。如果每个集群节点都拥有所有 Queue 的完全数据,那么每个节点的存储空间会非常大,集群的消息积压能力会非常弱(无法通过集群节点的扩容提高消息积压能力);
第二,性能。消息的发布者需要将消息复制到每一个集群节点,对于消息持久化、网络和磁盘同步复制的开销都会明显增加。
1-4、RabbitMQ 集群发布/订阅消息的基本原理
集群原理图如下:
客户端消息收发有以下两种情况:
客户端直接连接队列所在的节点: 如果消息生产者或者消费者通过 amqp-client 的客户端连接至节点 1 进行消息的发布或者订阅,那么此时的集群中的消息收发只与节点 1相关。
客户端连接的是非队列数据所在的节点: 如果消息生产者所连接的是节点 2 或者节点 3,此时,由于队列 1 的完整数据不在该两个节点上,所以在发送消息时这两个节点会根据节点上队列 1 的元数据将消息转发至节点1上,最终发送的消息还是会存储至节点 1 的队列 1 上(这两个节点主要起了一个路由转发作用)。同样,如果消息消费者所连接的节点在 2 或者 3,那这两个节点也会作为路由节点起到转发作用,将会从节点 1 的队列 1中 拉取消息进行消费。
1-5、集群节点类型
RabbitMQ 集群节点分为磁盘节点和内存节点两种类型:
磁盘节点: 将配置信息和元信息存储在磁盘上(单节点系统必须是磁盘节点,否则每次重启 RabbitMQ 之后所有的系统配置信息都会丢失)。
内存节点: 将配置信息和元信息存储在内存中,性能是优于磁盘节点的。
RabbitMQ 要求集群中至少有一个磁盘节点,当节点加入和离开集群时,必须通知磁盘节点(如果集群中唯一的磁盘节点崩溃了,则不能进行创建队列、创建交换器、创建绑定、添加用户、更改权限、添加和删除集群节点)。
总之如果唯一磁盘的磁盘节点崩溃,集群是可以保持运行的,但不能更改任何东西。因此建议在集群中设置两个磁盘节点,只要一个可以,就能正常操作。
rabbitMQ的配置文件来指定其他配置,如监听的接口和端口等。RabbitMQ的配置文件通常位于 /etc/rabbitmq/rabbitmq.conf