RabbitMQ的脑裂(网络分区)问题

嚴華  金牌会员 | 2025-2-21 07:07:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 910|帖子 910|积分 2730

问题描述:
Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data

一、什么是MQ脑裂?

网络分区
如果另一个节点在一段时间内(默认为 60 秒)无法与其接洽,则节点会确定其对等方是否关闭。如果两个节点重新接触,并且都认为另一个节点已关闭,则节点将确定发生了分区。
当网络分区就位时,集群的两个(或更多!)方可以独立发展,双方都认为对方已经崩溃。这种环境被称为裂脑。队列、绑定、交换可以单独创建或删除。


  • 跨分区拆分的经典镜像队列最终将在分区的每一侧都有一个领导者,同样双方独立举措。仲裁队列将在多数方推举一个新的领导者。少数方的仲裁队列副本将不再有进展(即接受新消息、交付给消费者等),所有这些工作都将由新的领导者完成。
  • 除非将分区处置惩罚策略(例如pause_minority)配置为使用,否则纵然在网络连接恢复后,拆分仍将继续
二、什么原因造成脑裂,怎样查看?

这是由于网络问题导致集群出现了脑裂。
正常环境下,通过rabbitmqctl cluster_status下令查看到的信息中partitions那一项是空的,就像这样:
  1. # rabbitmqctl cluster_status
  2. Cluster status of node rabbit@smacmullen ...
  3. [{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
  4. {running_nodes,[rabbit@smacmullen,hare@smacmullen]},
  5. {partitions,[]}]
  6. ...done.
复制代码
然而当网络分区发生时,会变成这样:
  1. # rabbitmqctl cluster_status
  2. Cluster status of node rabbit@smacmullen ...
  3. [{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
  4. {running_nodes,[rabbit@smacmullen,hare@smacmullen]},
  5. {partitions,[{rabbit@smacmullen,[hare@smacmullen]},
  6.               {hare@smacmullen,[rabbit@smacmullen]}]}]
  7. ...done.
复制代码
三、怎么解决MQ脑裂?

原因是rabbitmq集群在配置时未设置出现网络分区处置惩罚策略,先要将集群恢复正常,再设置出现网络分区处置惩罚策略,步调如下:

  • 首先需要挑选一个信托的分区,这个分区才有决定Mnesia内容的权限,发生在其他分区的改变将不被记录到Mnesia中而直接丢弃。
  • 停止(stop)其他分区的节点,然后启动(start)这些节点,之后重新将这些节点加入到当前信托的分区之中。
    1. rabbitmqctl stop_app
    2. rabbitmqctl start_app
    复制代码
  • 最后,你应该重启(restart)信托的分区中所有的节点,以去除告警。你也可以简朴的关闭整个集群的节点,然后再启动每一个节点,当然,你要确保你启动的第一个节点在你所信托的分区之中。
           留意:mq集群不能采用kill -9 杀死历程,否则生产者和消费者不能及时识别mq的断连,会影响生产者和消费者正常的业务处置惩罚
  • 设置出现网络分区处置惩罚策略,这里设置为autoheal,下面会具体说明其它策略。
    在 /etc/rabbitmq 下新建 rabbitmq.conf,加入:
    1. [
    2. {rabbit,
    3.   [{tcp_listeners,[5672]},
    4.    {cluster_partition_handling, autoheal}
    5. ]}
    6. ].
    复制代码
网络分区处置惩罚策略:
有以下3种处置惩罚策略:
(1)ignore
默认范例,不处置惩罚。
要求你所在的网络环境非常可靠。例如,你的所有 node 都在同一个机架上,通过交换机互联,并且该交换机还是与外界通信的必经之路。
(2)pause_minority
rabbitmq节点感知集群中其他节点down掉时,会判定自己在集群中处于多数派还是少数派,也就是判定与自己形成集群的节点个数在整个集群中的比例是否超过一半。如果是多数派,则正常工作,如果是少数派,则会停止rabbit应用并不停检测直到自己成为多数派的一员后再次启动rabbit应用。
留意:这种处置惩罚方式集群通常由奇数个节点构成。在CAP中,优先保证了CP。
留意:pause_minority实用情形有限定,如3个节点集群,每次只down1个时,此模式实用。但如果网络都出问题,3节点会独立形成3个集群。
(3)autoheal
你的网络环境可能是不可靠的。你会更加关心服务的可持续性,而非数据完备性。你可以构建一个包罗2个node的集群。
当网络分区恢复后,rabbitmq各分区相互进行协商,分区中客户端连接数最多的为胜者,别的的全部会进行重启,恢复到同步状态
相关链接:https://www.rabbitmq.com/partitions.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表