rabbitmq之网络分区

作者 Billy 日期 2017-06-13
rabbitmq之网络分区

rabbitmq之网络分区

在rabbitmq高可用测试过程中,由于对其中一节点所在虚拟机进行开关机等操作,导致rabbitmq集群不可访问,在管理页面中发现如下提示:

rabbitmq网络分区

提示 “检测到网络分区“,经过对图片中超链接的阅读,发现这是由于在虚拟机运行rabbitmq节点时,被执行挂起/恢复操作导致的。

网络分区会影响什么

当网络分区存在于集群中时,被分区分开的节点会各自独立运行,彼此认为对方是异常的。队列、绑定、交换机都可以被分别创建、操作,互不影响。若连接到多个分区的连接没有中断的话,队列消息就会入到多个网络分区中的队列中,直到问题修复为止。

什么引起的网络分区

当我们说到“网络分区”,实际上是指集群中某个节点与异常节点访问中断造成的分区。网络异常、操作系统的暂停、恢复都会引起这种情形,换句话说异常节点并没有意识到自己是异常的,甚至是服务停止,但是集群中其他节点却认为它是异常的。

如何修复

想要修复,多个网络分区中必须选择一个最值得信任的分区,修复过程中其他分区与之相异的部分都会被丢弃。

重启所有不信任分区中的所有节点,当它们重新加入集群时(自动加入),数据就会恢复。

最后,应该重启所有节点,以清除由于网络分区引起的警告。

自动修复分区

若无法避免虚拟机挂起/恢复操作,就必须找到自动处理分区的方法。

RabbitMQ提供了3种模式来自动处理网络分区:

  • 暂停最小值模式 - pause-minority mode
  • 指定节点优先保留模式 - pause-if-all-down mode
  • 自动治疗模式 - autoheal mode

pause-minority mode

采用暂停最小值模式,当网络分区出现时,rabbitmq会主动暂停节点个数少于或等于总节点数一半的分区。
这种模式当节点数为2:2时,会暂停所有的节点。

pause-if-all-down mode

采用指定节点优先保留模式,需要指定保留的节点,与暂停最小值模式相近,rabbitmq主动暂停时会优先选择指定节点保留,其余分区的节点做暂停处理。

当指定节点处于多个网络分区时,所在的分区没有节点会被暂停,这样就会出现问题。因此该模式选择还有一个参数,来表明出现这种情况是采用什么模式: 忽略 OR 自动治疗。

autoheal mode

采用自动治疗模式,rabbitmq会自动重启一个分区以外的所有节点,从而自动恢复到原来状态。

选择分区就成了决定数据存亡的重要决策,rabbitmq以分区内节点个数为依据,包含节点最多的分区会得以保留,其他分区的所有节点会被重启,其上的数据被同步。

ignore

当然,rabbitmq默认的忽略模式,若出现网络分区,那么系统就会逐步崩溃。

如何选择

如果网络相当可靠,可以选择默认的忽略模式 ignore。
如果网络不是那么的可靠,但可以容忍集群里有1个或极少数节点不工作,这些节点在重返集群时不会影响数据,那么可以选择暂停最小值模式。
如果网络不可依赖,相比数据的完整性,你更加关心服务的持续性,那么可以选择自动治疗模式,并且集群中只有2个节点。

配置方法

/etc/rabbitmq/rabbitmq.conf配置文件里,查找关键字cluster_partition_handling

%% {cluster_partition_handling, ignore},

把前面注释去掉,将ignore更改为:

pause_minority
{pause_if_all_down, [nodes], ignore | autoheal}
autoheal

其中一个。