RabbitMQ集群原理介绍

文章目录

    • 一、RabbitMQ默认集群原理
      • 1. RabbitMQ集群元数据的同步
      • 2. 为何RabbitMQ集群仅采用元数据同步的方式
      • 3. RabbitMQ集群发送/订阅消息的基本原理
      • 4. 客户端直接连接队列所在节点
      • 5. 客户端连接的是非队列数据所在节点
      • 7. 集群节点类型
        • 磁盘节点
        • 内存节点
      • 8. 总结
    • 二、RabbitMQ镜像队列原理
      • 2.1. 镜像队列的结构
      • 2.2. GM(Guarenteed Multicast)
      • 2.3. 新增节点
      • 2.4. 节点的失效
      • 2.5. 消息的同步
      • 2.6. 总结

一、RabbitMQ默认集群原理

RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现)。因此,RabbitMQ天然支持集群。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。

下图为集群的示例:
在这里插入图片描述
上面图中采用三个节点组成了一个RabbitMQ的集群,Exchange A(交换器)的元数据信息在所有节点上是一致的,而Queue(存放消息的队列)的完整数据则只会存在于它所创建的那个节点上。,其他节点只知道这个queue的metadata信息和一个指向queue的owner node的指针。

1. RabbitMQ集群元数据的同步

RabbitMQ集群会始终同步四种类型的内部元数据:

a. 队列元数据:队列名称和它的属性

b. 交换器元数据:交换器名称、类型和属性

c. 绑定元数据:一张简单的表格展示了如何将消息路由到队列

d. vhost元数据:为vhost内的队列、交换器和绑定提供命名空间和安全属性

因此,当用户访问其中任何一个RabbitMQ节点时,通过rabbitmqctl查询到的queue/user/exchange/vhost等信息都是相同的。

2. 为何RabbitMQ集群仅采用元数据同步的方式

第一,存储空间。如果每个集群节点都拥有所有Queue的完全数据拷贝,那么每个节点的存储空间会非常大,集群的消息积压能力会非常弱(无法通过集群节点的扩容提高消息积压能力);

第二,性能。消息的发布者需要将消息复制到每一个集群节点,对于持久化消息,网络和磁盘同步复制的开销都会明显增加。

3. RabbitMQ集群发送/订阅消息的基本原理

RabbitMQ集群的工作原理图如下:
在这里插入图片描述

4. 客户端直接连接队列所在节点

如果有一个消息生产者或者消息消费者通过amqp-client的客户端连接至节点1进行消息的发布或者订阅,那么此时的集群中的消息收发只与节点1相关。

5. 客户端连接的是非队列数据所在节点

如果消息生产者所连接的是节点2或者节点3,此时队列1的完整数据不在该两个节点上,那么在发送消息过程中这两个节点主要起了一个路由转发作用,根据这两个节点上的元数据转发至节点1上,最终发送的消息还是会存储至节点1的队列1上。同样,如果消息消费者所连接的节点2或者节点3,那这两个节点也会作为路由节点起到转发作用,将会从节点1的队列1中拉取消息进行消费。

7. 集群节点类型

磁盘节点

将配置信息和元信息存储在磁盘上(单节点系统必须是磁盘节点,否则每次重启RabbitMQ之后所有的系统配置信息都会丢失)。

内存节点

将配置信息和元信息存储在内存中。性能是优于磁盘节点的。

RabbitMQ要求集群中至少有一个磁盘节点,当节点加入和离开集群时,必须通知磁盘节点(如果集群中唯一的磁盘节点崩溃了,则不能进行创建队列、创建交换器、创建绑定、添加用户、更改权限、添加和删除集群节点)。总之如果唯一磁盘的磁盘节点崩溃,集群是可以保持运行的,但不能更改任何东西。因此建议在集群中设置两个磁盘节点,只要一个可以,就能正常操作。

8. 总结

普通集群模式,并不保证队列的高可用性。尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启。所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。

二、RabbitMQ镜像队列原理

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以还是得先配置普通集群,然后才能设置镜像队列。镜像队列存在于多个节点。要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

2.1. 镜像队列的结构

在这里插入图片描述镜像队列基本上就是一个特殊的BackingQueue,它内部包裹了一个普通的BackingQueue做本地消息持久化处理,在此基础上增加了将消息和ack复制到所有镜像的功能。所有对mirror_queue_master的操作,会通过可靠组播GM的方式同步到各slave节点。GM负责消息的广播,mirror_queue_slave负责回调处理,而master上的回调处理是由coordinator负责完成。mirror_queue_slave中包含了普通的BackingQueue进行消息的存储,master节点中BackingQueue包含在mirror_queue_master中由AMQQueue进行调用。

消息的发布(除了Basic.Publish之外)与消费都是通过master节点完成。master节点对消息进行处理的同时将消息的处理动作通过GM广播给所有的slave节点,slave节点的GM收到消息后,通过回调交由mirror_queue_slave进行实际的处理。

对于Basic.Publish,消息同时发送到master和所有slave上,如果此时master宕掉了,消息还发送slave上,这样当slave提升为master的时候消息也不会丢失。

2.2. GM(Guarenteed Multicast)

GM模块实现的一种可靠的组播通讯协议,该协议能够保证组播消息的原子性,即保证组中活着的节点要么都收到消息要么都收不到。

它的实现大致如下:

将所有的节点形成一个循环链表,每个节点都会监控位于自己左右两边的节点,当有节点新增时,相邻的节点保证当前广播的消息会复制到新的节点上;当有节点失效时,相邻的节点会接管保证本次广播的消息会复制到所有的节点。在master节点和slave节点上的这些gm形成一个group,group(gm_group)的信息会记录在mnesia中。不同的镜像队列形成不同的group。消息从master节点对于的gm发出后,顺着链表依次传送到所有的节点,由于所有节点组成一个循环链表,master节点对应的gm最终会收到自己发送的消息,这个时候master节点就知道消息已经复制到所有的slave节点了。

2.3. 新增节点

新节点的加入过程如下图所示:
在这里插入图片描述每当一个节点加入或者重新加入(例如从网络分区中恢复过来)镜像队列,之前保存的队列内容会被清空。

2.4. 节点的失效

如果某个slave失效了,系统处理做些记录外几乎啥都不做。master依旧是master,客户端不需要采取任何行动,或者被通知slave失效。 如果master失效了,那么slave中的一个必须被选中为master。被选中作为新的master的slave通常是最老的那个,因为最老的slave与前任master之间的同步状态应该是最好的。然而,需要注意的是,如果存在没有任何一个slave与master完全同步的情况,那么前任master中未被同步的消息将会丢失。

2.5. 消息的同步

将新节点加入已存在的镜像队列是,默认情况下ha-sync-mode=manual,镜像队列中的消息不会主动同步到新节点,除非显式调用同步命令。当调用同步命令后,队列开始阻塞,无法对其进行操作,直到同步完毕。

当ha-sync-mode=automatic时,新加入节点时会默认同步已知的镜像队列。由于同步过程的限制,所以不建议在生产的消费队列中操作。

2.6. 总结

镜像节点在集群中的其他节点拥有从队列拷贝,一旦主节点不可用,最老的从队列将被选举为新的主队列。但镜像队列不能作为负载均衡使用,因为每个操作在所有节点都要做一遍。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云物联网平台体验(树莓派+Python篇)

阿里云物联网平台体验(树莓派Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张&#x…

阿里云物联网边缘计算加载MQTT驱动

写在前面 本文在LinkEdge快速入门样例驱动的基础上,加载了MQTT订阅的客户端,使得边缘端容器可以通过MQTT获得外部数据。 1. 系统需求 物联网边缘计算平台,又名Link IoT Edge[1]。在物联网边缘计算帮助文档中的 “快速入门”描述了…

完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本

2018 年“双 11”的交易额又达到了一个历史新高度 2135 亿。相比十年前,我们的交易额增长了 360 多倍,而交易峰值增长了 1200 多倍。相对应的,系统数呈现爆发式增长。系统在支撑“双 11”过程中的复杂度和难度呈现指数级形式上升趋势。 作为…

重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 11 月 29 日,CNCF containerd 社区正式宣布:两位阿里巴巴工程师正式获得 containerd 社区席位,成为 containerd 社区 Reviewer,未…

RabbitMQ管控台操作手册

文章目录一、MQ管控台配置1.1. 修改guest用户的默认密码1.2. 创建Virtual Hosts1.3. 创建用户1.4. 给Virtual Hosts指定用户1.5. 给Virtual Hosts创建监控用户1.6. 给Virtual Hosts指定监控用户二、 验证2.1.给proj-01项目配置mq连接信息2.2.为proj-01项目声明队列和交换机2.3.…

只有程序员才能读懂的三国演义(一)

戳蓝字“CSDN云计算”关注我们哦!作者 | popsuper1982责编|阿秃这是通过三国演义串起操作系统的原理。第一回:宴桃园豪杰三结义,开放平台启动内核话说天下大势,分久必合,合久必分。IT江湖起起伏伏&#xff…

基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产品放到相邻货架销售的时候&a…

python三菱_三菱机器人melfarxm.ocx控件的Python使用,MelfaRxMOCX,python,用法

1. 安装控件 \MelfaRXM\MelfaRXM_Dev\Redist\Installer2. 在WINDOWS/System32里找到MelfaRxM.ocx3.把OCX控件转成C#的DLLa.打vs的开发人员命令行b.把刚刚的OCX放到命令行显示的目录c.在命令输入 : aximp MelfaRxM.ocx生成的DLL就是pythonnet可用调用的DLL的4.p…

如何基于阿里云搭建适合初创企业的轻量级架构?

----基于阿里云搭建的适合初创企业的轻量级架构 前言 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变、快速部署、持续集成并可以适应多种情况的架构便显得尤为重要。本文主要介绍基于阿…

年底了,程序员如何谈加薪?

前两天,我和朋友一块出去吃饭,他说了一个哭笑不得的事儿:“我面了一个2年经验的男孩,张嘴就要20k,我去了,我在公司呆了7年啊,才22k好吗?” 其实,他的问题并不是特例&…

数据库中间件介绍

文章目录 什么是数据库中间件?Smart-client 模式优点缺点 Proxy 模式优点缺点 单元化架构优点缺点 总结 数据库中间件是连接数据库和应用程序之间的软件层,用于简化数据库管理、提高性能和可伸缩性,同时提供额外的功能和服务。在分布式系统和…

基于阿里云物联网平台,我们这样实现简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入口人员出入时,自动拍照并上送钉钉群机器…

RabbitMQ消息流转图

生产者生产消息,发送到MQ的交换机(exchange)上,交换机可以绑定多个队列(Message Queue)。这个图中有3个队列,只有一个队列收到了消息,这是因为咱们的交换机是有路由策略的,这个路由就是Routerke…

结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景: 数据库连接信息限流阈值和降级开关流量的动态调度上一篇:Nacos帮我解决了什么问题? 数据库连接信息 曾经有朋友跟我聊过…

哈工大人工智能研究院院长刘劼:AIoT 核心在“智”不在“联”,需云边端协同...

受访者 | 刘劼采访者 | 伍杏玲出品 | CSDN(ID:CSDNnews)物联网是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展。近几年来,物联网发展迅速:据研究机构IDC公司预测,到2020年,物联…

RabbitMQ 管控台配置导入导出和重要性

背景:rabbitmq100个节点,做迁移,现在linux6环境,想升级到linux7版本,然后把rabbitmq部署到linux7版本上 怎么去做呢? 不可能把rabbitmq重新构建好,再把对应的交换机、绑定、配置重新设置一遍&am…

使用Spring整合Quartz轻松完成定时任务

文章目录1. 必不可少jar包依赖2. 编写任务调度类013. 编写任务调度类024. quartz配置文件5. 测试service6. 效果图开发环境版本jdk1.8Maven3.6.1springSpring 4.2.6.RELEASEIdea2019 1. 必不可少jar包依赖 <dependency><groupId>org.springframework</groupId&g…

太真实了:程序员等级图鉴

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 肥又君责编&#xff5c;阿秃程序员是一个非常神奇的工种&#xff0c;他们对技术有特殊的崇拜&#xff0c;有着严格的等级划分&#xff0c;不同级别的程序员有什么不同之处呢&#xff1f;Let us 瞅瞅 &#xff5e;日常工作日常…

windows故障转移群集和mysql_Windows 2016 无域故障转移群集部署方法 超详细图文教程...

故障转移群集是一个很实用的功能,而windows在2016版本开始,终于支持不用域做故障转移群集.在群集中,我们可以设定一个"群集IP"而客户端只需要根据这个"群集IP"就能连接当前群集的主服务器.而不必关心群集服务器之间的替换.而更棒的是,它是"去中心&quo…

Dubbo下一站:Apache顶级项目

近日&#xff0c;在Apache Dubbo开发者沙龙杭州站的活动中&#xff0c;阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。 Dubbo 2.7 将围绕 异步支持优化、元数据改造&#xff0c;引入JDK8的特性、Net…