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. hbase1.1.1 连接集群_除了HAProxy,RabbitMQ集群还可以这样用

    全网最简单的安装手册 // 安装erlang wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm. ...

  2. Docker:搭建RabbitMQ集群

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

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

    2019独角兽企业重金招聘Python工程师标准>>> 1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端, ...

  4. 你不知道的RabbitMQ集群架构全解

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

  5. RabbitMQ集群搭建(七)

    先来介绍一下RabbitMQ集群 RabbitMQ集群有两种模式,一种是普通模式,即默认的集群模式,另外一种为镜像模式,可以把队列做成镜像队列 我们在学习两种模式之前,先来了解下一些关于RabbitM ...

  6. Rabbitmq集群,镜像队列和分布式原理

    前言 基于前两次的分享会,结合rabbitmq相关知识,做一个小结.说明一致性的设计思想,在此说明相关的基础理论. CAP定理: 在计算机科学里,CAP定理又被称作布鲁尔定理(Brewer theor ...

  7. RabbitMQ——RabbitMQ集群原理

    摘要 主要围绕运维层面展开论述,主要包括集群搭建.日志查看.故障恢复.集群迁移.集群监控这几个方面. RabbitMQ集群搭建 如果RabbitMQ 服务器遇到内存崩溃.机器掉电或者主板故障等情况,该 ...

  8. RabbitMQ集群环境搭建

    RabbitMQ集群环境搭建 一.安装基础工具包 二:安装Erlang和RabbitMQ 1. 安装Erlang 2. 安装RabbitMQ 3. 启动RabbitMQ 4. 启动RabbitMQ管理 ...

  9. RabbitMQ 集群

    一.RabbitMQ 集群介绍 1.1 两种模式 RabbitMQ 集群有两种模式: 普通集群 镜像集群 1.2 普通集群 普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每台服务器启动一 ...

最新文章

  1. iOS超全开源框架、项目和学习资料汇总:UI篇
  2. Kindeditor视频上传问题处理
  3. 【centos7】添加开机启动服务/脚本
  4. java 文件拷贝保留原来的属性,Java - 复制JPG,同时保留所有文件属性
  5. SHELL $RANDOM产生的随机数范围是0到32767
  6. 汇编中寄存器加[]的意思
  7. 微课|Python程序设计开发宝典(5.1.2节):可调用对象
  8. win8内置管理员用户无法激活此应用
  9. 开源成语答题小程序红包设置教程
  10. U盘解决 日立硬盘 c1门
  11. 服务如何获取当前登录的windows用户名
  12. 怀疑chinaitlab的一个Linux模块被黑了!!
  13. HTTP 协议的演变历程
  14. meta标签(以京东首页为例)
  15. html微信投票,微信投票报名h5系统制作
  16. 多元回归分析(分类与运用)
  17. H5(HTML)网页制作基础
  18. html表白程序源码_表白程序源码html_程序员表白代码html
  19. DoTween的使用与详解
  20. C++进阶 必读书籍

热门文章

  1. ASP.NET MVC3 快速入门-第四节 添加一个模型(转)
  2. asp.net 运行原理
  3. .NET下,你采用的哪种方式来操作数据库
  4. 流行的 NPM 包依赖关系中存在远程代码执行缺陷
  5. 作业MathExam
  6. java 异常处理 Throwable Error 和Exception
  7. linux --- TCPdump 工具
  8. optimizer_mode优化器模式
  9. ubuntu安装最新的rails-4.2.0
  10. OS X 终端修改备忘录