RabbitMQ镜像队列原理分析

时间:2021-02-25 12:17:01   收藏:0   阅读:0

1. 创建镜像队列模式

注意,到此步骤,我们假设是你已经创建好了RabbitMQ集群。

1.1 增加镜像队列的Policy

打开你的RabbitMQ管理首页,在Admin->Policy链接下开始创建Policy:
技术图片

1.2 代码声明交换机、队列、绑定等

技术图片

1.3 查看镜像队列是否声明成功

查看你刚声明的队列的详情:
技术图片

可以看到,ha-mode、node、salve等属性都已经创建成功。

2. 镜像队列说明

2.1 关于node节点

queue有master节点和slave节点。 要强调的是,在RabbitMQ中master和slave是针对一个queue而言的,而不是一个node作为所有queue的master,其它node作为slave。一个queue第一次创建的node为它的master节点,其它node为slave节点。

2.2 镜像队列服务提供方式

技术图片
如上图所示,在镜像队列集群模式中,对某个queue来说,只有master对外提供服务,而其他slave只提供备份服务,在master所在节点不可用时,选出一个slave作为新的master继续对外提供服务。

无论客户端的请求打到master还是slave最终数据都是从master节点获取。当请求打到master节点时,master节点直接将消息返回给client,同时master节点会通过GM(Guaranteed Multicast)协议将queue的最新状态广播到slave节点。GM保证了广播消息的原子性,即要么都更新要么都不更新。

当请求打到slave节点时,slave节点需要将请求先重定向到master节点,master节点将将消息返回给client,同时master节点会通过GM协议将queue的最新状态广播到slave节点。

所以,多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。

2.3 RabbitMQ集群处理新增节点

如果有新节点加入,RabbitMQ不会同步之前的历史数据,新节点只会复制该节点加入到集群之后新增的消息。
既然master节点退出集群会选一个slave作为master,那么如果不幸选中了一个刚刚加入集群的节点怎么办?那消息不就丢了吗?这里您可以把心放到肚子里,RabbitMQ集群内部会维护节点的状态是否已经同步,使用rabbitmqctl的synchronised_slave_pids参数,就可以查看状态。如果slave_pids和synchronised_slave_pids里面的节点是一致的,那说明全都同步了;如果不一致很容易比较出来哪些还没有同步,集群只会在“最老”的slave节点之间选一个出来作为新的master节点。另外对于node节点的重启也是按照新节点来处理的。

2.4 镜像队列注意点

2.5 镜像队列的故障恢复

假设两个节点(A和B)组成一个镜像队列。

以上内容就是RabbitMQ镜像队列原理分析的全部内容了,谢谢你阅读到了这里!

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!