RabbitMQ3.7.8集群分区(脑裂现象)模拟及恢复处置全场景测试

news2025/1/16 9:09:22

测试环境准备: MQ服务器集群地址,版本号为3.7.8:

管理控制台地址:http://173.101.4.6:15672/#/queues

集群状态 rabbitmqctl cluster_status

集群操作相关命令:

创建一个RabbitMQ集群涉及到如下步骤:

安装RabbitMQ: 在每台要在集群中运行的机器上安装RabbitMQ。可以参考RabbitMQ官方文档

配置.erlang.cookie文件: RabbitMQ基于Erlang语言。其中.erlang.cookie文件用于在Erlang节点之间进行通信。在一个集群里,所有服务器的.erlang.cookie文件必须保持一致。这个文件通常位于用户的主目录下(/var/lib/rabbitmq)。拷贝一台机器上的.erlang.cookie文件内容到其它所有服务器上。

开始配置集群: 在一台机器上启动RabbitMQ应用,然后在所有其他机器上执行下面命令,加入到集群中(例如,你想把mq2,mq3加入到mq1的集群中):

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster rabbit@mq1

rabbitmqctl start_app

验证集群配置: 使用下面的命令在每台机器上检查集群状态,保证它们都在集群中:

rabbitmqctl cluster_status

添加节点到集群: 首先,停止你想要添加到集群的节点的应用进程。你可以使用 rabbitmqctl stop_app 命令。然后,使用 rabbitmqctl join_cluster <clusternode> 命令将节点加入到集群。这里,<clusternode>应该被替换为集群中的一个运行的节点。最后,再使用 rabbitmqctl start_app 命令启动应用。

从集群中移除节点: 你需要先停止你想要移除的节点的应用进程。然后,执行 rabbitmqctl forget_cluster_node <node> 命令。这里,<node>应该被替换为你要从集群中移除的节点。即使节点已经停止运行或者从网络上移除,你仍然需要在集群中的一个运行的节点上执行此命令,来从集群元数据中删除该节点。

举例:

1. 添加节点到集群:
在新节点上执行以下命令,将其加入集群:

rabbitmqctl stop_app

rabbitmqctl reset  # Be careful, this will remove all data on the node

rabbitmqctl join_cluster rabbit@mq01.omms.com

rabbitmqctl start_app

上面的命令中, rabbit@mq01.omms.com 应被替换为你的集群中任意一个运行的节点。

注意: rabbitmqctl reset 命令会清除当前节点上所有的数据和配置,执行该命令前,请确保该节点上没有需要保留的数据。

  1. 从集群中删除节点:
    在集群中任意一个运行的节点上执行以下命令,将节点从集群中删除:

rabbitmqctl forget_cluster_node rabbit@mq02.omms.com

上面的命令中, rabbit@mq02.omms.com 应被替换为你要移除的节点。

注意: 即使你移除的节点已经停止运行或者与网络断开连接,你仍需要运行 rabbitmqctl forget_cluster_node 命令来清除集群中的元数据。

模拟集群分区(脑裂现象),命令准备

阻止mq01与其他节点通讯:

iptables -A INPUT -s 173.101.4.7 -j DROP

iptables -A INPUT -s 173.101.4.8 -j DROP

iptables -A OUTPUT -d 173.101.4.7 -j DROP

iptables -A OUTPUT -d 173.101.4.8 -j DROP

以上命令将mq01与mq02和mq03之间的通信丢弃。此时,mq01与其他节点无法通信,从而模拟了网络分区的情况。

恢复mq01与其他节点通讯:

iptables -D INPUT -s 173.101.4.7 -j DROP

iptables -D INPUT -s 173.101.4.8 -j DROP

iptables -D OUTPUT -d 173.101.4.7 -j DROP

iptables -D OUTPUT -d 173.101.4.8 -j DROP

以上命令解除了mq01与其他节点的通信阻止。这样,mq01就可以恢复与mq02和mq03的正常通信了。但是因为数据不同步,导致脑裂现象。

查看集群集群分区后状态

集群分区处置流程:

RabbitMQ集群分区处置模式设置:

cluster_partition_handling 这个选项有三个可能的值:ignore, autoheal, pause_minority。

ignore: 这是默认设置,意味着RabbitMQ在网络分区发生时将无视网络分区,每个分区将独立运作,分区解决后将要耗费很长时间来同步数据。

autoheal: 这个设置会在发生网络分区时,强制节点从最大的分区(copying its state)中自我恢复,这个过程称为“healing”,healing过程结束后可即刻恢复服务。(最常用的设置,通过RabbitMQ自行恢复)

pause_minority:这个设置会在网络分区发生时,检测哪个分区的节点最多,然后暂停节点较少的分区。这可能会导致RabbitMQ服务暂停,但是当分区修复后,服务可以立即恢复。

在新版本的RabbitMQ(3.7.0以上)中,推荐使用新的配置文件格式,即rabbitmq.conf。你可以按如下方式来修改cluster_partition_handling的设置:

173.101.4.6、173.101.4.7、173.101.4.8三台均配置

打开你的rabbitmq.conf文件,你可以使用以下命令:

 sudo vi /etc/rabbitmq/rabbitmq.conf

在文件的末尾,添加以下内容:

cluster_partition_handling = autoheal

保存并关闭文件。

如果mq状态为暂停,则重启RabbitMQ服务,如果状态正常则无需重启:

 sudo service rabbitmq-server restart

然后再依次重启,173.101.4.7和173.101.4.8。

测试结论:

  1. 3.7.8版本的RabbitMQ,仍然存在网络波动的状态下出现集群分区的风险。
  2. 经过测试环境验证。建议在MQ集群配置的时候,增加集群分区处置模式的配置,即在/etc/rabbitmq/rabbitmq.conf增加cluster_partition_handling = autoheal,如果有这个配置,网络状态恢复后,MQ分区模式会自动恢复,无需手动去恢复。如果无该配置,需要手动进行恢复。
  3. 应用程序端在连接MQ集群时应该设置为主动重连模式,目前在测试环境发现部分队列在集群恢复后,不能自动消费数据了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Ubuntu 文件权限管理

Linux 系统对文件的权限有着严格的控制&#xff0c;用于如果相对某个文件执行某种操作&#xff0c;必须具有对应的权限方可执行成功&#xff0c;这也是Linux有别于Windows的机制&#xff0c;也是基于这个权限机制&#xff0c;Linux可以有效防止病毒自我运行。因为运行的条件是必…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

【随笔】Git 高级篇 -- 相对引用2(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

HTML:框架

案例&#xff1a; <frameset cols"5%,*" ><frame src"left_frame.html"><frame src"right_frame.html"> </frameset> 一、<frameset>标签 <frameset>标签&#xff1a;称为框架标记&#xff0c;将一个HTML…

Linux 学习之路 - 进程篇 - PCB介绍1-标识符

目录 一、基础的命令 <1> ps axj 命令 <2> top 命令 <3> proc 目录 二、进程的标识符 <1>范围 <2>如何获取标识符 <3>bash进程 三、创建进程 一、基础的命令 前面介绍了那么多&#xff0c;但是我们没有观察到进程相关状态&#x…

什么是智慧公厕?智慧旅游下的智慧公厕功能和特点

智慧旅游下的智慧公厕功能和特点&#xff1f;智慧旅游是景区、公园、游乐场、文化场馆等领域的一种信息化解决方案&#xff0c;智慧公厕是智慧旅游极为重要的一部分&#xff0c;能大大提升游客满意度。智慧公厕采用物联网、互联网、大数据、云计算等技术&#xff0c;实现旅游景…

深入浅出 -- 系统架构之微服务架构选型参考图

技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分&#xff1a; 1. 项目名称和描述&#xff1a;简要介绍项目的背景和目标。 2. 技术栈&#xff1a;列出项目中使用的主要技术和工具&#xff0c;如编程语言、框架、数据库…

Unity开发一个FPS游戏之三

在前面的两篇博客中&#xff0c;我已实现了一个FPS游戏的大部分功能&#xff0c;包括了第一人称的主角运动控制&#xff0c;武器射击以及敌人的智能行为。这里我将继续完善这个游戏&#xff0c;包括以下几个方面&#xff1a; 增加一个真实的游戏场景&#xff0c;模拟一个废弃的…

[C#]OpenCvSharp利用MatchTemplate实现多目标匹配

【效果展示】 原图 模板图 匹配结果&#xff1a; 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using…

Flutter仿Boss-4.短信验证码界面

效果 简述 在移动应用开发中&#xff0c;处理短信验证码是确保用户身份验证和安全性的重要步骤。本文将介绍如何使用Flutter构建一个短信验证码界面&#xff0c;让用户输入通过短信发送到他们手机的四位验证码。 依赖项 在这个项目中&#xff0c;我们将使用以下依赖项&#…

关于Tomcat双击startup.bat 闪退的解决⽅法

详解Tomcat双击startup.bat 闪退的解决⽅法 作为⼀个刚学习Tomcat的程序猿来说&#xff0c;这是会经常出现的错误。 1.环境变量问题 1.1 ⾸先需要确认java环境是否配置正确&#xff0c;jdk是否安装正确 winR打开cmd&#xff0c;输⼊java 或者 javac 出现下图所⽰就说明jdk配置正…

单元测试 mockito(二)

1.返回指定值 2.void返回值指定插桩 3.插桩的两种方式 when(obj.someMethod()).thenXxx():其中obj可以是mock对象 doXxx().wien(obj).someMethod():其中obj可以是mock/spy对象 spy对象在没有插桩时是调用真实方法的,写在when中会导致先执行一次原方法,达不到mock的目的&#x…

走进车厂 | 移远通信以前沿车载技术,照亮智能网联汽车产业创新发展之路

无钥匙自动解锁方便快捷、实时路况导航精准高效、语音指令轻松控制车辆、车载娱乐系统丰富多样……随着智能化、数字化浪潮的不断推进&#xff0c;现如今的汽车出行焕然一新。 正如我们所见&#xff0c;汽车产业正在经历前所未有的变革。物联网、车联网等前沿技术的发展和应用&…

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析&#xff08;九&#xff09;之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写&#xff0c;矢量数据的读写&#xff0c;以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂&#xff0c;有…

力扣热题100_链表_21_合并两个有序链表

文章目录 题目链接解题思路解题代码 题目链接 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例…

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…

【opencv】教程代码 —TrackingMotion 角点检测

角点检测执行角点检测并在可能的角点周围画一个圆对图像中的角点位置进行检测和细化Shi-Tomasi方法检测图像角点 1. cornerDetector_Demo.cpp 角点检测 /*** function cornerDetector_Demo.cpp* brief Demo code for detecting corners using OpenCV built-in functions* 使用 …

CSRF介绍及Python实现

CSRF 文章目录 CSRF1. CSRF是什么&#xff1f;2. CSRF可以做什么&#xff1f;3. CSRF漏洞现状4. CSRF的原理5. 举例说明6. CSRF的防御Python示例 1. CSRF是什么&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求…

基于H2O AutoML与集成学习策略的房屋售价预测模型研究与实现

项目简述&#xff1a; 本项目采用H2O AutoML工具&#xff0c;针对加州房屋销售价格预测问题进行了深入研究与建模。项目以Kaggle提供的加州房屋 交易数据集为基础&#xff0c;通过数据清洗、特征工程、模型训练与评估等步骤&#xff0c;构建了一种基于集成学习策略的房价预测模…

最优控制理论笔记 - 01数学准备

目录 一、向量和矩阵的微分 1. 向量对标量的导数 2. 矩阵对标量的导数 2.1 矩阵对标量的导数的运算公式 2.2 标量函数对向量的导数&#xff1a; 2.3 向量函数对向量的导数 二、函数极值的问题 三、有约束条件的函数极值问题 四、n元函数的Taylor 一、向量和矩阵的微分 …