【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

相关推荐
huaqianzkh12 分钟前
了解Hadoop:大数据处理的核心框架
大数据·hadoop·分布式
jlting1951 小时前
Kafka--关于broker的夺命连环问
分布式·kafka
菜菜-plus2 小时前
分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
java·分布式·微服务·nacos·gateway·springcloud·openfeign
好奇的菜鸟2 小时前
Spring Boot 启动时自动配置 RabbitMQ 交换机、队列和绑定关系
spring boot·rabbitmq
好奇的菜鸟3 小时前
RabbitMQ 通道(Channel)详解:方法使用、消息确认与拒绝
分布式·rabbitmq
黄小耶@3 小时前
python如何使用Rabbitmq
分布式·后端·python·rabbitmq
超级无敌暴龙战士(solider)3 小时前
如何保证RabbitMQ的可靠性传输
分布式·rabbitmq
小乖兽技术3 小时前
C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
开发语言·c++·rabbitmq
简 洁 冬冬10 小时前
036 RabbitMQ消息确认 死信队列 延时队列
rabbitmq
东方巴黎~Sunsiny11 小时前
当kafka消费的数据滞后1000条时,打印告警信息
分布式·kafka·linq