【RabbitMQ】之高可用集群搭建

一、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

相关推荐
RainbowSea17 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea17 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
数据智能老司机18 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机18 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
数据智能老司机19 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记19 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周21 小时前
kafka副本同步时HW和LEO
分布式·kafka
ChinaRainbowSea1 天前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
爱的叹息1 天前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
千层冷面1 天前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby