Lecture 06 - Raft
# 1. 脑裂(Split Brain)
前面介绍的几个具备 fault-tolerant 特性的系统都具有一个共同的特点:
- MapReduce 复制了计算,但整个 MapReduce 都被一个单主节点控制
- GFS 依赖一个单主节点 master 来控制每一份 chunk 的主拷贝位置
- VMware FT 需要一个 test-and-set 服务来确认 primary VM 是谁
这三个例子中,它们都是一个多副本系统(replication system),但是在背后,它们存在一个共性:它们需要一个单节点来决定,在多个副本中,谁是 primary。
使用单节点的好处是它不会否认自己的决策,缺点是产生了单点故障(Single Point of Failure)。
所以,你可以认为我们前面介绍的这些系统,它们将系统容错的关键点,转移到了这个单点上。这个单点,会在系统出现局部故障时,选择数据的主拷贝来继续工作。使用单点的原因是,我们需要避免脑裂(Split-Brain)。当出现故障时,我们之所以要极其小心的决定数据的主拷贝,是因为,如果不这么做的话,我们可能需要面临脑裂的场景。
脑裂问题是上世纪80年代之前要面临的挑战,那时的人们在构建多副本系统时,需要排除脑裂的可能,当时主要有两种技术:
- 第一种是构建一个不可能出现故障的网络。其实我们的电脑中连接了 CPU 和内存的线路就是不可能出现故障的网络。所以,带着合理的假设和大量的资金,同时小心的控制物理环境,比如不要将一根网线拖在地上,让谁都可能踩上去。如果网络不会出现故障,这样就排除了脑裂的可能。这里做了一些假设,但是如果有足够的资金,人们可以足够接近这个假设。当网络不可能出现故障时,那就意味着,如果客户端不能与一个服务器交互,那么这个服务器肯定是关机了。
- 另一种就是人工解决问题,不要引入任何自动完成的操作。默认情况下,客户端总是要等待两个服务器响应,如果只有一个服务器响应,永远不要执行任何操作。相应的,给运维人员打电话,让运维人员去机房检查两个服务器。要么将一台服务器直接关机,要么确认一下其中一台服务器真的关机了,而另一个台还在工作。所以本质上,这里把人作为了一个决策器。而如果把人看成一台电脑的话,那么这个人他也是个单点。
所以,很长一段时间内,人们都使用以上两种方式中的一种来构建多副本系统。这虽然不太完美,因为人工响应不能很及时,而不出现故障的网络又很贵,但是这些方法至少是可行的。
编辑 (opens new window)
上次更新: 2023/09/29, 16:03:57