1.ZFS简介
2001年Matthew Ahrens 和 Jeff Bonwick开发出了ZFS)最初作为Sun Microsystem公司的Solaris核心文件系统,焕发出了强大的生命力:
- 2008年,ZFS被移植到FreeBSD
- 同年, ZFS on Linux 项目将ZFS引入Linux
- 2013年, OpenZFS项目 创建,维护和管理了核心ZFS代码,被广泛用于Unix-like系统中 (从2010年8月的OpenSolaris中Fork出代码)
ZFS集成了逻辑卷管理的文件系统,具有高扩展性,并且提供了大量保护措施防止数据损坏,并且支持大存储容量、提供高性能数据压缩、卷管理也提供了快照以及写时复制、连续性完整性检查和自动修复,以及高级的RAID-Z(类似RAID5/6),并且提供原生NFSv4 ACL等功能
1.1ZFS特性
https://openzfs.org/wiki/Features
ZFS是 128 位文件系统,这个设计如此超前,以至于理论极限可能在当前现实中永远无法遇到 (OMG,我只能赞叹) – 项目领导Bonwick曾说:”要填满一个128位的文件系统,将耗尽地球上所有存储设备。除非你拥有煮沸整个海洋的能量,不然你不可能将其填满。”
特性:
- 防止数据损坏,支持数据和元数据的完整性检查。
- 持续的完整性验证和自动修复
- 数据冗余与镜像,RAID-Z1/2/3 [和 DRAID] 支持高存储容量——高达 256 万亿 yobibytes (2^128 字节,大到足以装下世界上所有数据) 使用 LZ4、GZIP 或 ZSTD 透明压缩节省空间
- 支持使用硬件加速的本机加密
- 具有 快照(snapshots) 和 写时复制(copy-on-write) 的高效存储
- 高效的本地或远程复制 — 使用 ZFS 发送和接收仅发送更改的块
2.概念
2.1虚拟设备介绍(Virtual Device Introduction)
首先,我们需要理解虚拟设备(或VDEVs)的概念,因为ZFS在内部广泛使用它们。如果您已经熟悉RAID,那么这个概念对您来说并不新鲜,尽管您可能没有将其称为“VDEVs”。基本上,我们有一个元设备,它代表一个或多个物理设备。在Linux软件RAID中,您可能有一个“/dev/md0”设备,它表示由4个磁盘组成的RAID-5阵列。在本例中,“/dev/md0”将是您的“VDEV”。
ZFS中有七种类型的VDEVs:
- disk(默认)–系统中的物理硬盘驱动器。
- file–预分配文件/映像的绝对路径。
- mirror–标准软件RAID-1镜像。
- raidz1/2/3–非标准的分布式基于校验的软件RAID级别。
- spare–标记为ZFS软件RAID的“hot spare”的硬盘。
- cache–用于2级自适应读缓存(L2ARC)的设备。
- log – 一个单独的日志(SLOG)称为“ZFS intent log”或ZIL。
2.2 mirror
2.3 RAID池
RAIDZ-1
RAIDZ-1类似于RAID-5,它有一个分布在阵列中所有磁盘上的奇偶校验位。条带宽度是可变的,可以覆盖阵列中磁盘的某一确切宽度,可以覆盖更少的磁盘,也可以覆盖更多的磁盘,如上面的图所示。RAIDZ-1能容忍一个磁盘损坏而不丢失数据。2个硬盘故障,可能导致数据丢失。RAIDZ-1要求硬盘数不少于3块。存储的容量将是数组中的磁盘数量乘以最小磁盘的存储容量,减去一个奇偶校验磁盘
RAIDZ-2
RAIDZ-2与RAID-6相似,在阵列中的所有磁盘上都有一个双奇偶校验位。条带宽度是可变的,可以覆盖阵列中磁盘的某一确切宽度,可以覆盖更少的磁盘,也可以覆盖更多的磁盘。RAIDZ-2能容忍最多两盘故障。如果出现3盘故障,将导致数据丢失。RAIDZ-2至少需要4块硬盘
。 存储的容量将是阵列中的磁盘数量乘以最小磁盘的存储容量,减去两个奇偶校验磁盘
RAIDZ-3
RAIDZ-3没有可以与之比较的标准化RAID级别。但是,它是RAIDZ-1和RAIDZ-2的逻辑延续,因为在阵列中的所有磁盘上都有一个三重奇偶校验位。条带宽度是可变的,可以覆盖阵列中磁盘的确切宽度,也可以覆盖更少的磁盘,也可以覆盖更多的磁盘。RAIDZ-3能容忍3盘故障。4块硬盘故障,会导致数据丢失。 RAIDZ-3至少需要5块硬盘
。存储的容量将是阵列中的磁盘数量乘以最小磁盘的存储,减去3个奇偶校验磁盘
混合RAIDZ
不幸的是,基于奇偶校验的RAID速度很慢,特别是在单个条带中有许多磁盘时(例如48磁盘的JBOD)。为了提高速度,将单个大型RAIDZ VDEV分割为多个RAIDZ VDEV的条带可能不是一个坏主意。这将消耗您可用的磁盘空间来存储,但可以极大地提高性能。当然,与前面的RAIDZ VDEV一样,每个嵌套的RAIDZ VDEV中的条带宽度是可变的。对于每个RAIDZ级别,您可以在每个VDEV中丢失最多这么多磁盘。因此,如果您有一个由三个RAIDZ-1 VDEV组成的条带,那么您总共可以容忍三个磁盘故障,每个VDEV一个磁盘故障。可用空间的计算方法类似。在本例中,由于每个VDEV中的奇偶校验存储,您将减去三个磁盘空间(因为用来存储校验数据了)。
为了说明这个概念,让我们假设我们有一个12磁盘的存储服务器,我们希望在最大化条带性能的同时损失尽可能少的磁盘。因此,我们将创建4个RAIDZ-1 vdev,每个RAIDZ-1包含3个磁盘。这将使占用我们4个可用于存储数据的磁盘(用于存储校验数据),但它也将使我们能够承受4个磁盘故障,并且跨4个vdev的条带将会提高性能。
为了设置一个带有4个raidz1 VDEV的zpool,我们在命令中使用了4次“raidz1”VDEV。注意,为了清晰起见,我强调了什么时候在命令中输入”raidz1”:
# zpool create tank raidz1 sde sdf sdg raidz1 sdh sdi sdj raidz1 sdk sdl sdm raidz1 sdn sdo sdp
# 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
raidz1-1 ONLINE 0 0 0
sdh ONLINE 0 0 0
sdi ONLINE 0 0 0
sdj ONLINE 0 0 0
raidz1-2 ONLINE 0 0 0
sdk ONLINE 0 0 0
sdl ONLINE 0 0 0
sdm ONLINE 0 0 0
raidz1-3 ONLINE 0 0 0
sdn ONLINE 0 0 0
sdo ONLINE 0 0 0
sdp ONLINE 0 0 0
errors: No known data errors
# zpool create tank raidz1 sde sdf sdg raidz1 sdh sdi sdj raidz1 sdk sdl sdm raidz1 sdn sdo sdp
# 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
raidz1-1 ONLINE 0 0 0
sdh ONLINE 0 0 0
sdi ONLINE 0 0 0
sdj ONLINE 0 0 0
raidz1-2 ONLINE 0 0 0
sdk ONLINE 0 0 0
sdl ONLINE 0 0 0
sdm ONLINE 0 0 0
raidz1-3 ONLINE 0 0 0
sdn ONLINE 0 0 0
sdo ONLINE 0 0 0
sdp ONLINE 0 0 0
errors: No known data errors
注意,现在有四个RAIDZ-1 VDEVs。ZFS条带跨多个VDEVs。因此,这个设置本质上是RAIDZ-1+0。每个RAIDZ-1 VDEV将接收发送到池的数据的1/4,然后每个条带块将在每个VDEV中的磁盘上进一步条带化。嵌套的VDEVs可以在池被大规模分段之后很长一段时间保持良好的性能
2.4性能方面
最快到最慢的排序
- RAID-0 (fastest)
- RAID-1
- RAIDZ-1
- RAIDZ-2
- RAIDZ-3 (slowest)