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

RabbitMQ系列文章

  1. RabbitMQ在Ubuntu上的环境搭建
  2. 深入了解RabbitMQ工作原理及简单使用
  3. RabbitMQ交换器Exchange介绍与实践
  4. RabbitMQ事务和Confirm发送方消息确认——深入解读
  5. 使用Docker部署RabbitMQ集群
  6. 你不知道的RabbitMQ集群架构全解

前言

本文将系统的介绍一下RabbitMQ集群架构的特点、异常处理、搭建和使用中要注意的一些细节。

知识点

一、为什么使用集群?

二、集群的特点

三、集群异常处理

四、集群节点类型

五、集群搭建方法

六、镜像队列

一、为什么使用集群?

内建集群作为RabbitMQ最优秀的功能之一,它的作用有两个:

  1. 允许消费者和生产者在Rabbit节点崩溃的情况下继续运行;
  2. 通过增加节点来扩展Rabbit处理更多的消息,承载更多的业务量;

二、集群的特点

RabbitMQ的集群是由多个节点组成的,但我们发现不是每个节点都有所有队列的完全拷贝。

RabbitMQ节点不完全拷贝特性

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

有两个原因:

  1. 存储空间——如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据。
  2. 性能——如果消息的发布需安全拷贝到每一个集群节点,那么新增节点对网络和磁盘负载都会有增加,这样违背了建立集群的初衷,新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。

所以其他非所有者节点只知道队列的元数据,和指向该队列节点的指针。

三、集群异常处理

根据节点不无安全拷贝的特性,当集群节点崩溃时,该节点队列和关联的绑定就都丢失了,附加在该队列的消费者丢失了其订阅的信息,那么怎么处理这个问题呢?

这个问题要分为两种情况:

  1. 消息已经进行了持久化,那么当节点恢复,消息也恢复了;
  2. 消息未持久化,可以使用下文要介绍的双活冗余队列,镜像队列保证消息的可靠性;

四、集群节点类型

节点的存储类型分为两种:

  • 磁盘节点
  • 内存节点

磁盘节点就是配置信息和元信息存储在磁盘上,内次节点把这些信息存储在内存中,当然内次节点的性能是大大超越磁盘节点的。

单节点系统必须是磁盘节点,否则每次你重启RabbitMQ之后所有的系统配置信息都会丢失。

RabbitMQ要求集群中至少有一个磁盘节点,当节点加入和离开集群时,必须通知磁盘节点。

特殊异常:集群中唯一的磁盘节点崩溃了

如果集群中的唯一一个磁盘节点,结果这个磁盘节点还崩溃了,那会发生什么情况?

如果唯一磁盘的磁盘节点崩溃了,不能进行如下操作:

  • 不能创建队列
  • 不能创建交换器
  • 不能创建绑定
  • 不能添加用户
  • 不能更改权限
  • 不能添加和删除集群几点

总结:如果唯一磁盘的磁盘节点崩溃,集群是可以保持运行的,但你不能更改任何东西。

解决方案:在集群中设置两个磁盘节点,只要一个可以,你就能正常操作。

五、集群搭建方法

本章我们用Docker来创建RabbitMQ集群,一来是因为操作简便,二是因为可以更充分的利用服务器硬件资源,三来是Docker也是现在的主流部署方案,关于更多的Docker详情可以查看我的另一篇:《使用Docker部署RabbitMQ集群)》 接下来,进入我们的正文,集群搭建分为两步:

  • 步骤一:安装多个RabbitMQ
  • 步骤二:加入RabbitMQ节点到集群

步骤一:安装多个RabbitMQ

docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management

docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management

docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management

具体的参数含义,参见上文“启动RabbitMQ”部分。

注意点:

  1. 多个容器之间使用“--link”连接,此属性不能少;
  2. Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同,原因见下文“配置相同Erlang Cookie”部分;

步骤二:加入RabbitMQ节点到集群

设置节点1:

docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

设置节点2,加入到集群:

docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram [email protected]
rabbitmqctl start_app
exit

参数“--ram”表示设置为内存节点,忽略次参数默认为磁盘节点。

设置节点3,加入到集群:

docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram [email protected]
rabbitmqctl start_app
exit

设置好之后,使用http://物理机ip:15672 进行访问了,默认账号密码是guest/guest,效果如下图:

到此为止,我们已经完成了RabbitMQ集群的建立,启动了3个节点,1个磁盘节点和2个内存节点。

设置节点类型

如果你想更换节点类型可以通过命令修改,如下:

rabbitmqctl stop_app

rabbitmqctl change_cluster_node_type dist

rabbitmqctl change_cluster_node_type ram

rabbitmqctl start_app

移除节点

如果想要把节点从集群中移除,可使用如下命令实现:

rabbitmqctl stop_app

rabbitmqctl restart

rabbitmqctl start_app

集群重启顺序

集群重启的顺序是固定的,并且是相反的。如下所述:

  • 启动顺序:磁盘节点 => 内存节点
  • 关闭顺序:内存节点 => 磁盘节点

最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。

六、镜像队列

镜像队列是Rabbit2.6.0版本带来的一个新功能,允许内建双活冗余选项,与普通队列不同,镜像节点在集群中的其他节点拥有从队列拷贝,一旦主节点不可用,最老的从队列将被选举为新的主队列。

镜像队列的工作原理:在某种程度上你可以将镜像队列视为,拥有一个隐藏的fanout交换器,它指示者信道将消息分发到从队列上。

设置镜像队列

设置镜像队列命令:“rabbitmqctl set_policy 名称 匹配模式(正则) 镜像定义”, 例如,设置名称为mypolicy的镜像队列,匹配所有名称是amp开头的队列都存储在2个节点上的命令如下:

rabbitmqctl set_policy mypolicy "^amp*" ‘{"ha-mode":"exactly","ha-params":2}‘

可以看出设置镜像队列,一共有三个参数,每个参数用空格分割

  1. 参数一:名称,可以随便填;
  2. 参数二:队列名称的匹配规则,使用正则表达式表示;
  3. 参数三:为镜像队列的主体规则,是json字符串,分为三个属性:ha-mode | ha-params | ha-sync-mode,分别的解释如下:
  • ha-mode:镜像模式,分类:all/exactly/nodes,all存储在所有节点;exactly存储x个节点,节点的个数由ha-params指定;nodes指定存储的节点上名称,通过ha-params指定;
  • ha-params:作为参数,为ha-mode的补充;
  • ha-sync-mode:镜像消息同步方式:automatic(自动),manually(手动);

设置好镜像队列存储2个节点的效果如下图:

查看镜像队列

rabbitmqctl list_policies

删除镜像队列

rabbitmqctl clear_policy

参考资料

书籍:《RabbitMQ实战-高效部署分布式消息队列》——不建议程序猿购买,偏运维
https://www.cnblogs.com/luo-mao/p/5909889.html
https://www.jianshu.com/p/85543491ab00

长按二维码,关注更多作者动态

原文地址:https://www.cnblogs.com/vipstone/p/9368106.html

时间: 2024-11-03 03:42:57

你不知道的RabbitMQ集群架构全解的相关文章

RabbitMQ集群架构(HA)并结合.NET Core实操

原文:RabbitMQ集群架构(HA)并结合.NET Core实操 一.前言 已经一年没有更新博客了,由于公司事务比较多,并且楼主我也积极在公司项目中不断实践.net core.DDD以及Abp vnext,也积累了一些吐血经验,目前我在做一家在线教育公司负责智慧校园业务,所涉及到的数据一天达上百万,并且还需要对这些并发数据进行解析转化,在此次的过程中也涉及到了使用RabbitMQ进行业务的解耦和流量削峰来应对如此大量的请求:过程是痛苦的,但结果是美好的. 说到MQ,大家应该都听过,像Rabbi

高可用集群架构详解(基于corosync)

架构图 Messaging and Infrastructure Layer 第一层是messaging/infrastructure层,也就是Corosync/OpenAIS层.通过这一层发送"我还活着"的信号. Resource Allocation Layer 第二层是resource allocation layer.这一层最为复杂,包含以下组件: ClusterResource Manager (CRM) 在资源分配层,每一个动作的执行都要经过CRM.资源分配层上的其它组件(

rabbitmq集群故障恢复详解

RabbitMQ的mirror queue(镜像队列)机制是最简单的队列HA方案,它通过在cluster的基础上增加ha-mode.ha-param等policy选项,可以根据 需求将cluster中的队列镜像到多个节点上,从而实现高可用,消除cluster模式中队列内容单点带来的风险. 在使用镜像队列之前,有几点注意事项必须熟记于心(下文中将混用主节点和master,从节点和slave): 1. 镜像队列不能作为负载均衡使用,因为每个操作在所有节点都要做一遍. 2. ha-mode参数和dur

rabbitmq系统学习(三)集群架构

RabbitMQ集群架构模式 主备模式 实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单.主备模式也称为Warren模式 HaProxy配置 listen rabbitmq_cluster bind 0.0.0.0:5672 # 配置TCP模式 mode tcp #简单的轮询 balance roundrobin #主节点 server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 3 ser

RabbitMQ集群和失败处理

RabbitMQ内建集群的设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点在奔溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信的吞吐量.当失去一个RabbitMQ节点时客户端能够连接集群中的任何其他节点并继续生产或者消费消息.同样,如果RabbitMQ集群正疲于应对庞大的消息通信量,可以通过添加更过的节点线性增加性能. RabbitMQ集群不会保证消息的万无一失:因为RabbitMQ默认不会将队列的内容复制到整个集群上.如果不进行特殊的配置,这些消息仅存在队列所属的那个

rabbitmq集群第三篇--优化之我见

rabbitmq之优化畅谈 在本文中主要讲一下RabbitMQ集群的一些优化,因为近期公司业务系统因为连接不上MQ集群出现了很多问题,本文主要总结一些解决的方案: 1. RabbitMQ集群的架构: ??我们公司的RabbitMQ集群架构是我设计和实施的,当时也是参考了很多互联网上的架构文档:2台LVS服务器,3台MQ服务器.2台是内存节点,一台是磁盘节点:LVS服务器又通过keepalived实现了主从.VIP地址在主服务器上面,LVS负责分发客户端请求,通过Round-Robin轮训策略来负

RabbitMQ分布式集群架构

RabbitMQ分布式集群架构和高可用性(HA) https://blog.csdn.net/woogeyu/article/details/51119101 (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配置方式 RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel cluster: 不支持跨网段,用于同一个网段内的局域网 可以随意的

高可用RabbitMQ集群安装配置

RabbitMQ集群安装配置+HAproxy+Keepalived高可用 rabbitmq 集群 消息队列 RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主

RABBITMQ集群及HA、LB

一.Rabbitmq简介 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP.STOMP等,支持AJAX.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗. AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间