分布式存储系统需要考虑的因素较多,包括业务稳定性、负载均衡、数据可靠性、数据安全等,其中数据可靠性是其中一个重难点。
可靠性(Reliability)是一个概率值,指某个设备或系统在一个指定的时间内能够无故障的持续稳定运行的可能性。可靠性是一个随时间变化的函数,时间越长,可靠性越低。而数据可靠性,指数据随着时间的变化,数据是否可用,是否可读,在常规的分布式存储系统中,保障数据可靠性的方法一般有如下3种:
- RAID:利用本地磁盘,采用raid0或raid5等算法,进行数据的计算,并将计算后的数据存储至本地磁盘,在磁盘异常后,将数据从其他磁盘中读取,并利用某种算法重新计算,恢复出丢失数据;
- 多副本:将数据在存储集群中保存多份,做到数据跨节点保护;
- Erasure Code技术:利用Erasure Code技术,计算用户数据对应的校验数据,并将用户数据与校验数据分别存储至集群的存储设备中,若发生机器宕机,可以根据校验数据与当前还存在的数据,将丢失的数据重新计算出来,保障数据可靠性。
1. RAID
RAID( Redundant Array of Independent Disks ),即独立磁盘冗余阵列,其基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能、可靠性,目前RAID 技术作为高性能、高可靠的存储技术,已经得到了非常广泛的应用。
RAID主要分为软RAID、硬RAID以及软硬混合 RAID 三种。软RAID所有功能均有操作系统和CPU来完成,没有独立的RAID控制器/处理芯片和I/O处理芯片,效率自然最低。硬RAID配备了专门的RAID控制器/处理芯片和I/O处理芯片以及阵列缓冲,不占用CPU资源,但成本很高。软硬混合RAID具备RAID控制/处理芯片,但缺乏I/O处理芯片,需要CPU和驱动程序来完成,性能和成本在软RAID和硬RAID之间。
RAID主要利用数据条带、镜像和数据校验技术来获取高性能、可靠性、容错能力和扩展性,根据运用或组合运用这三种技术的策略和架构,可以把RAID分为不同的等级,以满足不同数据应用的需求,业界公认的七个标准等级为:RAID0、RAID1、RAID2、RAID3、RAID4、RAID5、RAID6 。
下面分别介绍七个RAID标准等级。
1.1 RAID0(条带)
RAID0 是一种简单的、无数据校验的数据条带化技术,将所在磁盘条带化后组成大容量的存储空间,将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并发访问。RAID0 具有低成本、高读写性能、100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复,如下图所示:
1.2 RAID1(镜像)
RAID1将数据完全一致地分别写到工作磁盘和镜像磁盘中,它的磁盘空间利用率为50% 。RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作。RAID1 拥有完全容错的能力,但实现成本高。
1.3 RAID2(纠错海明码)
RAID2设计思想是利用海明码实现数据校验冗余。海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2^n 位( 1, 2, 4,… )是校验码,其他位置是数据码。因此在 RAID2 中,数据按位存储,每块磁盘存储一位数据编码,磁盘数量取决于所设定的数据存储宽度,可由用户设定。如下图所示:数据宽度为 4,需要4块数据磁盘和 3 块校验磁盘。RAID2数据冗余开销太大,数据重建耗时长,但纠错能力和数据安全性较好。
1.4 RAID3(专用奇偶校验)
RAID3是使用专用校验盘的并行访问阵列,它采用一个专用的磁盘作为校验盘,其余磁盘作为数据盘,数据按位可字节的方式交叉存储到各个数据盘中。一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。阵列的存储空间利用率高,再加上可以并行访问的特性,能够为高带宽的大量读写提供高性能,适用大容量数据的顺序访问。整体的数据容错能力和安全性较高。
1.5 RAID4(奇偶校验)
RAID4与RAID3的原理大致相同,区别在于条带化的方式不同。 RAID4按照块的方式来组织数据,写操作只涉及当前数据盘和校验盘两个盘,多个 I/O 请求可以同时得到处理,提高了系统性能。 RAID4 按块存储可以保证单块的完整性,可以避免受到其他磁盘上同条带产生的不利影响。
1.6 RAID5(分布奇偶校验)
RAID5的原理与 RAID4 相似,区别在于校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘。对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。因此, RAID5不存在RAID4中的并发写操作时的校验盘性能瓶颈问题。RAID5有很好的扩展性,当磁盘数量增加时,并行操作量的能力也随之增长,可比 RAID4 支持更多的磁盘,从而拥有更高的容量以及更高的性能。RAID5 兼顾存储性能、数据安全和存储成本等各方面因素,它可以理解为 RAID0 和 RAID1 的折中方案,是目前综合性能最佳的数据保护解决方案。
1.7 RAID6(双重奇偶校验)
RAID6可以保护阵列中同时出现两个磁盘失效时,阵列仍能够继续工作,不会发生数据丢失。RAID6 不仅要支持数据的恢复,还要支持校验数据的恢复,因此实现代价很高,控制器的设计也比其他等级更复杂、更昂贵。 RAID6 思想最常见的实现方式是采用两个独立的校验算法,假设称为 P 和 Q ,校验数据可以分别存储在两个不同的校验盘上,或者分散存储在所有成员磁盘中。当两个磁盘同时失效时,即可通过求解两元方程来重建两个磁盘上的数据。具有快速的读取性能、更高的容错能力。但是,它的成本要高于 RAID5 许多,写性能也较差,并有设计和实施非常复杂。
1.8常见RAID组合
1.8.1 RAID01
RAID01兼备了 RAID0 和 RAID1 的优点,它先用两块磁盘建立RAID0,然后再通过RAID0做镜像。 RAID01 的数据将同时写入到两个磁盘阵列中,如果其中一个阵列损坏,仍可继续工作,保证数据安全性的同时又提高了性能,缺点是不能两个阵列同时损坏磁盘。
1.8.2 RAID10
RAID10兼备了 RAID1 和 RAID0 的优点,它先用两块磁盘建立RAID1,然后再在通过RAID1做条带化。RAID10 的数据将同时写入到两个磁盘阵列中,如果其中一个阵列损坏,则数据丢失,但相对RAID01来说,同一个阵列损坏比不同阵列中磁盘损坏的几率更小,所以RAID10相对来说更安全。
1.9 RAID总结
2. 多副本
在传统存储系统中,数据可靠性完全依赖本地RAID,即独立磁盘冗余阵列,其基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而提升本地数据可靠性,但是对于大规模数据中心、云计算等应用来说,数据如果仅本地可靠,阵列损坏时,会对用户数据造成不可估量的损失。
数据多副本,与其字面含义一致,数据被保存了多个副本,但是这多个副本是存储在不同的机器中,若集群中发生节点宕机时,此时集群还有其他的副本数据可供读取更新,用户数据未发生丢失,数据多副本,主要面临2个难题:数据副本放置策略、数据一致性。
2.1 数据副本放置策略
在分布式存储系统中copyset的数量不是越多越好,在恢复时间确定的情况下,找到合适的copyset的数量可以降低数据丢失的概率,同时提升了数据读写服务恢复的时间。为了提高存储系统数据可靠性,首先在系统允许的成本范围内选择合适的副本数,再次在系统设计中我们首先优先考虑加快数据恢复时间,在此基础上减小系统的copyset数量。使得在既定的成本下达到尽可能高的可靠性。当前副本放置策略主要分为3种:Random Replication、Random Relication With Failure Domain、CopySet Replication。
2.1.1 副本随机放置策略:Random Replication
副本随机放置策略,1个大文件分为很多chunk(或称为block),chunk的大小比如64M, chunk的放置并没有什么限制,每个chunk数据的放置基本是按照随机策略进行,当然也可能会考虑容量的均衡,但是基本上是属于一种随机策略。
2.1.2 机架感知的副本放置策略:Random Relication With Failure Domain
如上这种机架感知的副本放置策略情况下,主要的设计原因为保障数据可用性,在一个机架端点或者故障情况下,还有其他机架上的数据还是可用的。如图中所述,放置策略为:一个副本放置在本节点,第二个副本放置在remote Rack的节点上,第三个副本放置在remote Rack 的另外一个节点上,如果还有其他副本,其他副本随机放置。
2.1.3 算法放置策略:CopySet Replication
从上面两种放置策略可以基本得出较为单一的结论:放置方式越多,数据越分散,发生R节点故障时,数据丢失概率越大。当然并不是说放置方式越少越好,最小的方式直接组织磁盘为RAID 0 mirror 方式,但是这种情况下数据恢复时间较长,从而会进一步加大数据丢失概率。
在异常情况下数据恢复速度与数据写入的节点数有关,节点数越多,数据恢复速度越快。如何做到数据写入的节点数最多?CopySet Replication 算法解决了这个问题。其实算法原理很简单,看下下面这张图就成,算法根据系统节点数,和副本数量,进行多个轮次的计算,每一轮次把所有节点按照副本数划分为 N/R 个copyset。每次确保其中的copyset 不与当前和之前所有轮次中已经产生的copyset相同,最后数据写入的时候,选择一个copyset 写入即可。 由于每个排列会吧S(Scatter Width) 增加R-1,所以 算法执行P = S/(R-1) 次, K(CopySet数量) = P (N/R) = S/(R-1) (N/R)
相比前两种策略,CopySet Replication在保障恢复时间的基础上能够得到最佳的数据分布策略。另外在随机放置情况下,其实如果使用小文件合并成大文件的存储策略,可以通过控制大文件的大小,从而控制每个磁盘上大文件的数量,比如100G一个文件,8T盘上的最大文件存储数量也就是8T/100G = 80个文件,显然也就是能够很好的控制一个数据盘的数据打散程度,但是相对而言CopySet Replication 更多的是一种较为通用的算法,而这种算法更多的是适用于特定构架的分布式存储系统,即小文件合并成大文件。
2.2 数据一致性
在分布式系统中,选择采用多副本方案,就要面对数据一致性问题;数据一致性主要是指在多副本的情况下,如何保证各个副本间数据的一致性。数据的一致性是一个很难解决的问题,受CAP【C:一致性,A:可用性:,P:分区容忍性】原则的限制,同时只能满足其中两项指标。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
对于一致性我们需要根据不同的业务场景进行选择,而多副本情况下的读写一致性,主要分为如下几种:
- 一主多从:只读副本保证强一致性
- 对等副本:W+R>N保证绘画一致性
在实现数据一致性的方案中,一般分为如下2种:
- 链式复制
采用链式请求,只有所有的副本都保存成功,才能返回成功;
优点:能够保证数据的强一致性
缺点:性能较差,整个更新过程依赖于所有节点的成功
- 多扇出方式
采用多扇出的方式,主节点保存成功,然后同时向多个副本发送数据;
优点:性能较好,时间取决于主节点的保存时间和副本中最长的保存时间
缺点:严重依赖主节点,高扇出,数据量大时对网络有压力。
3. Erasure code技术
副本策略和纠删码是存储领域常见的两种数据冗余技术。相比于副本策略,纠删码具有更高的磁盘利用率。 Reed-Solomon码是一种常见的纠删码。
多副本策略即将数据存储多个副本(一般是三副本,比如HDFS),当某个副本丢失时,可以通过其他副本复制回来。三副本的磁盘利用率为1/3。
纠删码技术主要是通过纠删码算法将原始的数据进行编码得到冗余,并将数据和冗余一并存储起来,以达到容错的目的。其基本思想是将n块原始的数据元素通过一定的计算,得到m块冗余元素(校验块)。对于这n+m块的元素,当其中任意的m块元素出错(包括原始数据和冗余数据)时,均可以通过对应的重构算法恢复出原来的n块数据。生成校验的过程被成为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。磁盘利用率为n/(n+m)。基于纠删码的方法与多副本方法相比具有冗余度低、磁盘利用率高等优点。
Reed-Solomon(RS)码是存储系统较为常用的一种纠删码,它有两个参数n和m,记为RS(n,m)。n代表原始数据块个数。m代表校验块个数。接下来介绍RS码的原理。
以n=5,m=3为例。即5个原始数据块,乘上一个(n+m)*n的矩阵,然后得出一个(n+m)*1的矩阵。根据矩阵特点可以得知结果矩阵中前面5个值与原来的5个数据块的值相等,而最后3个则是计算出来的校验块。
以上过程为编码过程。D是原始数据块,得到的C为校验块。
假设丢失了m块数据。如下:
那我们如何从剩余的n个数据块(注意,这里剩余的n块可能包含几个原始数据块+几个校验块)恢复出来原始的n个数据块呢,就需要通过下面的decoding(解码)过程来实现。
第一步:从编码矩阵中删去丢失数据块和丢失编码块对应行。 将删掉m个块的(n+m)1个矩阵变形为n1矩阵,同时B矩阵也需要删掉对应的m个行得出一个B’的变形矩阵,这个B’就是n*n矩阵。如下:假设D1、D4、C2丢失,我们得到如下B’矩阵及等式。
第二步:求出B’的逆矩阵。
第三步:等式两边分别乘上B’的逆矩阵。
B’和它的逆矩阵相乘得到单位矩阵I,如下:
左边只剩下原始数据矩阵D:
至此完成解码过程。
注:图中黄色部分为范德蒙矩阵。至于如何生成B矩阵,以及如何求B’的逆矩阵,这里不再赘述。
EC编码能很好的解决多副本带来的容量开销问题,但是对于数据恢复来说,代价过高,EC在数据恢复时,需要读取元数据,并进行密集型计算,之后才能将数据进行恢复,对比多副本恢复方式,逻辑复杂,计算量高,且EC对于数据更新支持的不友好,故对于热数据,还需结合多副本策略,待热数据转冷后,在利用EC方法,将其存储至存储介质中。
4. 数据可靠性技术对比总结
在分布式系统中,采用何种策略进行数据的保护,还需结合自身业务与场景进行评估。