一、RabbitMQ集群方案的原理

RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。

因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。下面先来看下RabbitMQ集群的整体方案:

上面图中采用三个节点组成了一个RabbitMQ的集群,Exchange A(交换器,对于RabbitMQ基础概念不太明白的童鞋可以看下基础概念)的元数据信息在所有节点上是一致的,而Queue(存放消息的队列)的完整数据则只会存在于它所创建的那个节点上。,其他节点只知道这个queue的metadata信息和一个指向queue的owner node的指针。

(1)RabbitMQ集群元数据的同步

RabbitMQ集群会始终同步四种类型的内部元数据(类似索引): a.队列元数据:队列名称和它的属性; b.交换器元数据:交换器名称、类型和属性; c.绑定元数据:一张简单的表格展示了如何将消息路由到队列; d.vhost元数据:为vhost内的队列、交换器和绑定提供命名空间和安全属性; 因此,当用户访问其中任何一个RabbitMQ节点时,通过rabbitmqctl查询到的queue/user/exchange/vhost等信息都是相同的。

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

我想肯定有不少同学会问,想要实现HA方案,那将RabbitMQ集群中的所有Queue的完整数据在所有节点上都保存一份不就可以了么?(可以类似MySQL的主主模式嘛)这样子,任何一个节点出现故障或者宕机不可用时,那么使用者的客户端只要能连接至其他节点能够照常完成消息的发布和订阅嘛。

我想RabbitMQ的作者这么设计主要还是基于集群本身的性能和存储空间上来考虑。

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

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

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

RabbitMQ集群的工作原理图如下:

场景1:客户端直接连接队列所在节点

如果有一个消息生产者或者消息消费者通过amqp-client的客户端连接至节点1进行消息的发布或者订阅,那么此时的集群中的消息收发只与节点1相关,这个没有任何问题;如果客户端相连的是节点2或者节点3(队列1数据不在该节点上),那么情况又会是怎么样呢?

场景2:客户端连接的是非队列数据所在节点

如果消息生产者所连接的是节点2或者节点3,此时队列1的完整数据不在该两个节点上,那么在发送消息过程中这两个节点主要起了一个路由转发作用,根据这两个节点上的元数据(也就是上文提到的:指向queue的owner node的指针)转发至节点1上,最终发送的消息还是会存储至节点1的队列1上。

同样,如果消息消费者所连接的节点2或者节点3,那这两个节点也会作为路由节点起到转发作用,将会从节点1的队列1中拉取消息进行消费。

一、RabbitMQ集群完善

可以根据这个架构图,做一些RabbitMQ集群完善,主要是将内存节点作为负载,磁盘节点作为存储。

更改集群节点类型:

# rabbitmqctl stop_app# rabbitmqctl change_cluster_node_type ram
# rabbitmqctl change_cluster_node_type disc# rabbitmqctl start_app# rabbitmqctl cluster_status

如果出现错误:

Error: unable to connect to node rabbit@manager1: nodedown

解决方式:

# /sbin/service rabbitmq-server stop
# /sbin/service rabbitmq-server start
# rabbitmqctl status

如果要将节点移除集群,则在本节点上执行:

# rabbitmqctl stop_app &&
rabbitmqctl reset &&
rabbitmqctl start_app

然后在主节点执行:

# rabbitmqctl forget_cluster_node rabbit@manager3

节点加入集群命令:

# rabbitmqctl join_cluster rabbit@manager3 --ram
# rabbitmqctl join_cluster rabbit@manager3 --disc

参考资料:

  • 消息中间件—RabbitMQ(集群原理与搭建篇)(推荐
  • RabbitMQ两种集群模式配置管理(五)
  • http://blog.51cto.com/zengestudy/1885054
  • http://www.cnblogs.com/Richard-xie/p/4201994.html

RabbitMQ 集群原理和完善相关推荐

  1. RabbitMQ—集群原理

    RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现).因此,RabbitMQ天然支持集群,但不支持负载均衡 ...

  2. RabbitMQ集群原理介绍

    文章目录 一.RabbitMQ默认集群原理 1. RabbitMQ集群元数据的同步 2. 为何RabbitMQ集群仅采用元数据同步的方式 3. RabbitMQ集群发送/订阅消息的基本原理 4. 客户 ...

  3. RabbitMQ——RabbitMQ集群原理

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

  4. 消息中间件—RabbitMQ(集群原理与搭建篇)

    一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性.并发性.吞吐量和消息堆积能力等问题的考虑,在生产 ...

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

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

  6. Docker:搭建RabbitMQ集群

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

  7. kafka集群原理介绍

    kafka集群原理介绍 @(KAFKA)[kafka, 大数据] kafka集群原理介绍 一基础理论 二配置文件 一java调优 二参数说明 三错误处理 四zookeeper中的内容 1brokers ...

  8. Rabbitmq集群高可用部署详细

    清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣.无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下所有努 ...

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

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

  10. rabbitmq集群部署及配置

    rabbitmq集群部署及配置 文章目录 rabbitmq集群部署及配置 前言 一.原理介绍 二.部署方案 1.环境介绍 2.部署过程 小结 前言 消息中间件rabbitmq,一般以集群方式部署,主要 ...

最新文章

  1. SAP MM 标准的采购订单预付款功能介绍
  2. php对提交数据的验证
  3. Can not issue data manipulation statements with executeQuery()错误解决
  4. 如何检测本计算机耗电量,如何查看电脑耗电量?鲁大师查看电脑使用功率的方法...
  5. 滴滴否认柳青计划卸任:目前正积极全面配合网络安全审查
  6. linux鼠标驱动程序,Linux usb子系统(一) _写一个usb鼠标驱动
  7. uni - 使用npm
  8. distcp用于集群中数据传输解读
  9. Git提交代码相关命令
  10. java蓝字代表什么_蓝是什么意思 蓝字五行属什么
  11. BUUCTF:FLAG
  12. 后氧传感器正常数据_老司机,教你看,氧传感器数据流分析!赶紧搜藏吧!
  13. 【Ubuntu系统下百度Apollo7.0与LGSVL2021.3联合教程(亲测有效)】
  14. SQL实际问题——列的替换和汇率打折问题
  15. 多个迹象表明,瑞幸咖啡已进入新的发展阶段
  16. 《增强现实:原理、算法与应用》读书笔记(5)运动恢复结构(上)初始化、相机位姿估计、集束调整
  17. Find和exec命令
  18. 人体红外传感器HC-SR501
  19. linux IO引脚唤醒深度休眠,驱动修改步骤
  20. 萌新PYTHON学习01

热门文章

  1. Atitit attilax涉及到的大数据 数据分析 数据挖掘 ai人工智能的处理技术 目录 1.1. 大数据 机器视觉 图像处理 数据分析 数据挖掘 知识图谱 ai人工智能方面系列项目 1 2.
  2. Atitit.iso格式蓝光 BDMV 结构说明
  3. paip.python错误解决17
  4. paip.调用GUI接口.
  5. paip.xdebug 配置attilax总结.txt
  6. Rust : stevenbai.top学习站点
  7. 全球十大数据治理解决方案提供商
  8. mysql select trim_mysql trim函数用法举例
  9. 毕设题目:Matlab优化充电
  10. 【路径规划】基于matlab A_star算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1388期】