ZFS文件系统(5) -- 标准的奇偶校验RAID

标准的奇偶校验RAID

要理解RAIDZ,那么就得首先理解那些基本的RAID,比如RAID-5和RAID-6,让我们来看看RAID-5的布局,你至少需要3个磁盘来实现,在其中的2个磁盘上,数据的条带化的,奇偶校验位Dp = D1 Xor D2 得到,然后将Dp校验位写入磁盘,这样,可以通过计算,恢复原来的数据。此外,并没有单独的将一个盘用来存储RAID校验,而是分布在各个系统中,因此,当之中的任何一块磁盘受损,通过计算都是可以恢复数据的。

然而,还有一个问题,当你在写入这份数据,突然断电,奇偶校验位还没有写入,这时候就会造成数据的不一致,ZFS文件系统的创建者Jeff Bonwick指出,这是一个写入漏洞“Write hole”,实际上,他确实是一个问题,尽管是个小问题。在所有的带有奇偶校验的RAID阵列中,只要在写一块数据时,没有把校验位写到磁盘,那么就是一个写入漏洞。最糟糕的就是,使用软件的手段,基本上不知道怎么规避这个错误。有的软件通过变通来识别这种不一致的数据,但是他们非常的慢,而且还不可靠。由于这些原因,管理员们已经降低了对软RAID青睐,大部分的愿意使用(昂贵的,容易出现故障的)硬件卡,使用他上面的电池来进行备份。

还有一个大的性能问题需要解决,如果需要写入的数据大小小于条带的大小,那么需要从条带的其他部分读出,并且需要重新计算奇偶校验,这将导致读取和写入到应用程序是毫无关联的。读只需要读活着的运行的数据,而不是花大量的时间去处理一些死的数据,或旧的数据。因此,需要一个昂贵的,带有电池的NVRAM硬件RAID卡来隐藏这个延迟,使用NVRAM缓冲区来填满条带,直至被刷入磁盘。

由于这些原因,RAID5的写入漏洞和性能问题,他不可能成为ZFS的RAID解决方案,所以我们重新考虑了一种新的奇偶校验RAIDz。


ZFS RAIDZ

开始介绍RAIDZ,他的条带宽度不是在创建的时候定义的,而是一个动态的宽度,事务刷新到磁盘中的每一个块都是他自己的宽度,每一个RAIDZ的写入,都是一个完整的磁条写,所以校验位会随着元数据一起刷入磁盘,这样就解决了RAID-5的写入漏洞,也就是说,当电源突然断电之际,你的磁盘要么是全部的写入数据,要么就完全没有被写入,这样就保持了数据的一致性。

下图就是RAID-5和RAIDz校验位分布示意图

ZFS文件系统(5) -- 标准的奇偶校验RAID_第1张图片

标准的RAID采用的奇偶校验,逻辑十分简单,每个磁盘Xor为0,由于存在动态的条带宽度,比如RAIDZ,这种简单的方式根本不起作用,要实现那种效果,我们必须拉起zfs的元数据以确定每次读到的RAIDZ大小,如果你仔细观察,会知道这根本就是不可能的,如果你的文件系统和RAID是独立的产品,那么这时候,你的RAID卡将不会知道文件系统的变化,反之毅然。

这就是ZFS伟大之处,因为ZFS了解底层的RAID,在这方面性能不是问题,除非磁盘已满。当读取文件系统的元数据时,意味着他读取的是活着的数据,正在使用的数据,不需要担心是死数据,或者未分配的磁盘,所以,在遍历元数据时,在某些方面反而更快,这时候,你并不需要昂过的NVRAM来缓冲写,也不需要使用备用电池来预防写入漏洞。ZFS让我们回归到原始的“廉价的磁盘冗余阵列”,而且ZFS建议您使用廉价的SATA磁盘,而不是昂贵的光纤通道或者SAS磁盘。

你可能感兴趣的:(ZFS文件系统)