网络分区(network partitions)

官网-网络分区

网络设备故障导致的网络分裂。比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连。若两个子网间的交换机故障了即发生了网络分区,A\B和C\D\E便不能通讯。

某些系统是partition-tolerant的,也即,即使发生了网络分区系统分裂为了多个子系统,整个系统仍能正常工作。

RabbitMQ cluster不能很好地处理Network Partition。RabbitMQ将queue、exchange、bindings等信息存储在Erlang的分布式数据库Mnesia中。所以出现Network partition时RabbitMQ的众多行为与Mnesia的行为密切相关。

Network Partition的判定

若某一node在一段时间内(取决于net_ticktime的设置)不能与另一node取得联系,则Mnesia认为未能与之取得联系的node宕掉了。若两个node彼此恢复联系了,但都曾以为对方宕掉了,则Manesia断定发生过Network partition。

发生Network Partition后RabbitMQ的行为

若发生了network partition,cluster中的双方(或多方)将独立存在,每一方都将认为其他方已经崩溃了。Queues、bindings、exchanges可以各自独立的创建、删除。对于Mirrored queues,处于不同network partition的每一方都会拥有各自的master,且各自独立的读写。(也可能发生其他诡异的行为)。若network partition恢复了,cluster的状态并不能自动恢复到network partition发生前的状态,直至采取措施进行修复。

网络分区的可能原因

只要cluster中的不同node自身没有失效但之间的通信发生了中断都可认为是发生了Partitions。比如,整个OS的挂起会导致其中的cluster nodes的挂起,但这些nodes却不认为自身失效或停止了,而cluster中的其它nodes不能与之取得联系,会认为这些nodes down掉了。举个例子:若cluster中的一个node运行在笔记本电脑上,合上电脑屏幕就有可能导致node挂起。另外,若cluster中的node运行在虚拟机中,则管理程序可能导致虚拟机挂起,从而使node挂起。

  • 情况1:集群中的nodes,都没有故障下线,但是node之间通信中断;
  • 情况2:暂停/恢复运行中node的操作系统也可能导致network分区:暂停的node不认为它已经fail或stop,但集群中的其他nodes认为它已经fail了。
  • 情况3:发生这种情况的最常见原因是:虚拟机已被虚拟机管理程序挂起;
  • 情况4:虚拟机的迁移(rabbitmq运行在该vm上),也可能会导致vm被挂起,从而发生网络分区
  • 情况总结:就是某个node因各种原因,和集群中的其他节点发生通信中断,虽然该节点不认为自己下线,但是集群中的其他节点已经认为该节点下线了。

检查网络分区

可以通过rabbitmqctl cluster_status来查看是否发生了网络分区

正常的状态信息:

[root@rmq-node3 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rmq-node3'
[{nodes,[{disc,['rabbit@rmq-node2','rabbit@rmq-node1']},
{ram,['rabbit@rmq-node3']}]},
{running_nodes,['rabbit@rmq-node1','rabbit@rmq-node2','rabbit@rmq-node3']},
{cluster_name,<<"rabbit@rmq-node1">>},
{partitions,[]}, #注意,这里为空数组,表明没有发生网络分区
{alarms,[{'rabbit@rmq-node1',[]},
{'rabbit@rmq-node2',[]},
{'rabbit@rmq-node3',[]}]}]

发生网络分区的状态信息:

[root@rmq-node3 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rmq-node3'
[{nodes,[{disc,['rabbit@rmq-node2','rabbit@rmq-node1']},
{ram,['rabbit@rmq-node3']}]},
{running_nodes,['rabbit@rmq-node1','rabbit@rmq-node2','rabbit@rmq-node3']},
{cluster_name,<<"rabbit@rmq-node1">>},
{partitions,[{'rabbit@rmq-node1',['rabbit@rmq-node2','rabbit@rmq-node3']}]}, #这里是发生了network partitions
{alarms,[{'rabbit@rmq-node1',[]},
{'rabbit@rmq-node2',[]},
{'rabbit@rmq-node3',[]}]}]

当发生网络分区时,会提示如下信息:

While running in this partitioned state, changes (such as queue or exchange declaration and binding) which take place in one partition will not be visible to other partition(s). Other behaviour is not guaranteed.
==>表明 元数据的改变,不会在节点之间同步

也可以通过查看日志找到该问题:

vi /var/log/rabbitmq/rabbit-xxx.log

=ERROR REPORT==== 9-Aug-2018::20:15:45 ===
Mnesia('rabbit@rmq-node2'): ** ERROR ** mnesia_event got {inconsistent_database, starting_partitioned_network, 'rabbit@rmq-node1'}

网络分区的恢复

首先选一个最信任的partition,Mnesia使用该partition中的状态,其他partitions中发生的变化都将丢失。

停止其他partitions中的所有nodes,之后重启这些nodes。当这些nodes重新加入cluster后将从信任的partition恢复状态。

最后还需重启信任的partition中的所有nodes以清除network partition的警告信息

Rabbitmq自动处理网络分区的3种模式

RabbitMQ提供了3种自动处理network partitions的方式:默认为ignore模式,也即需要手工处理

  1. pause-minority mode:暂停少数模式;
  2. pause-if-all-down mode:暂停-如果全部停止模式
  3. autoheal mode:自动愈合模式

pause-minority mode:暂停少数模式

在pause-minority模式下,察觉其他nodes down掉后,RabbitMQ将自动暂停认为自己是少数派的 nodes(例如小于或等于总nodes数的一半),network partition一旦发生,“少数派”的nodes将立刻暂停,直至partition结束后重新恢复。这可以保证在network partition发生时,至多只有一个partition中的nodes继续运行。(牺牲可用性保证一致性)

若所有分区的nodes个数都小于总nodes个数一半,则意味着所有分区的nodes都会认为自己是少数派,即所有nodes都将暂停;

pause-if-all-down mode:暂停-如果全部停止模式

http://www.rabbitmq.com/partitions.html

autoheal模式

在autoheal模式下一旦发生了partition,RabbitMQ将自动确定一个优胜partition,然后重启所有不在优胜partition中的nodes。

获胜的partition为拥有最多客户端连接的partition(若连接相同则为节点最多的partition)。

关于自动处理partitions的设置在配置文件的cluster_partition_handling参数中进行。

各自的适用场景

network partitions自动处理并不能保证cluster不出任何问题。

一般来说可作如下选择:

  • ignore:若网络非常可靠。所有nodes在同一机架,通过交换机连接,该交换机也是通往外部网络的出口。在cluster的某一部分故障时不希望其余部分受影响。或者cluster只有两个node。
  • pause_minority:网络较不可靠。cluster处于EC2的3个AZ中,假定每次至多只有其中一个AZ故障,想要剩余的AZ继续提供服务而故障的AZ中的nodes在AZ恢复后重新自动加入到cluster。
  • autoheal:网络很不可靠。与数据完整性相比更关注服务的持续性。cluster只有两个node。

关于pause-minority模式

暂停的nodes上Erlang VM将继续运行但不监听任何端口或者做其他工作。它们将每秒检测一次cluster中的其他nodes是否可见,若可见则从pause状态唤醒。

注意:

nodes在启动时不会进入paused状态,即使是处于“少数派”;

RabbitMQ可能会暂停非严格意义上的“少数派”中的nodes。如,包含多于总nodes总数一半的nodes。因此在只包含两个nodes的cluster中使用pause-minority模式并非好主意,因为在network partition发生或者node失败时有可能两个node都会暂停。然而,在包含两个以上nodes的cluster中pause_minority模式要比ignore更安全;

对于因cluster nodes 挂起引起的partitions pause_minority模式无能为力。因为挂起的node将不能看到剩余node是否恢复“可见”,因而不能触发从cluster中断开。

【rabbitmq】RabbitMQ 集群与网络分区的更多相关文章

  1. RabbitMQ 集群与网络分区(理论知识)

    关于network partition网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若两个子网间的交换机故障了即发 ...

  2. Rabbitmq关于集群节点功能的读书笔记

    消息和队列可以指定是否持久化,如果指定持久化则会保存到硬盘上 ,不然只在内存里 普通集群模式下持久化的队列不能重建了 内存节点和磁盘节点的区别就是将元数据放在了内存还是硬盘,仅此而已,当在集群中声明队 ...

  3. 关于RabbitMQ分布式集群架构

    RabbitMQ分布式集群架构和高可用性(HA) (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配 ...

  4. RabbitMQ之集群搭建

    1.RabbitMQ集群模式RabbitMQ集群中节点包括内存节点(RAM).磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点. 2.普通模式(默认)        对于普通模式,集群中 ...

  5. RabbitMQ (十三) 集群+单机搭建(window)

    拜读了网上很多前辈的文章,对RabbitMQ的集群有了一点点认识. 好多文章都说到,RabbitMQ的集群分为普通集群和镜像集群,有的还加了两种:单机集群和主从集群. 我看来看去,看了半天,怎么感觉, ...

  6. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

    原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  7. 11.RabbitMQ单机集群

    RabbitMQ集群设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行,以及通过添加更多的节点来扩展消息通信的吞吐量. RabbitMQ会始终记录以下四种类型的内部元数 ...

  8. 部署rabbitMQ镜像集群实战测试

    部署rabbitMQ镜像集群 版本信息 rabbit MQ: 3.8.5 Erlang: 官方建议最低21.3 推荐22.x 这里用的是23 环境准备 主机规划 主机 节点 172.16.14.3 磁 ...

  9. MongoDB集群跨网络、跨集群同步方案

    MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...

随机推荐

  1. 开始PYTHON之路

    曾经的功献给了球场酒精 曾经的激情也献给了爱情 曾经的智商用来副本求生 曾经的VB6老迈的只剩点0 曾经的SQL2000都不兼容 曾经........ 还有一些理想没有实现 还得继续在这个世界谋生 岁 ...

  2. dos脚本》大神

    关于dos命令行脚本编写 dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共 ...

  3. re正则表达式匹配字符串中的数字

    re.match(r'.*-(\d*).html',url_1).group(1) \d+匹配1次或者多次数字,注意这里不要写成*,因为即便是小数,小数点之前也得有一个数字:\.?这个是匹配小数点的, ...

  4. UITextField属性及方法说明

    /初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )] //设置 ...

  5. 【SHELL】:定时任务删除指定目录

    现有一个需求,需要定时删除积累过久的目录,并且部分目录不可删除.在此,我们分析了一下该父目录的命名结构:非连续性数字命名,部分目录中包含a.txt文件.如下图所示: 在此,我们对此可作如下操作,获取该 ...

  6. 城市扩张实验---ARCGIS处理踩雷

    1. 将每个坐标点按照所属泰森多边形分类后,得到了数据统计表,导出到excel里面数据透析. 数据透析行代表泰森多边形编号,列代表地物类别,求和项是frequency.一开始的求和不会显示求和,,而是 ...

  7. select默认显示

    select默认显示第一个option,但大部分需求都是显示一个请选择,点击后在显示option的内容. 就像上图一样 但如果正常写的话会是像下面这样显示 请选择也会显示在下拉款里面,这样就很不友好 ...

  8. python初识模块

    sys import sys   print(sys.argv)     #输出 $ python test.py helo world ['test.py', 'helo', 'world']  # ...

  9. 关于matlab中画图放大局部细节的问题

    1)需要用得到一个matnify.m文件,下载地址magnify 2)接下来就是如何使用magnify的问题,参见使用 只是在“使用”中的第二步之前首先要用cd进入magnify所在位置.

  10. 阿里云 oss 图片上传解决方案 vue (web直传)

    我们通过aliyun-oss-web这个npm去解决 该文章主要介绍如何获取 imgSignature 和 imgPolicy 这两个参数 首先下载 web直传的案例 : http://files.c ...