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
,看起来会自动添加默认已经存在的zroot
zpool,所以要使用-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
参考
RAID-Z Storage Pool Configuration Oracle Solaris 11.4手册,提供了ZFS相关参考