为何vSAN需要至少2n+1台主机,来防止n台主机出现故障(FTT=n)?

1. 允许故障数(FTT)

FTT(Number offailures to tolerate,允许的故障数)定义了虚拟机对象允许主机和设备故障的数量,默认值为1,最大值为3。如果FTT为n,则创建的虚拟机对象副本数为n+1,见证对象的个数为n,这样所需的用于存储的最少主机数等于n+1 + n = 2*n+1,即主机数= 副本数 + 见证数

若FTT值为1,表示最多允许一台主机出现故障,则副本数为2,此时主机数最少为3;当然,FTT的最大值为3,也即最多允许3台主机出现故障,最多有4份副本,最少需要7台主机。

如果不希望VSAN保护虚拟机对象的单个镜像副本,则可以将FTT指定为0,但是,主机在进入维护模式时,可能会出现异常延迟。发生延迟的原因是VSAN必须将该对象从主机中逐出,才能成功完成维护操作。将FTT设置为0,意味着你的数据不受保护,且当VSAN群集遇到设备故障时,你可能会丢失数据。


2. 副本

vSAN的副本(copies/replicas),与我们平常的理解不太一样。vSAN没有主数据的概念,同样的数据有三份,就是三份副本,而非一份主数据再加两份副数据。

2.1 FTT=1,需要3台以上的主机

为虚拟机分配存储资源时,如果未选择存储策略,则VSAN将使用默认的虚拟机存储策略,即FTT为1。下图就是FTT=1的示意图。

为何vSAN需要至少2n+1台主机,来防止n台主机出现故障(FTT=n)?

2.2 FTT=2,需要5台以上的主机

曾有用户质疑:“请解释vSAN三副本(FTT=2,也即最多允许2台主机出故障),为什么需要5台以上的主机?我们需要的不只是官方要求(官方文档中,允许最少主机数量=2n+1,n代表最多允许故障的主机数量),还需要知道具体的设计原理。“

其实这样做主要是为了防止脑裂。假设脑裂后分成两个断开的子集群,如果要保证某个子集群接管数据服务,则该子集群的主机数必须大于原集群主机数的50%。这也表明,主机的最小数量一定是一个奇数。

通俗来讲,四台主机不能处理两台主机出错,因为可能会出现脑裂。比如有四台主机A、B、C、D。如果出现网络分区,A和B不能联系C和D。这时外界看来只是两台主机出现故障,按照FTT=2的要求必须允许读写继续进行。两边都有两台主机,所以两边都觉得自己可以进行读写,这样就会造成两边的数据不一致(俗称脑裂)。解决脑裂的办法是必须要求能接管读写的子集群的主机数量大于原集群总数量的50%。集群主机总数是奇数,这样就不可能出现两个子集群都满足条件的情况了。

2.3 FTT=3,需要7台以上的主机

用户又问:“如果最多允许3台主机出故障,那么需要3+1台主机做副本节点,再加1台主机做见证(也即仲裁)节点,总数5台主机不就可以了吗,为何需要7台主机?“

之后我陷入了长长的思考,这使我想到为何不可以是2n-1,或者2n-3。我觉得可以总结成:假设n表示最多允许n台主机出故障,如果n+1台主机都放副本数据,这只能保证数据不丢失。而对于企业级存储而言,数据不丢失只是最低限度,除此之外,还需要保证数据的持续可访问,即HA。


3. 故障域

故障域是可能发生硬件故障的主机集合。故障域可以设为单台主机、一个stack的主机、整个机架的主机、一排机架的主机、一个数据中心的主机。

在VSAN中,如果已配置故障域,则需要2n+1个故障域,且这些故障域中具有可提供容量的主机。不属于任何故障域的主机会被视为自身的单个主机故障域。


4. SDS算法

大多数分布式存储/Server SAN采用的是Paxos算法。例如,华为FusionStorage,以及在SDS新书《软件定义存储:原理、实践与生态》里面提到的Ceph、青云HCI,也是采用Paxos算法。vSAN采用的是自己内部的算法,它的特点是与DOM紧密结合,比Paxos更加容错,确保在网络分区后仍可以继续运行,缺点是提供的语义不够一般化,不能象Paxos一样用于各种其他系统。

这些分布式算法都提到超过50%,可以理解为超过半数以上的*投票。


5. 参考文章

http://www.sohu.com/a/118828207_467813