RabbitMQ内建集群的设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点在奔溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信的吞吐量。当失去一个RabbitMQ节点时客户端能够连接集群中的任何其他节点并继续生产或者消费消息。同样,如果RabbitMQ集群正疲于应对庞大的消息通信量,可以通过添加更过的节点线性增加性能。

  RabbitMQ集群不会保证消息的万无一失:因为RabbitMQ默认不会将队列的内容复制到整个集群上。如果不进行特殊的配置,这些消息仅存在队列所属的那个节点上。

RabbitMQ集群架构

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

  • 队列元数据-队列名称即其他属性
  • 交换器元数据-交换器名称、类型、属性
  • 绑定元数据-一张简单的表格展示如何将消息路由到队列
  • Vhost元数据-为vhost内的队列、交换器和绑定提供命名空间和安全属性

  在单一节点中,RabbitMQ会将这些元数据信息存储在硬盘中,同时哪些标记为可持久化的队列和交换器(以及它们的绑定)存储在硬盘上。存储在硬盘和交换器和队列在重启RabbitMQ后重新重建。当引入集群时,RabbitMQ需要跟踪新的元数据类型:集群节点位置、以及节点与已记录的其他类型元数据的关系。

集群中的队列

  在RabbitMQ集群中,不是每一个节点都有所有队列的完全拷贝。如果在集群中创建队列的话,集群只会在单个节点而不是在所有节点上创建完整的队列信息(元数据、状态和内容)。结果是只有队列的所有者节点知道有关队列的所有信息。所有其他非所有者节点只知道队列的元数据和指向该队列存在的那个节点的指针。因此当集群节点奔溃是,该节点的队列和关联的绑定就都消失了。附加在队列的消费者也丢失了订阅信息,并且任何匹配该队列绑定信息的新消息也都丢失了。可以通过让消费者重新连接到集群并重新创建队列。但是这种做法仅对当队列最开始没有被设置成可持久化才行。

  为什么在默认情况下RabbitMQ不将队列内容和状态复制到所有的节点呢?

  • 存储空间
  • 性能,减少网络和磁盘负载。

分布交换器

  交换器是一个名称和一个队列绑定的列表。当消息发布到交换器时,实际是由连接到的信道将消息上路由键同交换器的绑定进行比较,然后路由消息。

  当创建一个新的交换器时,RabbitMQ所要做的是将查询表添加到集群中的所有节点上。

  如果消息已经发布到信道上,但在消息路由之前节点发生故障的这些消息会怎样?

  AMQP的basic.publish命令不会返回消息的状态。这种情况意味着消息将会丢失。解决方案是使用AMQP事务,在消息路由到队列之前一直它会一直阻塞;或者使用发送发确认模式来记录连接中断是尚未被确认的消息。

内存节点和磁盘阶段

  内存阶段:将所有队列、交换器、绑定、用户、权限和Vhost的元数据定义都出处在内存中。而磁盘节点则将元数据存储在磁盘中。单节点系统只允许磁盘类型的节点:否则每次重启RabbitMQ后,所有关于系统的配置信息都会丢失。

  RabbitMQ只要求集群中至少有一个磁盘节点,其他节点都可以是内存节点。当节点加入或者离开集群时,它们必须要将变更通知到至少一个磁盘节点。如果只有一个磁盘节点,磁盘节点奔溃后,集群可以继续路由消息(即保持运行),但是直到该节点恢复之前,无法更改任何东西。通常在集群中设置两个磁盘节点。

RabbitMQ集群和失败处理的更多相关文章

  1. RabbitMQ 集群+负载均衡

    负载均衡 集群的配置已经搭建好了,代码也成功跑通,成功做到了高可用,但是我们的程序连接节点并不会管哪个服务器在忙.哪个服务器空闲,完全看心情想连谁就连谁.而且代码中要把每个ip的节点都手动的写出来 , ...

  2. RabbitMQ集群、镜像部署配置

    1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.Act ...

  3. RabbitMQ系列(六)你不知道的RabbitMQ集群架构全解

    前言 本文将系统的介绍一下RabbitMQ集群架构的特点.异常处理.搭建和使用中要注意的一些细节. 知识点 一.为什么使用集群? 二.集群的特点 三.集群异常处理 四.集群节点类型 五.集群搭建方法 ...

  4. Centos6.9下RabbitMQ集群部署记录

    之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...

  5. Docker:搭建RabbitMQ集群

    RabbitMQ原理介绍(一) RabbitMQ安装使用(二) RabbitMQ添加新用户并支持远程访问(三) RabbitMQ管理命令rabbitmqctl详解(四) RabbitMQ两种集群模式配 ...

  6. centos7 rabbitmq集群搭建+高可用

    环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...

  7. CentOS 7 下 RabbitMQ 集群搭建

    环境 10.0.0.20 node1 10.0.0.21 node2 10.0.0.22 node3 搭建(在所有节点执行) 添加EPEL源 [root@node1 ~]# rpm -Uvh http ...

  8. RabbitMQ集群使用Haproxy负载均衡

    (1).下载 http://www.haproxy.org/#down (2).解压 tar -zxvf haproxy-1.5.18.tar.gz (3).安装 1).编译 make TARGET= ...

  9. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

随机推荐

  1. JAVA循环依赖

    最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢? 示例代码1 public class Test{ public stati ...

  2. xml学习_上篇

    xml简介: XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. xml小示例: /************************ ...

  3. C语言 动态数组实现

    一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...

  4. 老李分享:Android性能优化之内存泄漏1

    老李分享:Android性能优化之内存泄漏   前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...

  5. 基于Excel参数化你的Selenium2测试代码

  6. Swift: 使用cocoapods进行单元测试找不到bridge_header文件

    准备对项目进行单元测试,在 command + U 运行时出现了错误找不到桥接文件,如下图所示. 找了各种资料,终于解决了,如下图,可以发现search path中路径都为空,由于unit test是 ...

  7. SpringMVC 自定义全局日期转换器

    第一步: 编写自定义转换器的类 /* * 自定义日期转换器 */ public class CustomDateConverter implements Converter<String, Da ...

  8. JavaScript基础学习(二)—JavaScript基本概念

    一.语法 1.区分大小写     JavaScript是一种弱类型的脚本语言.它区分大小写,变量名test与Test表示两个完全不同的变量.   2.标识符      所谓标识符就是变量.函数.属性的 ...

  9. Linux服务器性能查看分析调优

    一 linux服务器性能查看 1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc ...

  10. 1029. Median

    Given an increasing sequence S of N integers, the median is the number at the middle position. For e ...