分布式系统基础:网络分区

分布式系统永远离不开对网络分区的考虑,大名鼎鼎的CAP定理更是指出有P的情况下,只能A和C二选一,虽然CAP的提出人Brewer在2012年又写文章说大家对CAP是有误解的,尤其是三选二,但这不在讨论范围,我们只探究下网络分区。

下图来自Wiki。

定义

WIKI给的定义是:网络分区指由于网络设备的failure,造成网络分裂为多个独立的组

Gilbert和Lynch在论文中定义分区容忍性的:网络允许丢失一个节点发给另一个节点的任意多的消息

我认为Gilbert和Lynch给的更有通用意义,因为造成网络分区的不仅仅是网络设备的failure,两个节点无法再交互的时候就形成分区了,分区原因有:

  • 网络设备failure:比如网线断了,交换机故障了。
  • 节点failure:节点的软件或者硬件坏了,节点成为故障节点。当故障的节点非常多,故障节点和正常节点就不在1个分区,如果正常的节点数量达不到quorum,分布式系统无法正常运作。

所以我认为网络分区的原因即有Network failure又有Node failure。

网络分区和网络模型

我们考虑下网络分区的检测。

  • 同步网络下,橘黄色节点和青色节点间的通信中断,就当网线断裂好了,节点向对方发送的消息如果在超时时间内没有收到响应,就可以认为消息丢失,形成了网络分区。
  • 异步网络下,通信差是一种常态,消息的传递是非常不可靠的,消息无限延时,也可能丢失,根本无法确认消息是否到达对方节点,所以也无法确认/检测是否形成分区。