ZFS文件系统(6) -- 自我恢复RAID

自我恢复RAID

       这个给了我一个简单而又强大的理由,让我立马为之折服,ZFS可以自动的检测发生的错误,而且,可以自我修复这些错误。假设有一个时刻,磁盘阵列中的数据是错误的,不管是什么原因造成的,当应用程序去访问这一块数据时,ZFS会像上一篇介绍的一样通过构建每一块数据,并且通过SHA-256方式校验每一块数据的校验位,如果发现数据读条带数据不能匹配校验,那么就会认为是发生了数据损坏,然后通过奇偶组合方式进行恢复这一块数据,然后返回给调用他的应用程序。这一切都是由ZFS文件系统自身来完成,无需借助特殊的硬件。另外一方面,如果条带长于磁盘阵列,如果一个磁盘发生了故障,这里就没有足够的奇偶校验可以来重建这些数据,所以我们还必须为此添加一块镜像盘以防止此类情况的发生。

      如果你的文件系统和RAID是分别独立的,他们互相不了解对方,那么这种静默式的修复是完全不可能的。


RAIDZ-1

      RAIDZ-1和RAID-5是很相似的,有一个单一的奇偶校验位位于所以的磁盘阵列中,而且条带的宽度都是可变的,基本可以涵盖所有的磁盘阵列的宽度,可以是很多的磁盘,或者很少的磁盘,在上一节的图片说的很明显了,他们都允许一个磁盘发生故障时对他进行修复,RAIDZ-1也最少使用3个磁盘,您的存储容量是最小磁盘的容量大小减去磁盘存储的奇偶校验位大小,在一下的例子中,我会使用大约16G的磁盘。

      要设置一个存储池采用一个RAIDZ-1,我需要3个USB磁盘驱动器。

# zpool create tank raidz1 sde sdf sdg
# zpool status tank
  pool: pool
 state: ONLINE
 scan: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        pool          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            sde       ONLINE       0     0     0
            sdf       ONLINE       0     0     0
            sdg       ONLINE       0     0     0

errors: No known data errors

# zpool destroy tank

RAIDZ-2

      RAIDZ-2和RAID-6十分相似,他采用双奇偶校验位进行校验,分布在阵列中的所有磁盘中,条带的宽度也是可变的,可以涵盖磁盘阵列的确切的宽度,很少的磁盘,或者很多的磁盘。由于采用双奇偶校验,所以可以允许最多2个磁盘发生故障,超过就会导致数据丢失,为了成功搭建RAIDZ-2,必须要至少4个磁盘,您的磁盘存储容量是最小的那个磁盘容量减去两个存储奇偶校验位的大小,在例子中,我使用了大约16G的磁盘。

通过以下步骤来设置RAIDZ-2

# zpool create tank raidz2 sde sdf sdg sdh
# zpool status tank
  pool: pool
 state: ONLINE
 scan: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        pool          ONLINE       0     0     0
          raidz2-0    ONLINE       0     0     0
            sde       ONLINE       0     0     0
            sdf       ONLINE       0     0     0
            sdg       ONLINE       0     0     0
            sdh       ONLINE       0     0     0

errors: No known data errors

# zpool destroy tank

RAIDZ-3

      他并不能称为一个标准的RAID,不过可以看着是RAIDZ-1和RAIDZ-2的延伸,基本概念和RAID-1/2是一致的,只不过他拥有3组奇偶校验位,他可以允许至多3个磁盘数据丢失,要搭建他至少需要5个磁盘,他的存储容量为最小盘容量减去3个奇偶校验位产生的存储容量,在例子中,我使用了16G磁盘。

      使用以下步骤设置RAIDZ-3

# zpool create tank raidze sde sdf sdg sdh sdi
# zpool status tank
  pool: pool
 state: ONLINE
 scan: none requested
config:

        NAME          STATE     READ WRITE CKSUM
        pool          ONLINE       0     0     0
          raidz3-0    ONLINE       0     0     0
            sde       ONLINE       0     0     0
            sdf       ONLINE       0     0     0
            sdg       ONLINE       0     0     0
            sdh       ONLINE       0     0     0
            sdi       ONLINE       0     0     0

errors: No known data errors

# zpool destroy tank

关于RAIDZ最后一些想法

      对于什么时候使用RAIDZ-1/2/3我没有什么建议,有些人说,RAID-1和RAID-3应该使用在奇数个磁盘上,RAID-1的使用实在3个磁盘以上,7个磁盘一下使用,而RAID-3则实在7个磁盘以上时使用,不超过15个。RAIDZ-2应该使用偶数个磁盘上,最少6个磁盘,不超过12个的时候。这是为了确保你的偶数数据被写入到磁盘中时,阵列的性能最大化。

       相反,在我看来,你应该保持一个低消耗的RAIDZ阵列,对与RAIDZ-1来说,3、5、9个磁盘比较合适,4、6、10、18对于RAIDZ-2比较合适,而RAIDZ-3则应该是5、7、11、19个磁盘最佳,如果不这么做,我个人宁愿使用RAID-1+0来实现RAID,因为在很多磁盘的时候,和RAID-10对比,去计算他的RAIDZ的奇偶校验代价真是太昂贵了。

      此外,我还看到一些这样的建议,不超过1TB的磁盘使用RAIDZ-1,2TB的磁盘使用RAIDZ-2,3TB的磁盘使用RAIDZ-3,而超出这些值时,你应该使用2路或者3路镜像条带化。我不能评价这些说法的准确性等,不过,我可以说的就是,在较少的磁盘数量时,你应该使用一个RAID级别容纳你现在的缺点,这是不会错误的。在4个磁盘中,使用多个奇偶校验会让你牺牲大量的性能,但是如果我也遇到过2个磁盘同时失效的情况(这情况可以使用RAID-10或者RAIDZ-2来修复),这时候,既不能大量的消耗性能,也不能丢弃正确性,采用RAIDZ-1是很合适的,他可以承受一个磁盘发生故障,同时也不消耗大量的性能。当然,如果你有12个磁盘,那我认为,RAIDZ-3会更合适,因为他可以承受更多的磁盘发生故障而不造成数据丢失。

      最终,你还是需要了解你自己本身磁盘的情况、数量,还有需要面临的问题,然后选择不同RAID方案,并使用合适的工具测试,比如IOZONE进行压力测试等。你知道要存入的是什么数据,你要知道在磁盘上安装什么硬件,你还要知道你需要达到一个什么样的效果,这些都有你来决定,如果你肯花时间来研究,做许多的功课,那么你一定可以搭配出一套最佳的方案。

      最后,在性能方面,镜像在读写时要强于RAIDZ,RAIDZ-1的表现又强于RAIDZ-2,他的打开表现将优于RAIDZ-3,你去读取或写入数据时,越多的校验位需要计算,那么时间就越长,当然,你可以随时的添加或者拆分VDEVS来让这个数据最优。例如嵌套级别的RAID(RAID-10),他具有很强大的灵活性。总之,从快到慢,非嵌套级别的RAID顺序如下:

RAID-0 (fastest)

RAID-1

RAIDZ-1

RAIDZ-2

RAIDZ-3 (slowest)

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