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集群出现网络分区,可能会丢数据的主要内容,如果未能解决你的问题,请参考以下文章