Skip to content

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:

  1. disk(默认)–系统中的物理硬盘驱动器。
  2. file–预分配文件/映像的绝对路径。
  3. mirror–标准软件RAID-1镜像。
  4. raidz1/2/3–非标准的分布式基于校验的软件RAID级别。
  5. spare–标记为ZFS软件RAID的“hot spare”的硬盘。
  6. cache–用于2级自适应读缓存(L2ARC)的设备。
  7. 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)