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性能,但不保证存储数据安全。这是因为我将存储作为实验环境,没有数据安全要求,如果你是生产环境, 不可使用 这种模式,必须使用 RAIDZ5 或 RAIDZ1 这样的数据冗余安全模式。
警告
再次警告⚠️
我这里构建的是 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
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,看起来会自动添加默认已经存在的zrootzpool,所以要使用-f参数覆盖强制
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=12的ashift属性设置为 12 ,以对应4KiB(4096字节)块大小。通常对于HDD和SSD,能够获得较好的性能和兼容性。底层是512字节一个扇区,所以2^12=4096就能够对齐和整块读写磁盘。如果没有指定这个ashift参数,ZFS会自动检测ashift,如果检测失败就会默认使用ashift=9,这会导致性能损失。这个ashift参数一旦设置,不能修改这里使用了
diskid来标记磁盘,以避免搞错磁盘
检查
检查
zpool:
zpool list -v
可以看到 zdata zpool由 4个 磁盘分区组成
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
FreeBSD ZFS单块磁盘stripe
在 gpart实践(linux分区及zfs分区) 构建FreeBSD和Linux共存的分区,使用了单块磁盘,其中分区5用于构建单块磁盘(分区)的 zdata zpool,以下是 gpart show nda0 输出:
gpart 检查,其中第5个分区用于构建 zdata zpool=> 40 3907029088 nda0 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 536870912 4 linux-data (256G)
1078470656 2828558336 5 freebsd-zfs (1.3T)
3907028992 136 - free - (68K)
创建
zdatazpool (单块磁盘构建的ZFS zpool实际上就是stripe模式,和上文相同):
zdata zpoolzpool create -f -o ashift=12 zdata /dev/nda0p5
# 启用压缩
zfs set compression=lz4 zdata
检查
zpool list -v输出:
zpool list -v 输出显示 zdata zpool 详情NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zdata 1.31T 456K 1.31T - - 0% 0% 1.00x ONLINE -
nda0p5 1.32T 456K 1.31T - - 0% 0.00% - ONLINE
zroot 254G 759M 253G - - 0% 0% 1.00x ONLINE -
nda0p3 256G 759M 253G - - 0% 0.29% - ONLINE
参考
RAID-Z Storage Pool Configuration Oracle Solaris 11.4手册,提供了ZFS相关参考