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. a里面不能嵌套a

    1. <a href=""> <a href=""></a></a> 会被浏览器解析为 2. <a hre ...

  2. Appium手势密码滑动之Z字形走势(java篇)

    1.直接使用负的偏移量appium会报错,在后面加上moveto(1,1)就行了 2.直接看图说话 废话少说看代码如: List<AndroidElement> element = dri ...

  3. 读书笔记 effective c++ Item 41 理解隐式接口和编译期多态

    1. 显示接口和运行时多态 面向对象编程的世界围绕着显式接口和运行时多态.举个例子,考虑下面的类(无意义的类), class Widget { public: Widget(); virtual ~W ...

  4. 怎样获得PRINCE2证书?报名PRINCE2有什么条件?

    参加培训:想要获得PRINCE2资格证书,参加培训是非常必要的,正规的培训机构有获得组织认证考试的权力.光环国际全年开设prince2课程班,全国各个地区均可以选择培训及考试 选择培训机构:只有经AP ...

  5. iOS 任务的依赖操作

    -(void)dependency{ /** 假设有A.B~C三个操作,要求: 1. 3个操作都异步执行 2. 操作C依赖于操作B 3. 操作B依赖于操作A */ //创建一个队列 NSOperati ...

  6. JS中new的运行方式

    ---恢复内容开始--- 在JS中,有两个基础原型,分别是Function.prototype和Object.prototype.这两个原型组成了JS中的所有实例他们的关系是 Function.pro ...

  7. new表达式如何创建对象

    new表达式如何创建对象 前言 刚学java时曾一度认为,构造器中this指向是当前类型的对象,当我们调用new表达式时,由父类的构造器生成对象的一部分并初始化,然后再由子类的构造器补充成完整的对象并 ...

  8. [SinGuLaRiTy] 2017-03-30 综合性测试

    [SinGuLaRiTy-1014] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s  |  Me ...

  9. 微信小程序,前端大梦想(一)

    小程序框架MINA简介       微信公众平台"小程序"具有不是APP胜似APP的效果,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用 ...

  10. 程序员带你一步步分析AI如何玩Flappy Bird

    以下内容来源于一次部门内部的分享,主要针对AI初学者,介绍包括CNN.Deep Q Network以及TensorFlow平台等内容.由于笔者并非深度学习算法研究者,因此以下更多从应用的角度对整个系统 ...