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

问题描述:
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那一项是空的,就像这样:

# rabbitmqctl cluster_status
Cluster status of node rabbit@smacmullen ...
[{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
{running_nodes,[rabbit@smacmullen,hare@smacmullen]},
{partitions,[]}]
...done.

然而当网络分区发生时,会变成这样:

# rabbitmqctl cluster_status
Cluster status of node rabbit@smacmullen ...
[{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
{running_nodes,[rabbit@smacmullen,hare@smacmullen]},
{partitions,[{rabbit@smacmullen,[hare@smacmullen]},{hare@smacmullen,[rabbit@smacmullen]}]}]
...done.

三、怎么解决MQ脑裂?

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

  1. 首先需要挑选一个信任的分区,这个分区才有决定Mnesia内容的权限,发生在其他分区的改变将不被记录到Mnesia中而直接丢弃。

  2. 停止(stop)其他分区的节点,然后启动(start)这些节点,之后重新将这些节点加入到当前信任的分区之中。

    rabbitmqctl stop_app
    rabbitmqctl start_app
    
  3. 最后,你应该重启(restart)信任的分区中所有的节点,以去除告警。你也可以简单的关闭整个集群的节点,然后再启动每一个节点,当然,你要确保你启动的第一个节点在你所信任的分区之中。

    注意:mq集群不能采用kill -9 杀死进程,否则生产者和消费者不能及时识别mq的断连,会影响生产者和消费者正常的业务处理

  4. 设置出现网络分区处理策略,这里设置为autoheal,下面会详细说明其它策略。
    /etc/rabbitmq 下新建 rabbitmq.conf,加入:

    [
    {rabbit,[{tcp_listeners,[5672]},{cluster_partition_handling, autoheal}
    ]}
    ].
    

网络分区处理策略:
有以下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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL知识体系

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫结构化查询语言。 SQL92和SQL99有什么区别呢? SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用(&#xff…

企业商业秘密百问百答之五十三【商业秘密转让】

《企业商业秘密百问百答》是由天禾律所陈军律师团队精心编撰的成果,汇集了该团队律师在处理商业秘密相关的刑事和民事案件中的丰富经验。近年来,这份资料已通过线上和线下的方式向全国近千家企业进行了广泛宣讲,并获得了积极的社会反响。 其…

巧用GitHub的CICD功能免费打包部署前端项目

近年来,随着前端技术的发展,前端项目的构建和打包过程变得越来越复杂,占用的资源也越来越多。我有一台云服务器,原本打算使用Docker进行部署,以简化操作流程。然而,只要执行sudo docker-compose -f deploy/…

STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)

本篇主要结合代码落实,之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象,它有属性、私有数据和方法; 每个串口都有名字属性;有初始化、发送、接收方法;还有一个私有数据(这个私有数据是每个…

react实例与总结(二)

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

【并发测试】Redis并发性能测试

arthas 测试示例 Redis配置类 Slf4j Configuration public class RedisConfig {BeanJedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration configuration new RedisStandaloneConfiguration();configuration.setHostName(redisHost);configuratio…

【Linux基础八】计算机体系结构(冯诺依曼和操作系统)

【Linux基础八】计算机体系结构(冯诺依曼和操作系统) 1.冯诺依曼体系结构2.冯诺依曼的优势3.硬件间的交流4.操作系统对硬件资源的管理 1.冯诺依曼体系结构 计算机大部分遵守冯诺依曼体系 输入设备:键盘、鼠标、摄像头、麦克风、磁盘、网卡…

深入解析Qt事件循环

在Qt开发中,QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作?为何耗时操作会导致界面冻结?本文将以事件循环为核心,揭示Qt高效运转的底层逻辑,探讨其设计哲学与最…

Hadoop 基础原理

Hadoop 基础原理 基本介绍Hadoop 的必要性Hadoop 核心组件Hadoop 生态系统中的附加组件 HDFSHDFS 集群架构HDFS 读写流程HDFS 写流程HDFS 读流程 NameNode 持久化机制 MapReduce底层原理示例 Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构,主要解决海量数…

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法,是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。 其缺点是对边缘的定位…

【从0做项目】Java音缘心动(1)———项目介绍设计

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:项目结果展示 一:音乐播放器Web网页介绍 二:前期准备工作&…

数据链路层分析----交换机基本原理

目录 一、交换机基本原理 1、小型交换网络 2、交换机转发行为 二、交换机转发原理 1、MAC地址表 2、交换机初始状态 3、交换机学习MAC地址 4、ARP协议 5、交换机转发数据帧 6、目标主机回复 常见的以太网设备包括Hub、交换机等。交换机工作在数据链路层,它有…

三、Three.js模型对象、材质

一、三维向量Vector3与模型位置 点模型Points、线模型Line、网格网格模型Mesh等模型对象的父类都是Object3D,如果想对这些模型进行旋转、缩放、平移等操作,如何实现,可以查询Threejs文档Object3D对相关属性和方法的介绍 1、三维向量Vector3 …

2025.2.16机器学习笔记:TimeGan文献阅读

2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目: Time-series Generative Adversarial Networks会议: Neural Information…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式,旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关,但在应用…

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…

Memcached和redis对比了解

1.介绍 Memcached 是一个高性能、分布式的内存缓存系统,用于加速动态 Web 应用程序,减少数据库负载。它的核心功能是将数据存储在内存中,并通过基于键值对(Key-Value)的方式快速读取数据。 Redis 和 Memcached 选择建…

李沐详解图神经网络(GNN/GCN)

图 顶点可以用向量来表示,边也是,全局信息也是 把image表示成graph 把text表示成graph 一个词和下一个词之间有一条边 分子图 社交网络 空手道俱乐部 引用图(有向) 三大类问题 1.图层面的任务 识别环,对图进行分…

在PyCharm中运行Jupyter Notebook的.ipynb文件及其pycharm软件的基础使用

(注意需使用PyCharm专业版,学生、教师可以申请免费使用:https://www.jetbrains.com/shop/eform/students) 1. pycharm2024版汉化 https://blog.csdn.net/m0_74103046/article/details/144560999 2. pycharm中的python控制台和J…

【算法】----多重背包问题I,II(动态规划)

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…