Rabbitmq集群之镜像队列

镜像集群模式是在RabbitMQ Cluster默认集群的基础上添加策略搭建完成的

RabbitMQ默认集群模式,并不包管队列的高可用性,尽管队列信息,交换机、绑定这些可以复制到集群里的任何一个节点,然则队列内容不会复制,固然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能守候重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,须要创建镜像队列。
跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。

镜像集群策略的设置:

HA mode 同步方式

One of all (mirror to all nodes in the cluster), exactly (mirror to a set number of nodes) or nodes (mirror to an explicit list of nodes). If you choose one of the latter two, you must also set ha-params.
HA mode的值共有三个

  • .all:镜像同步到集群队列的所有节点
  • .exactly:按个数同步到集群中的一个或多个节点
  • . nodes:具体的节点名称
    如果选择后面两个选项的的值,还需要设置ha-params参数。
Ha async mode同步方式

这个需要详细说明的,默认的情况下。当节点断线后那么这个节点就已经是落后的版本,当我们再去启动节点的时候数据我们需要去手动的同步,这自然是不好的,做到自动化是最完美的,所以设置成automatic是最佳选择

新建策略policy2,ha-mode: all 镜像到集群中所有的节点
Pattern: ^que1
Apply to :queues
ha-mode: all//应用于所有节点
ha-sync-mode:automatic
Priority 0


Rabbitmq集群之镜像队列_第1张图片
policy2

policy2应用效果
que1节点后的+2表示镜像到2个节点,因为ha-mode:all,共有集群共有三个节点,+2表示将队列镜像到另外两个节点


Rabbitmq集群之镜像队列_第2张图片
policy2应用效果

新建策略policy3,ha-mode:nodes镜像到到集群中指定节点
Pattern: ^que2
Apply to :queues
Definition
ha-mode: nodes
ha-params: rabbit@rabbit2
rabbit@rabbit1
ha-sync-mode: automatic
Priority 0

Rabbitmq集群之镜像队列_第3张图片
image.png

Rabbitmq集群之镜像队列_第4张图片
policy3应用效果
测试条件一

集群任意节点不宕机的情况下测试消息接收。
往节点rabbit@rabbit1的que1队列上发送数据,因为镜像集群建立在默认集群的基础上,所以节点间共享que1队列


Rabbitmq集群之镜像队列_第5张图片
image.png
Rabbitmq集群之镜像队列_第6张图片
image.png

这时通过连接rabbit@rabbit3消费que1信息


Rabbitmq集群之镜像队列_第7张图片
image.png

再通过连接rabbit@rabbit1消费que1信息


Rabbitmq集群之镜像队列_第8张图片
image.png

可见rabbit@rabbit1并没有接受到消息,说明que1队列上的消息已经消费完了,虽然队列que1在接受到消息时,会在其他节点创建消息镜像备份,但只要从集群中任意节点成功消费掉que1队列所有的消息,que1的镜像备份会清空掉。
测试条件二

往节点rabbit@rabbit1的que1队列上发送数据,因为镜像集群建立在默认集群的基础上,所以节点间共享que1队列


Rabbitmq集群之镜像队列_第9张图片
image.png

Rabbitmq集群之镜像队列_第10张图片
image.png

在队列que1消息未被消费时,把节点rabbit@rabbit1停掉,类似宕机的效果。


Rabbitmq集群之镜像队列_第11张图片
image.png

Rabbitmq集群之镜像队列_第12张图片
image.png

Rabbitmq集群之镜像队列_第13张图片
image.png

连接其他节点,消息照样可以成功接收

测试条件三

把对列que1的主节点rabbit@rabbit2停掉


Rabbitmq集群之镜像队列_第14张图片
image.png
root@rabbit2:/# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit2 ...

集群会为que1再安排一个主节点


Rabbitmq集群之镜像队列_第15张图片
image.png
测试条件四

用节点3接受队列que1消息的中途,断开节点3
这时节点3未成功消费的的消息,会继续保存在节点2的que1上并会镜像到节点1

Rabbitmq集群之镜像队列_第16张图片
image.png

当节点3成功恢复后,集群仍然会把que1未消费的信息镜像到节点3上
因为镜像策略的Ha async mode为automatic
Rabbitmq集群之镜像队列_第17张图片
image.png

Rabbitmq集群之镜像队列_第18张图片
image.png

参考文章
消息中间件面试题:消息中间件的高可用
RabbitMQ镜像队列实现原理

你可能感兴趣的:(Rabbitmq集群之镜像队列)