你的数据有多安全?关于RAID你了解多少?

你的数据有多安全?关于RAID你了解多少?

随着电脑和智能手机的普及,很多人的数据越来越重要,工作学习资料,照片视频,聊天沟通记录等等。万一丢失,轻则花时间精力重新收集,重则永远无法找回。


很多人的个人数据并不多,用大容量U盘或者移动硬盘备份,或者直接上传到各种云盘网盘备份就可以了。但某些朋友因为工作关系或者兴趣原因,有大量的视频资料。一般的移动硬盘放不下,网盘容量也有限而且上传下载非常耗费时间,于是各种原来用于企业的RAID方案开始进入普通消费者的视线:主板集成RAID控制器、操作系统提供类似RAID的功能、外置磁盘阵列柜、家用NAS等等。


很多人对RAID的概念就是如果有一个硬盘坏了,数据不会丢失。真的是这样么?是不是就这么简单呢?


首先,我们先简单了解一下RAID。RAID,现在一般叫Redundant Array of Independent Disks,独立冗余磁盘阵列,以前叫Redundant Array of Inexpensive Disks,廉价冗余磁盘阵列。之所以叫廉价,是因为以前大容量磁盘比多个小容量磁盘贵的多,其实现在也是更贵一点的,但和以前相比也没有贵太多,一方面是磁盘容量便宜下来了,二来是最近磁盘的单盘容量增长陷入瓶颈,更大容量的磁盘和小容量磁盘的主要区别只是在盘片数量。而且早期磁盘阵列只有少量硬盘,发展到现在,几百上千个磁盘的阵列柜并不少见,自然这种阵列并不再廉价。而且随着服务器集群技术的成熟,多台服务器共用一个阵列的情况也很常见,阵列成为网络中一个独立的单位,而不再是单台服务器的专用存储设备。所以现在一般叫独立冗余磁盘阵列。


RAID分若干个级别:常见的有0、1、5、6。以及多个RAID再组成一个新的RAID,根据组合的不同,常见的有10、50和60(分别是多个RAID1/5/6再用RAID0的方式组成一个新的)。


具体的很多资料都有,这里简单再说一下。

RAID 0:需要2个以上硬盘,可以更多。一份数据按照一定大小拆开,平均分散存储在组成RAID 0的各个磁盘上,又称条带。容量是单个硬盘的N倍,持续读写速度也是单个硬盘的N倍。数据安全方面,如果一个硬盘坏了,整个阵列上的数据都会丢失。

RAID 1:通常只有两个硬盘,一份数据同时存储在两个硬盘上。容量和单个硬盘一样,写入性能和单个硬盘一样,读取性能是单个硬盘的两倍。数据安全方面,如果一个硬盘坏了,另外一个硬盘可以正常使用;用新硬盘替换掉旧硬盘可以重建RAID1。

RAID 5:需要3个以上硬盘,可以更多。一份数据按照一定大小拆开,并且按照特定的算法,每N-1份数据计算一份校验数据,拆分的数据和校验数据平均分散存储在组成RAID 5的各个磁盘上。容量是单个硬盘的N-1倍,持续读取速度是单个硬盘的N-1倍,持续写入速度要看RAID控制器的性能和写入策略,理论上最高写入速度可以达到单个硬盘的N-1倍。数据安全方面,如果一个硬盘坏了,阵列会降级为RAID0运行;用新硬盘替换旧硬盘可以重建RAID5。

RAID6:和RAID5类似,但多生成一份校验数据,也就比同等配置的RAID5多需要一块硬盘,而容量性能不变。如果一块硬盘坏了会降级为RAID5,两块硬盘坏了降级为RAID0。


其它:

  1. RAID3和RAID5类似,但是所有校验数据都写入到同一块硬盘上,某些特定的写入策略下,回导致校验盘频繁读写而缩短寿命,现在几乎看不到了。同样消失的RAID级别还有2和4,之所以提RAID3,是因为后面提到的SnapRAID和RAID3有一定程度的相似。
  2. 组合阵列理论上可以由任何两个级别组成,实际使用上一般是由多个带冗余的阵列再组成一个RAID 0。其中RAID10需要最少4个硬盘,RAID50需要最少6个硬盘,RAID60需要最少8个硬盘。
  3. 如果组成一个阵列的多个硬盘容量不同,上面所说的单盘容量按照容量最小的计算。也就说大容量硬盘多出来的空间会被浪费掉。
  4. 很多RAID控制器厂家支持RAID的动态迁移(升级),例如0->5, 1->5,5->6;或者动态增加磁盘,例如3盘RAID5增加1个磁盘成为4盘RAID5。动态迁移过程中RAID是可用的。


RAID5的重建失败概率

对于家用,受限于家用级别的机箱体积、厂家设计、噪音、主板接口(或者多端口RAID卡成本)、硬盘成本,很少有人搭建超过4盘的阵列。4盘阵列中,RAID10和RAID6的数据容量都只有两个硬盘容量,RAID0的数据风险又很大,所以很多人会偏向搭建RAID5。然而在3T、4T容量为主流,6T、8T硬盘的价格也能被家庭用户承受的今天,这并不是一个好的选择。


上面说了,RAID5允许一块硬盘失效,失效后可以替换一块新硬盘重建RAID5,然而这只是理论上的情况。在企业应用中,RAID5单盘失效后的正确操作流程是:不管它,此时阵列以RAID0级别运行,等到下班后,备份阵列上的数据。然后换新硬盘,删除旧阵列配置,重新构建阵列(不是自动重建),然后恢复备份上的数据。为什么不直接把新硬盘换上去重建?因为1、重建慢,2、重建有可能失败。


这里先说一下重建慢的问题,RAID5单盘失效降级为RAID0,并不能达到N-1盘RAID0的性能,而是大幅下降。通常做阵列的一个重要原因是为了保证单盘失效的时候数据是可用的(起码短时间内可能),所以除非这个时候是业务空闲期间,阵列可以马上离线进行重建,否则阵列本身性能下降,重建又会占用大量IO,会影响正常业务进行。同时,正常业务产生的IO也会拖慢重建速度。如果是高端的阵列卡/盘柜,并且阵列可以离线重建的话,这个重建速度通常可以接近新硬盘的持续写入速度,不过按照现在硬盘100~200MBps的速度范围(取平均值150MBps),写入3T数据也需要将近6个小时。如果数据量更多或者RAID卡/盘柜的重建性能较差,这个时间只会更长。


然后来解释为什么RAID5重建会失败,首先我们看一下硬盘的一个参数:URE(Nonrecoverable Read Errors,不可恢复读取错误),常见的希捷硬盘URE是以下情况:

  • 酷鱼、铁狼(4TB及以下型号):1/10e14
  • 酷鱼Pro、铁狼(6TB及以上型号)、铁狼Pro以及所有企业级硬盘:1/10e15

也就是说,酷鱼和小容量的铁狼硬盘,每读取1bit数据,有一百万亿(1后面14个零)分之一的概率出现不可恢复的错误。其他硬盘的概率是一千万亿(1后面15个零)分之一。磁盘读取错误产生的原因很多,磁盘盘片上的磁性单元失效,电路问题,宇宙射线,磁盘震动都有可能导致读取错误,不过每个磁盘扇区都有一段CRC数据可以用来纠错。然而纠错机制只能在一定范围内生效,单个扇区发生的错误多了就无法纠正了,这时就产生URE了。从数字上来看,这个概率还是很小的,然而当单个硬盘容量达到1TB,也就是10e12字节,8*10e12bit的时候,这就不是一个可以忽略的数字了。


既然是概率,再低也会有发生的时候,为什么一般人从来不会留意到呢?这是因为,硬盘上,占据空间最多的通常是照片、音乐、视频,就算是普通程序,也是界面上的图片资源占用的空间占大部分。当读取到1 bit错误数据的时候,可能导致的后果是照片/视频某一帧上某个像素偏红了点,播放的音乐中某个音调高了几赫兹——有几个人能感觉出来?当然,也有可能代表银行账上某个余额,从几百块变成几十亿——然而银行系统设计的时候就会考虑到这种错误或者有人手工改数据,余额变成几十亿不怕,只要你往外转钱,相关校验程序启动马上就能发现问题。


当4盘组成的RAID5单盘失效后重建的时候,需要从其它三个完好的硬盘上读取数据并根据校验算法逆向推算出失效硬盘的数据,以4块1T硬盘,使用了80%空间来算。需要读取3*8*10e12*80%=1.92*10e13 bit,根据概率学,这个时候发生URE的概率是1-(1-1/10e14)^(1.92*10e13)=17.46%。下表是两种URE硬盘,不同容量组成的4盘RAID5,空间使用率80%,单盘失效后重建过程中发生URE的概率:

而RAID通常是硬件实现的,RAID控制器不知道这个失效的位代表什么含义,最安全的做法是停下来——于是重建就失败了。对于4T硬盘组成的四盘RAID5,这个概率超过五成。


很多人对于这种因为1bit错误,导致几个T的阵列无法重建表示不理解,但硬件厂家也很无奈,万一这是某个重要数据呢?这个责任可背不起。


硬件不行软件上,Sun的ZFS文件系统就可以建立类似RAID5的RAIDZ,重建过程中碰到URE怎么办?文件系统可是知道这是个什么文件,跳过去重建其它文件的数据就好,回头写个报告告诉操作员某某文件重建失败就是了。


对于已经在使用RAID5的用户,万一真的有一个硬盘坏了怎么办?也不用太担心,数据本身还是在的,阵列也还是能用的,只是变成了RAID 0而已。这个时候需要做的,先把重要数据拷贝出来,剩下的,能重建就重建,重建不过去就删配置重新建RAID。只是对于家庭用户来说,如果没有那么大的空间备份,没备份的数据只能忍痛放弃了。


而打算使用RAID的用户,条件许可的话,为了免除这种麻烦,最好还是建RAID 10,或者RAID 6(如果RAID卡/NAS支持),如果觉得RAID 10/6过于浪费空间,可以考虑使用更多的硬盘来摊低单位存储成本。如果熟悉*nix的,自行搭建支持ZFS的NAS,使用RAIDZ。


不打算弄NAS或者不会用*nix的,可以找一个叫SnapRAID的工具,可以在Windows下使用,SnapRAID本身是命令行工具,有一个图形界面工具叫Elucidate(我个人没用过,似乎还不是很成熟)。SnapRAID的原理是类似于文件级的RAID 3,但不是每次读写数据的时候都进行校验,而是需要手动生成校验数据。所以如果某个硬盘坏了,上次生成校验数据后新增加的文件或者修改过的文件是无法恢复的,比较适合一般家庭大部分文件很少更新的情况。另外,SnapRAID可以支持多个不同容量的硬盘而不会浪费空间,随时可以增加硬盘,硬盘数量太多了也可以增加校验盘,每增加一个校验盘可以允许多一个硬盘同时失效。对于做过校验的文件,万一误删除或者改错了,也可以直接恢复。这些特性都比较符合家庭使用的场景。有兴趣的可以找一下相关资料。

编辑于 2017-12-19