你不知道的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-managementdocker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-managementdocker 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 rabbit@rabbit1
rabbitmqctl start_app
exit

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

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

docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster –ram rabbit@rabbit1
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

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

你不知道的RabbitMQ集群架构全解相关推荐

  1. 5 高可靠,构建RabbitMQ集群架构

    5 高可靠,构建RabbitMQ集群架构 本章为大家讲解RabbitMQ集群架构的各种姿势,以及从零到一带大家构建高可靠性的RabbitMQ集群架构(Haproxy + Keepalived),并分享 ...

  2. RabbitMQ集群故障恢复详解

    RabbitMQ的mirror queue(镜像队列)机制是最简单的队列HA(High Available高可用)方案, 它通过在cluster的基础上增加ha-mode.ha-param等polic ...

  3. RabbitMQ 构建高可靠集群架构

    主备模式和主从模式的区别? 主备模式:主节点读写,从节点读写都不可,作为备胎,启动切换,主备相互转换,主节点可能变成从节点,从节点有一天会变成主节点,有点备胎的意思.一主多备. 主从模式:主节点读写, ...

  4. rabbitmq集群安装与配置(故障恢复)

    0.首先按照http://www.cnblogs.com/zhjh256/p/5922562.html在至少两个节点安装好(不建议单机,没什么意义) 1.先了解rabbitmq集群架构,http:// ...

  5. RabbitMQ集群和失败处理

    RabbitMQ内建集群的设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点在奔溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信的吞吐量.当失去一个RabbitMQ节点时客户端 ...

  6. RabbitMQ集群环境搭建

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

  7. RabbitMQ普通集群、镜像集群、集群负载均衡、压力测试、选举策略及测试、集群故障恢复【集群超大全详解】

    前言 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希 ...

  8. Redis基础与高可用集群架构进阶详解

    一.NoSQL简介 1.问题引入 每年到了过年期间,大家都会自觉自发的组织一场活动,叫做春运!以前我们买票都是到火车站排队,后来呢,有了 12306,有了它以后就更方便了,我们可以在网上买票,但是带来 ...

  9. 消息队列专题(架构篇):RabbitMQ 的集群架构模式

    RabbitMQ 的集群架构模式主要有四种,分别是主备模式.远程模式.多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍. 主备模式 主备模式是指 ...

最新文章

  1. android webview rem,Android部分webview rem计算误差记录
  2. git与svn的区别 ?Git 与 SVN那个更好?
  3. python pexpect pxssh scp_Python 的 pexpect 使用 scp 把文本文件传一半就不传了,怎么办?...
  4. 【操作系统】同步和互斥
  5. Facebook发布神经蛋分离法,可从嘈杂环境中提取音视频
  6. 内核 BUG_ON 以及WARN_ON 用法作用
  7. (a++) + (++a)
  8. 联通与阿里云、腾讯云合作 引发“云震荡”
  9. 矩阵旋转(翻转)刷题总结
  10. 华硕笔记本全硬盘恢复原厂状态 实机操作,MYASUS IN WINRE恢复,ASUS RECOVERY恢复
  11. DiI(细胞膜红色荧光探针)被广泛应用于神经等细胞或组织的示踪剂或长期示踪剂
  12. layui 输入框添加自定义图标
  13. 微博尾巴不加android,! android应用——装逼神器《微博尾》
  14. JZSearch精准全文搜索引擎共享开发包 v4.5 u20121108
  15. SQL SERVER 递归查询(4)——递归层级查询
  16. MySQL中MAX函数如何使用?
  17. Razer Phone TWRP 适配编译心得
  18. ARP协议和三次握手
  19. 浙江义乌航空口岸进入全货机时代
  20. Pytorch-IndexError: too many indices for tensor of dimension 0

热门文章

  1. Linux添加新硬盘-挂载硬盘,设置开机自动挂载 解决/home 空间不足问题
  2. redis核心技术与实战(四)高可用高扩展篇
  3. 应用开发框架之——根据数据表中的存储的方法名称来调用方法
  4. Python语法特点如注释规则、代码缩进、编码规范等
  5. Phoenix:全局索引设计实践
  6. MDK C++中对内联的极度优化
  7. mysql 包含的那些文件
  8. [译]机器人操作系统简介:终极机器人应用框架(上)
  9. 【C++入门】简单的日期类操作
  10. ProFTPD 初探