ZFS Stripe条带化 (FreeBSD环境实践)

警告

这里我将 Stripe 模式定义为 RAIDZ-0 不是ZFS的准确定义,ZFS RAIDZ 只有:

  • raidz1 / raidz : 相当于 RAID5 ,允许一块磁盘损坏而数据不丢失

  • raidz2 : 相当于 RAID6 , 使用2个校验raidz组,允许2块磁盘损坏而数据不丢失

  • raidz3 : 使用3个校验raidz组,则允许3块磁盘损坏而数据不丢失

如果没有指定 raidz 或者 mirror ( RAID1 ),那么默认就是Stripe条带化,数据会均匀分布到所有磁盘,获得最大的性能和容量,但是没有任何数据安全。我把这个模式称为 RAIDZ-0 是借用了传统的 RAID0 概念,实际上并不准确。

意思就是这样,暂时就不修订了,先这样...

准备工作

实践环境是在我自己组装的一台 纳斯NASSE C246 ITX主板 配备了 4块 铠侠KIOXIA EXCERIA G2 NVMe SSD存储 NVMe存储 存储。已经在 gpart 实践中完成磁盘分区准备,完整分区通过 gpart show 可以看到如下:

显示完成后的所有分区
=>        34  3907029101  nda0  GPT  (1.8T)
          34        2014        - free -  (1.0M)
        2048   536870912     1  freebsd-ufs  (256G)
   536872960  3370156032     2  freebsd-zfs  (1.6T)
  3907028992         143        - free -  (72K)

=>        34  3907029101  nda1  GPT  (1.8T)
          34        2014        - free -  (1.0M)
        2048   536870912     1  freebsd-ufs  (256G)
   536872960  3370156032     2  freebsd-zfs  (1.6T)
  3907028992         143        - free -  (72K)

=>        34  3907029101  nda2  GPT  (1.8T)
          34        2014        - free -  (1.0M)
        2048   536870912     1  freebsd-ufs  (256G)
   536872960  3370156032     2  freebsd-zfs  (1.6T)
  3907028992         143        - free -  (72K)

=>        40  3907029088  diskid/DISK-Y39B70RTK7AS  GPT  (1.8T)
          40      532480                         1  efi  (260M)
      532520        2008                            - free -  (1.0M)
      534528     4194304                         2  freebsd-swap  (2.0G)
     4728832   536870912                         3  freebsd-zfs  (256G)
   541599744  3365429248                         4  freebsd-zfs  (1.6T)
  3907028992         136                            - free -  (68K)

=>        34  3907029101  diskid/DISK-54UA4062K7AS  GPT  (1.8T)
          34        2014                            - free -  (1.0M)
        2048   536870912                         1  freebsd-ufs  (256G)
   536872960  3370156032                         2  freebsd-zfs  (1.6T)
  3907028992         143                            - free -  (72K)

=>        34  3907029101  diskid/DISK-X4GA30KZKQJP  GPT  (1.8T)
          34        2014                            - free -  (1.0M)
        2048   536870912                         1  freebsd-ufs  (256G)
   536872960  3370156032                         2  freebsd-zfs  (1.6T)
  3907028992         143                            - free -  (72K)

=>        34  3907029101  diskid/DISK-54UA4072K7AS  GPT  (1.8T)
          34        2014                            - free -  (1.0M)
        2048   536870912                         1  freebsd-ufs  (256G)
   536872960  3370156032                         2  freebsd-zfs  (1.6T)
  3907028992         143                            - free -  (72K)

现在将使用上述 4块 NVMe存储 存储的 分区2 组建一个 RAIDZ0 模式条带化存储,以实现存储容量最大化和最高IO性能,但不保证存储数据安全。这是因为我将存储作为实验环境,没有数据安全要求,如果你是生产环境, 不可使用 这种模式,必须使用 RAIDZ5RAIDZ1 这样的数据冗余安全模式。

警告

再次警告⚠️

我这里构建的是 RAID-0 模式,是为了追求实验环境容量最大化, 生产环境不可使用!!!

生产环境请使用 RAIDZ-5

备注

对于使用 stripe 模式的ZFS zpool,依然可以设置文件副本数量,例如 zfs set copies=3 zdata/home 单独设置该存储池中卷集,但是有以下限制:

  • 不能保证副本被完全分配到独立的磁盘

  • 只能防范分区失效导致的异常,如果磁盘级别故障会导致某个 top-level vdevs 丢失,则即使数据存在ZFS也会拒绝导入

Stripe (RAID-0)

zpool create 时没有指定 zpool 的类型时,对于多个磁盘会自动采用 Stripe 条带化模式,也就是将数据分片存放到多个磁盘上,但是不提供任何数据冗余存储,相当于 RAID-0

创建条带化(Stripe)类型的Zpool
zpool create -f -o ashift=12 zdata /dev/diskid/DISK-Y39B70RTK7ASp4 \
/dev/diskid/DISK-54UA4062K7ASp2 \
/dev/diskid/DISK-X4GA30KZKQJPp2 \
/dev/diskid/DISK-54UA4072K7ASp2

说明:

  • -f 参数是因为 gpart 划分分区时设置了磁盘分区类型为 freebsd-zfs ,看起来会自动添加默认已经存在的 zroot zpool,所以要使用 -f 参数覆盖强制

创建zpool报错
invalid vdev specification
use '-f' to override the following errors:
/dev/diskid/DISK-Y39B70RTK7ASp4 is part of potentially active pool 'zroot'
/dev/diskid/DISK-54UA4062K7ASp2 is part of potentially active pool 'zroot'
/dev/diskid/DISK-X4GA30KZKQJPp2 is part of potentially active pool 'zroot'
/dev/diskid/DISK-54UA4072K7ASp2 is part of potentially active pool 'zroot'
  • -o ashift=12ashift 属性设置为 12 ,以对应 4KiB (4096字节)块大小。通常对于HDD和SSD,能够获得较好的性能和兼容性。底层是 512字节 一个扇区,所以 2^12=4096 就能够对齐和整块读写磁盘。如果没有指定这个 ashift 参数,ZFS会自动检测 ashift ,如果检测失败就会默认使用 ashift=9 ,这会导致性能损失。这个 ashift 参数一旦设置,不能修改

  • 这里使用了 diskid 来标记磁盘,以避免搞错磁盘

检查

  • 检查 zpool :

检查zpool磁盘情况
zpool list -v

可以看到 zdata zpool由 4个 磁盘分区组成

检查zpool磁盘情况
NAME                           SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zdata                         6.25T   432K  6.25T        -         -     0%     0%  1.00x    ONLINE  -
  diskid/DISK-Y39B70RTK7ASp4  1.57T   128K  1.56T        -         -     0%  0.00%      -    ONLINE
  diskid/DISK-54UA4062K7ASp2  1.57T   116K  1.56T        -         -     0%  0.00%      -    ONLINE
  diskid/DISK-X4GA30KZKQJPp2  1.57T    92K  1.56T        -         -     0%  0.00%      -    ONLINE
  diskid/DISK-54UA4072K7ASp2  1.57T    96K  1.56T        -         -     0%  0.00%      -    ONLINE
zroot                          254G  7.86G   246G        -         -     0%     3%  1.00x    ONLINE  -
  diskid/DISK-Y39B70RTK7ASp3   256G  7.86G   246G        -         -     0%  3.09%      -    ONLINE

参考