RabbitMQ集群出现网络分区,可能会丢数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ集群出现网络分区,可能会丢数据相关的知识,希望对你有一定的参考价值。

参考技术A 发现以下这种情况出现时,无法避免消息丢失。

由于希望高可用,集群队列一般都设置为持久化、lazy、镜像队列

假设RMQ集群有5个节点:node[1:5]

假设队列  q  为一主一从,队列进程分别在 node1、node3节点。

分区前:

假设队列  q 的master、slave进程所在节点: node1和 node3  与  node2, node4, node5  之间的网络中断了,此时

此刻两者之间的网络通信并未恢复。这种中间状态很有可能导致数据丢失,分析如下:

之前打到 node1, node3 上的生产者连接 producer client #1,可以正常继续向队列 q 上发消息。

而打到 node2, node4, node5 上的生产者连接 producer client #2,无法感知到队列q不处在当前小块集团节点中( 集团中没有队列q进程 )。Queue不同于Exchange、Bindings,队列进程只存在于其master和slaves节点中。而此时生产者即使使用了confirm、returnListener等机制,消息还是到达不了目标队列q(尤其是上游通过exchange发送,下面挂了多个队列), 但发送方依然可以收到服务器返回的Ack,认为消息已经通过exchange路由到目标队列中去了 。造成了消息的丢失。

以上是关于RabbitMQ集群出现网络分区,可能会丢数据的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ脑裂

智汇华云 | RabbitMQ集群揭秘

RabbitMQ集群

RabbitMQ 分区脑裂处理策略

rabbitmq脑裂以及监控添加

网络分区是什么