RabbitMQ消息队列MQ脑裂(网络分区)整理分析

文章目录

  • RabbitMQ 的集群架构基础
  • 什么是MQ脑裂
  • 检测网络分区
  • RabbitMQ 网络分区导致脑裂的原因
      • • 多个节点认为自己是主节点:
      • • 节点间状态不一致:
      • • 集群的不可用性和错误恢复:
  • RabbitMQ 网络分区引发脑裂的常见场景
      • 队列镜像不同步
      • HA(高可用)队列脑裂
      • 客户端连接问题
  • RabbitMQ 脑裂的影响
  • RabbitMQ 脑裂恢复办法
  • RabbitMQ 的自动网络分区恢复机制(Partition Handling)
  • Rabbitmq集群状态检查

RabbitMQ 的集群架构基础

RabbitMQ 网络分区引发的脑裂问题在分布式系统中相对常见,特别是当 RabbitMQ 处于集群模式(Cluster Mode)时,多个节点之间依赖网络通信来共享队列和状态信息。当发生网络分区时,集群中的节点无法通信,就可能导致脑裂现象。要理解 RabbitMQ 中的脑裂问题,需要先了解 RabbitMQ 的集群架构。

RabbitMQ 集群由多个节点组成,通常包括主节点(Master Node)和从节点(Slave Node)。这些节点负责管理和分发消息,集群模式可以提高系统的可用性、横向扩展能力以及容灾能力。RabbitMQ 的集群节点分为两类:

  1. 队列主节点(Queue Master):队列主节点是负责处理某个队列的节点,当客户端发送或消费消息时,它会与主节点进行交互
  2. 队列镜像节点(Queue Mirror/Slave):为了保证高可用性,RabbitMQ 允许将队列的数据复制到其他节点(即镜像节点)。镜像队列的所有副本节点都维护相同的数据,但只能有一个主节点处理请求,其他副本作为备用节点
    队列的复制机制在某种程度上能够提高可用性和数据一致性,但也可能在网络分区时引发脑裂问题。

什么是MQ脑裂

MQ 脑裂问题(Message Queue Split-Brain)通常发生在分布式系统中,尤其是在消息队列(Message Queue, MQ)系统中的集群部署下。所谓“脑裂”指的是集群系统中的多个节点由于网络分区或其他原因,失去了彼此之间的通信能力,但每个节点仍然认为自己是主节点。这种情况下,集群中可能会同时存在多个主节点,它们各自独立处理相同的数据或任务,从而导致数据不一致、消息重复或丢失等问题。也称为网络分区(Network Partition)问题。

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

检测网络分区

RabbitMQ 日志观察:

Mnesia(rabbit@warp10): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, rabbit@hostname2}

可以通过服务器 日志、HTTP API(用于 监控)和 CLI 命令 识别分区的存在。

rabbitmq-diagnostics cluster_status

rabbitmq-diagnostics cluster_status 通常会显示一个空分区列表
在这里插入图片描述
但是,如果发生网络分区,则会显示有关分区的相关信息。
在这里插入图片描述
在这里插入图片描述

RabbitMQ 网络分区导致脑裂的原因

在 RabbitMQ 集群中,所有节点通过网络通信来维持状态的同步。当发生网络分区(即部分节点之间失去网络连接)时,可能会导致集群中的节点互相看不到对方,形成多个孤立的“分区”。这时,网络分区问题可以引发“脑裂”,具体表现如下:

• 多个节点认为自己是主节点:

如果在网络分区发生后,集群中的某些节点失去了对其他节点的通信能力,这些节点会认为自己是集群的唯一活动节点,从而继续处理消息。
网络分区的不同部分可能各自选举出新的主节点,导致集群中出现多个同时运行的主节点,这就形成了“脑裂”现象。每个分区中的主节点可能会独立接受和处理消息,这会导致数据的不一致性。

• 节点间状态不一致:

当某个队列有多个镜像节点时,镜像节点之间需要保持状态的一致性。脑裂时,多个主节点无法彼此同步消息状态,因此可能会出现同一条消息在不同节点被重复处理或丢失的情况。
脑裂恢复后,不同节点的队列状态可能已经发生变化,这可能会导致系统无法简单地将数据合并回同步一致的状态。

• 集群的不可用性和错误恢复:

网络分区发生时,部分客户端可能依旧能够连接某个节点,但由于节点无法同步状态,RabbitMQ 集群整体可能变得不可用。某些操作会卡住或超时,导致客户端连接失败或操作失败。
恢复网络连接后,如果 RabbitMQ 的仲裁机制没有妥善处理好脑裂问题,可能会导致多个主节点继续存在,或者需要手动干预才能恢复集群的正常状态。

RabbitMQ 网络分区引发脑裂的常见场景

队列镜像不同步

当网络分区发生时,不同节点的镜像队列无法互相同步状态。每个节点可能会独立处理消息,导致不同镜像之间出现状态不一致。网络恢复后,这种不一致性难以解决,可能导致消息丢失、重复消费或无法恢复到一致的状态。

HA(高可用)队列脑裂

在启用了高可用队列(HA Queues)的 RabbitMQ 集群中,所有镜像节点应该与主节点同步消息。但是在网络分区期间,镜像节点可能会认为主节点不可用,并选举自己为新的主节点。多个主节点在网络分区后各自处理同一队列,可能导致数据冲突或消息丢失。

客户端连接问题

当客户端连接 RabbitMQ 时,通常会与队列的主节点进行通信。网络分区时,客户端可能连接到不同的主节点,导致不同客户端获取到的队列状态不一致。某些客户端可能无法连接,或者会看到旧的、不正确的消息状态。此外,如果客户端连接的有问题的节点,可能出现无法连接,连接超时,无法正常发送消费等异常问题。

RabbitMQ 脑裂的影响

  1. 消息重复消费或丢失:由于多个主节点独立运行,它们可能会分别处理相同的消息,导致消息被重复消费或某些消息被错误丢弃。
  2. 数据不一致性:由于各个分区中的节点无法同步队列状态,网络恢复后,队列中可能出现未处理的消息、已经处理但未确认的消息,甚至数据冲突。
  3. 系统性能下降:脑裂恢复后,集群需要进行大量的数据同步操作,带来较大的性能开销,影响系统的正常运行。
  4. 集群不可用:由于脑裂问题的复杂性,RabbitMQ 集群可能需要人为干预才能完全恢复,导致长时间的系统不可用。

RabbitMQ 脑裂恢复办法

要从脑裂中恢复,首先选择您最信任的分区。此分区将成为系统状态(架构、消息)的权威来源;其他分区中发生的任何更改都将丢失。
停止其他分区中的所有节点,然后重新启动所有节点。当它们 重新加入集群 时,它们将从可信分区恢复状态。
最后,还应该重新启动可信分区中的所有节点以清除警告。
停止整个集群并重新启动它可能更简单;如果是这样,请确保您启动的第一个节点来自可信分区。

RabbitMQ 的自动网络分区恢复机制(Partition Handling)

RabbitMQ 提供了自动处理网络分区的策略,称为 partition_handling。可以选择不同的策略来应对脑裂,例如:

pause_minority:将网络分区中较少的节点暂停,从而避免多个主节点并存。大多数节点继续正常工作,少数节点在网络恢复后重新加入集群。RabbitMQ 会自动暂停确定自己处于少数节点(即少于总节点数的一半)的集群节点,并在检测到其他节点停止运行后。因此,它优先选择分区容忍度而不是来自 CAP 定理的可用性。这确保在发生网络分区时,至多只有一个分区中的节点将继续运行。一旦分区开始,少数节点将暂停,并在分区结束时重新启动。此配置防止脑裂,因此能够自动从网络分区中恢复,而不会出现不一致。

autoheal:自动修复脑裂问题,强制选择一个主节点,并让其他节点自动恢复并加入主节点的状态。
ignore:不处理网络分区问题,允许各个节点独立运行。这种策略可能导致脑裂后数据不一致问题。

Rabbitmq集群状态检查

通过后台检查集群状态:
在这里插入图片描述
partitions正常是[],出现网络分区时会有{分区节点1,[节点2,节点3]}的状态。(网络分区可以理解为“脑裂”)

running_nodes正常显示是: 集群的所有节点信息都会有,上图就只有02节点,说明02这个节点出现网络分区,只看到自己运行的节点
通过web端检查集群状态:
web端是mq服务地址的15672端口。下图可以看出rabbitmq集群出现了“Network partition”网络分区的问题了。
在这里插入图片描述
出现网络分区后,虽然修复了rabbitmq集群的网络分区问题,但是在网络分区期间在分区节点创建的队列消息需要去检查是否同步到其他节点。如下图,同步正常是“+2”,(集群节点数-1),即成功同步到其他节点上了。如下图:
在这里插入图片描述
“D ha-allqueue” 队列: D表示持久化,ha-allqueue表示所有消息都镜像复制
在这里插入图片描述
“AD Excl”:AD表示自动删除(auto delete),Excl表示独占(exclusive),这种队列我们就不用关心是否 “+2"了。
除了这种AD Excl状态的队列,其他如果没有”+2"的话,该队列需要手动进行同步(可以点击进入该队列信息,然后有个synchronous的按钮,手动同步)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识,本期为第二期,包含一些简…

网络变压器在楼宇电梯控制器中的重要作用

Hqst盈盛(华强盛)电子导读:今天分享的是网络变压器在楼宇电梯控制器中的重要作用... 网络变压器在楼宇电梯控制器中起着至关重要的作用,工程师总结有以下是其主要应用方面: 一、信号隔离与增强 络变压器可以实现信号的隔离&#…

Qt-界面优化选择器的用法(70)

目录 描述 使用 类型选择器 ID 选择器 并集选择器 子控件选择器 伪控制器 描述 QSS 的选择器⽀持以下⼏种 选择器⽰例说明全局选择器*选择所有的 widget.类型选择器 (type selector)QPushButton选择所有的 QPushButton 和其⼦类的控件.类选择器 (class selector).QPus…

【Golang】关于Go语言中的定时器原理与实战应用

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

QRTCN区间预测 | Matlab实现QRTCN时间卷积神经网络分位数回归区间预测

区间预测 | Matlab实现QRTCN时间卷积神经网络分位数回归区间预测 目录 区间预测 | Matlab实现QRTCN时间卷积神经网络分位数回归区间预测预测效果基本介绍模型特性程序设计参考资料预测效果 基本介绍 Matlab实现QRTCN时间卷积神经网络分位数回归区间预测 QRTCN(Quantile Regres…

2.mybatis-plus3.x的使用

官网:简介 | MyBatis-Plushttps://baomidou.com/introduce/ 3.X版本插件使用、 1. 分页插件 配置插件(不能用的情况去官网看看最新的) Configuration MapperScan("scan.your.mapper.package") public class MybatisPlusConfig …

Django 定义使用模型,并添加数据

教材: Python web企业级项目开发教程(黑马程序员)第三章 模型 实验步骤: 1.创建项目和应用 前置步骤可看前文,进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…

DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 原文链接:DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中? 如何将(.bak)的SQL Server 数据库备份文件导入到当前数据库中? Step 1.登录到 Sql…

【专题】智启未来:新质生产力引擎驱动下的智能制造行业革新报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p37856 在当今全球经济格局深刻变革的大背景下,制造业作为国家经济的基石,正处在高质量发展的关键历史时期。智能决策作为一股崭新的力量,正逐步成为推动制造业数智化转型的强大新动能。众多制造企…

每日OJ题_牛客_对称之美_哈希_C++_Java

目录 牛客_对称之美_哈希 题目解析 C代码 Java代码 牛客_对称之美_哈希 对称之美 (nowcoder.com) 描述: 给出n个字符串,从第1个字符串一直到第n个字符串每个串取一个字母来构成一个新字符串,新字符串的第i个字母只能从第i行的字…

安卓13屏蔽蓝牙匹配对话框 自动匹配 android13屏蔽蓝牙匹配对话框 自动匹配

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 蓝牙连接的时候,会有匹配对话框提示。我们来实现自动配对。 2.问题分析 这里我们是通过点击操作来实现功能的,所以我们思路可以是自动点击功能的实现。 3.代码分…

Ubuntu 24.04 在 BPI-F3 上通过 SD 卡安装并从 NVME 运行

github 代码: https://github.com/rcman/BPI-F3 Ubuntu 24.04 现在正在我的 BPI-F3 上运行。很快会为 YouTube 制作一个视频。 这应该适用于任何版本的 Linux,仅在 Ubuntu 24.04 上测试过 入门 下载 Bianbu映像并使用您最喜欢的工具将其映像到微型 SD 卡…

选择排序-求和表达式

概述 选择排序算法复杂度计算,用到了求和表达式。(以前学过,现在都忘了,记录一下) 理解求和表达式的关键在于逐步拆分和简化。让我们一步一步来详细解释这个求和表达式: 求和表达式 求和表达式 分步求解 …

ESP32C3 开发板在Linux环境下,进行JTAG 调试演示-启明云端乐鑫代理商

JTAG 调试教程 本教程主要演示 esp32c3 开发板在 linux 环境下,通过 vscode 的 esp-idf 插件使用 jtag 调试工具。 esp32c3 不但内置了USB-JTAG,还内置了USB-SERIAL,仅需要一根USB线即可实现下载和调试仿真。 下面演示调试仿真的过程。 创…

系统思考—抓重点

最近与一些中小微企业的老板交流时,深刻感受到大家都陷入了一种忙碌的困境。在资源有限的情况下,到底该抓住什么?这个问题不仅关乎未来的战略,也与预算息息相关。面对复杂多变的市场环境,许多企业尝试了各种方法&#…

rpa批量发送邮件如何通过编辑器编发邮件?

rpa批量发送邮件的技巧?怎么使用rpa邮箱群发助手? 手动发送邮件变得越来越繁琐且效率低下。为了解决这一问题,越来越多的企业开始采用RPA技术来批量发送邮件。AokSend将详细探讨如何通过编辑器来实现rpa批量发送邮件的功能,从而提…

【JVM】—深入理解G1回收器——概念详解

深入理解G1回收器——概念详解 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 深入理解G1回收器…

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式:单机部署与分布式部署,同时支持从单机平滑扩展至分布式架构。这样,可以有效解决小型业务向大型业务转型时面临的扩展难题,降低了机器资源的成本。 以下将详述如何通过命令行,实现集…

【JavaScript】LeetCode:71-75

文章目录 71 搜索插入位置72 搜索二维矩阵73 在排序数组中查找元素的第一个和最后一个位置74 搜索旋转排序数组75 寻找旋转排序数组中的最小值 71 搜索插入位置 二分查找在最后一轮比较中,mid所指向的值 > target,right往左收,此时left所指…

容器实战高手课---09 Page Cache:为什么我的容器内存使用量总是在临界点

你好,我是程远。 上一讲,我们讲了Memory Cgroup是如何控制一个容器的内存的。我们已经知道了,如果容器使用的物理内存超过了Memory Cgroup里的memory.limit_in_bytes值,那么容器中的进程会被OOM Killer杀死。 不过在一些容器的使…