RabbitMQ脑裂

2021-08-04  本文已影响0人  名字是乱打的

脑裂为啥影响了我的消费?脑裂情况下如果是queue所在节点挂了的话 连queue都应该找不到 如果不是 没有存在至少2个节点正常的话 也一样 不能工作,另外如果开启了镜像 在一些情况下 在复制queue数据中 也会拒绝工作

昨天10点到凌晨1点,mq发生了脑裂行为,我们这边有两个集群,其中一个我们使用的集群出现了脑裂行为导致消息挤压一直消费不掉,登录mq发现发生了脑裂,于是先重启以下相关服务暂时解决了这个问题,然后查阅相关文档看看解决方案,如下.

一、背景

目前生产环境RabbitMQ集群分布在铜牛机房和马驹桥机房,其中铜牛机房两个节点,马驹桥机房两个节点;

当铜牛和马驹桥机房之间网络中断或者有较大波动时,RabbitMQ集群会发生网络分区(脑裂),分成两个分区,当网络恢复时,网络分区的状态还是会保持,除非采取一些措施去解决,造成消息消费异常等问题。

二、网络分区处理方式

处理网络分区的方式有两种:

1.手动处理网络分区:挑选一个信任的分区,重启其他分区的节点;

2.自动处理网络分区

RabbitMQ提供了4种处理网络分区的方式,在rabbitmq.config中配置cluster_partition_handling参数即可,分别为:ignore、pause_minority、pause_if_all_down、autoheal

三、方案分析

  1. ignore:适用于网络很可靠或者只有两个节点的集群;
  2. pause_minority:适用于三机房,每个机房有一个节点或一个以上的集群;
  3. pause_if_all_down:适用于三机房,每个机房节点数不一样的集群(比如四个节点);
  4. autoheal:适用于网络不可靠,只关心服务的连续性而不是数据的完整性。适合有两个节点的集群;

经过对比,采用pause_minority方式比较符合当前场景,以下使用这种方案进行测试。

四、方案测试

1、未加策略前,集群状态正常;

image

2、添加iptables策略,模拟网络中断;

网络中断后RabbitMQ服务端口还存在(同机房还可以进行读写);

image image image

3、关闭iptables策略,检查集群状态,发现集群已经分成两个分区;

重启节点rabbit@sz-145-centos178后集群状态恢复正常。

image

4、修改/etc/rabbitmq/rabbitmq.config配置文件,添加pause_minority策略;

image

5、逐一重启所有节点,重启过程中集群状态正常;

重启完成后再次添加iptables策略,模拟网络中断;可以发现添加策略后网络中断时MQ节点检测到自身属于少数节点,所以关闭自身节点,不提供服务;

image

6、关闭iptables策略,可以看到该节点RabbitMQ服务自动启动,集群状态也正常;

image image

五、变更步骤

  1. 太和桥机房新增一台虚拟机,安装RabbitMQ后将节点加入集群;
  2. 修改/etc/rabbitmq/rabbitmq.config配置文件,添加pause_minority策略;
  3. 逐一重启所有节点,同时将铜牛机房的一个节点剔除集群,保持每个机房一个节点。

参考

https://www.e-learn.cn/topic/2511682
https://www.cnblogs.com/ybyn/p/14343717.html

上一篇 下一篇

猜你喜欢

热点阅读