ZFS存储池结构

使用ZFS卷管理器创建ZFS存储池时,可以指定存储池结构(Volume Layout),也就是指定存储池所采用的软磁盘阵列的类型。不同类型的磁盘阵列类型,面向不同的使用场景,性能和可靠性亦是各不相同。使用FreeNAS的卷管理器可以看见FreeNAS系统中可以设置的所有ZFS存储池结构,下面介绍一下Volume Layout设置中每个选项的意思。

ZFS存储池介绍:Stripe、Mirror、RAIDZ和高速缓存

  • Stripe:与RAID0类似,磁盘带条,至少需要一个磁盘;
  • Mirror:与RAID1类似,磁盘镜像,至少需要两个磁盘;
  • RAIDZ1:与RAID5类似,一重奇偶校验,至少需要三个磁盘;
  • RAIDZ2:与RAID6类似,双重奇偶校验,至少需要四个磁盘;
  • RAIDZ3:ZFS特有的,三重奇偶校验,至少需要五个磁盘;
  • Log(ZIL):高速写缓存设备,至少需要一个专用设备,建议使用具有停电保护的SSD;
  • Cache(L2ARC):高速读缓存设备,需要至少一个专用设备,建议使用具有停电保护的SSD;
  • Spare:热备磁盘,当正在使用的磁盘发生故障后,Spare磁盘将马上代替此故障盘。

性能对比

Stripe > Mirror

Stripe > RAIDZ1 > RAIDZ2 > RAIDZ3

数据可靠性

Mirror > Stripe

RAIDZ3 > RAIDZ2 > RAIDZ1 > Stripe

详细说明

Stripe是把连续的数据分割成相同大小的数据块,把每段数据分别写入到阵列中的不同磁盘上的方法。简单的说,条带是一种将多个磁盘驱动器合并为一个卷的方法。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。但是,这种存储池结构没有数据冗余,一旦Stripe中的任意一块磁盘出现问题,那么Stripe中存储的所有数据都随风而去了。

Mirror是冗余的一种类型,通过磁盘数据镜像实现数据冗余,ZFS对镜像中的磁盘数量没有限制,在Mirror中的磁盘上存储互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此Mirror可以提高读取性能。这是存储池结构中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,此时可以替换失效磁盘进行数据恢复。

RAIDZ是ZFS提供的数据冗余方式,同时解决硬件RAID的一些固有限制,例如在硬件控制器提供警报之前随时间写入的写入漏洞和损坏数据。ZFS提供三种冗余级别,称为RAIDZ*,其中RAIDZ之后的数字表示每个vdev可丢失多少个磁盘而不丢失数据。下面是一些关于RAIDZ的官方建议:

  • RAIDZ1拥有最大的磁盘空间,当数据以大块(128K或更多)写入和读取时,性能会很好。
  • 与RAIDZ1相比,RAIDZ2提供更好的数据可用性和更好的平均数据丢失时间(MTTDL),而RAIDZ3更比RADIZ2安全。更多的校验镜像消耗更多的磁盘空间,但通常小型随机读取会更好。为了获得更好的性能,镜像强烈支持任何RAIDZ,特别是对于大容量,不可缓存的随机读取负载。
  • 不建议每个vdev使用多于12个磁盘。每个vdev的建议磁盘数量介于3和9之间。如果有更多磁盘,请使用多个vdevs。
  • 一些较早的ZFS文档建议每种类型的RAIDZ都需要一定数量的磁盘,以实现最佳性能。
  • ZFS专为商用磁盘而设计,因此不需要RAID控制器。虽然ZFS也可以与RAID控制器一起使用,但建议将控制器置于HBA模式,以便ZFS完全控制磁盘。
  • 当存储池容量达到90%时,ZFS会从性能切换到基于空间的优化,这对性能有很大的影响。为了获得最大写入性能并防止驱动器更换出现问题,请在池达到80%之前添加更多容量。如果在存储池中提供了iSCSI服务,建议不要让池的容量超过50%以防止碎片问题。
  • 考虑每个vdev使用的磁盘数时,请考虑磁盘的大小以及重新同步所需的时间,即重建vdev的过程。vdev的大小越大,重新同步时间越长。在更换RAIDZ中的磁盘时,在重新同步过程完成之前,另一个磁盘可能会失效。如果故障磁盘的数量超过RAIDZ类型的每个vdev所允许的数量,则池中的数据将丢失。所以,RAIDZ1不推荐用于大小超过1TB的驱动器。
  • 建议在创建vdev时使用相同大小的驱动器。尽管ZFS可以使用不同大小的磁盘创建vdev,但其容量将受到最小磁盘大小的限制。

LOG(ZIL)和Cache(L2ARC)详见另一篇文章《ZFS高速缓存介绍:ZIL和L2ARC》。