第二章 虚拟设备

在本章中,我们将深入探讨香肠(sausage)是如何制作的。这个...是一头猪,我是说,一个圆盘。磁盘是存储的物理表现形式。磁盘是邪恶的。他们对自己的特点和布局撒谎,隐藏错误,以意想不到的方式失败。ZFS意味着不再需要担心你的磁盘正在秘密密谋反对你。是的,你的磁盘正在密谋反对你,但ZFS揭露了他们的背叛并阻止了它。

为了最有效地使用ZFS的可用磁盘,您需要基本了解操作系统如何向ZFS呈现磁盘,以及ZFS如何在这些磁盘上排列数据。

第二章 虚拟设备磁盘和其他存储介质原始磁盘存储分区存储GEOM设备存储基于文件的存储提供者 vs. 磁盘VDEVs:虚拟设备VDEV冗余Stripe(1 Provider)Mirror(2+ Providers)RAID-Z1(3+ Providers)RAID-Z2(4+ Providers)RAID-Z3(5+ Providers)RAID-Z磁盘配置RAID-Z的两倍规则修复VDEVsRAID-Z与传统RAID对比特殊VDEVs单独意图日志(SLOG,ZIL)缓存(Cache , L2ARC)VDEVs如何影响性能一个硬盘两个硬盘三个硬盘四或五个硬盘六或十二个硬盘很多硬盘

磁盘和其他存储介质

ZFS还可以在磁盘以外的存储介质上运行。任何FreeBSD GEOM存储提供者都可以成为ZFS存储介质。ZFS甚至支持使用文件作为后备存储,这对于测试来说非常好,但并不适合生产。ZFS可以使用任何块设备进行物理存储,但每种类型都有其优缺点。

原始磁盘存储

使用整个物理磁盘可以降低复杂性。此外,无需担心分区,ZFS和物理磁盘之间也没有软件或配置。然而,缺点通常超过这些优点。

从磁盘启动需要磁盘具有引导加载程序。引导加载程序只能在分区磁盘上运行。您无法启动原始磁盘。FreeBSD支持给磁盘提供有用的标签,但这些标签存在于分区信息中。

更糟糕的是,任何替换磁盘的大小都必须与原始磁盘完全相同,或者更大。并非所有6 TB的磁盘大小都相同——不同供应商的磁盘大小相差几兆字节。在设置系统时,您并不关心这些差异,但在更换磁盘时,它们至关重要。大多数目录不列出每个磁盘中的扇区数量,只列出大小,因此找到可用的替换可能需要多次尝试。将使用传统512字节扇区的驱动器替换为使用4096字节(4K,也称为高级格式)扇区的驱动器会使事情变得更加复杂。原始驱动器可能有许多不能被8整除的扇区。由于磁盘驱动器使用的特殊数学方法,即使新驱动器比旧驱动器大几个字节,它也可能看起来比旧驱动器小几个字节。

分区存储

您可以对磁盘进行分区,然后将其中一个分区用于ZFS,而不是使用整个原始磁盘。这样做的最大优点是,您现在可以通过创建一个小的引导分区从包含ZFS分区的磁盘引导,而不需要单独的引导设备。使用分区还允许您将部分磁盘空间用于其他用途,例如原始交换分区、另一个文件系统,或者只是在磁盘末尾留出一些摆动空间,这样替换磁盘就不必有匹配的扇区计数。分区还允许您“短行程”(short stroke)驱动器以提高性能。

出于性能原因,许多原始的Solaris ZFS管理指南建议不要使用分区(或者,在Solaris术语中称为 slices,切片)。在Solaris中,为文件系统使用分区会禁用写缓存。在FreeBSD中,禁用写缓存与磁盘分区或文件系统完全分开。FreeBSD在分区上使用ZFS时提供了完整的性能。

FreeBSD支持多种分区方案,但强烈建议使用GPT。旧的分区系统MBR将主分区的数量限制为四个,而GPT最多支持128个分区。MBR最多只能管理2 TB的磁盘,而GPT最多可以管理512字节扇区磁盘的8 ZB和4 K扇区磁盘的64 ZB。《FreeBSD Mastery:Storage Essentials》涵盖了FreeBSD对这两种分区方法的支持。

使用分区的缺点是,您可能会失去ZFS提供的一些可移植性。如果将磁盘从一个系统移动到另一个系统,目标系统必须能够识别磁盘分区。

GEOM设备存储

ZFS还可以使用各种FreeBSD GEOM类作为其后备存储。这些位于文件系统和物理设备之间,执行各种功能。GEOM类提供了全磁盘加密(GELI、GBDE)、高可用性、标签、多路径和可插拔调度器等功能。GEOM类可以基于整个设备创建,也可以在另一个GEOM类(如分区、多路径设备或加密磁盘)之上创建。

GELI(FreeBSD磁盘加密子系统)是实现加密ZFS池的最佳方式。GELI在ZFS和物理磁盘之间来回传递块时对其进行加密和解密,因此不需要ZFS做任何不同的事情。GELI支持多种不同的加密算法,但默认的AES-XTS提供了最佳性能,特别是在支持AES新指令(AES New Instructions,AES-NI)的现代CPU上。借助此硬件卸载功能,GELI可以以超过1 GB/秒的速度加密数据,解密速度更快,这意味着即使在SSD上添加加密也不会降低您的性能。GELI还可以选择提供数据身份验证(完整性验证),在每个扇区中存储哈希消息身份验证码(Hashed Message Authentication Code,HMAC)。它使用此HMAC来验证数据的完整性(数据未被篡改)和真实性(此数据由您写入)。如果在读回扇区时,HMAC没有验证数据,则返回错误。默认情况下,HMAC功能未启用,对于ZFS来说可能是多余的,因为ZFS在每个数据块上都提供了自己的校验和。

高可用存储技术(High Availability Storage Technology,HAST)是FreeBSD的分布式存储解决方案。它允许您通过网络在计算机之间镜像块设备。使用HAST作为ZFS池的后备存储,可以将每个后备磁盘镜像到第二台机器。HAST的优点是它是实时的;在将块写入HAST集群中的所有主机之前,不认为该块已被写入。另一方面,ZFS复制基于同步周期性快照。但是,使用HAST时,第二台机器不能与第一台机器同时导入或装载池。与ZFS复制相比,在ZFS复制中,您可以同时使复制池处于活动状态(但只读),HAST只有在少数情况下才有意义。

GEOM标签提供了一种方便的方法,可以在每个磁盘或分区上附加有意义的注释。标签类型有很多,包括磁盘标识、gptid、GPT标签和GEOM特定的glabel等标准。标签驱动器的最佳实践见第0章。

GEOM还支持多路径以实现高可用性。有时,不仅磁盘会损坏,控制器卡、背板或电缆也会损坏。通过多路径,“双端口”(dual ported)的企业驱动器可以连接到多个HBA(没有任何RAID功能的磁盘控制器卡)。如果每个驱动器都有一条通往两个不同存储控制器的路径,那么即使失去其中一个控制器,它也能幸存下来。但是,当每个磁盘连接到两个不同的控制器时,操作系统会通过每个控制器看到每个磁盘两次。GEOM多路径类允许您向每个磁盘写入标签,以便检测到指向同一磁盘的连续路由。通过这种方式,您可以获得每个磁盘的一种表示,并通过不同的控制器获得该磁盘的多条路径作为支持。我们将在《FreeBSD Mastery:Advanced ZFS》中讨论多路径。

GEOM调度程序模块允许管理员指定不同的I/O调度算法,以实现更好的性能。在撰写本文时,当前可用的调度器有两种:

详见 gsched(8)

GEOM系统使得为特定工作负载编写额外的调度模块相对容易。

基于文件的存储

您可以将文件支持的虚拟磁盘用作ZFS存储设备。虽然我们当然不建议将其用于生产环境,但文件备份磁盘对于测试和实验非常有用。

提供者 vs. 磁盘

provider——提供者,是FreeBSD中的一个技术术语。GEOM存储提供者是一种提供数据存储的东西。它可能是一个磁盘。它可能是一个以某种方式转换存储的GEOM类。从技术上讲,这本书几乎在所有地方都应该使用“提供者”一词,而不是“磁盘”。您可以将任何GEOM提供者用作ZFS的后端。这样做的问题是,一个物理磁盘可以提供多个不同的提供者。您的池可能有多个不同的提供者,但如果它们都在一个磁盘上,那么您的冗余就完了。

本书讨论“磁盘”时,我们指的是“磁盘上的某种提供者”。这个磁盘不一定完全专用于ZFS——你可以在磁盘上有一个交换分区和一个ZFS分区,这完全没问题。但是,您不能在单个物理磁盘上有两个ZFS分区,镜像它们并具有物理冗余。

VDEVs:虚拟设备

虚拟设备(Virtual Devices,VDEV)是ZFS的逻辑存储单元。每个VDEV由一个或多个GEOM提供者组成。ZFS支持几种不同类型的VDEV,这些VDEV根据VDEV提供的冗余类型而有所不同。常见的镜像磁盘是VDEV的一种类型,其中每个磁盘都包含另一个磁盘的副本。无冗余的普通磁盘是VDEV的另一种类型。ZFS包括三种不同类型的复杂RAID,称为RAID-Z。

这些VDEVs被安排在第3章讨论的存储池中。实际数据位于池的顶部,如第4章所述。但是,虚拟设备的排列决定了池的性能以及它抵抗物理损伤的能力。ZFS的几乎所有冗余都来自虚拟设备。

存储池由一个或多个VDEV组成,其中池数据分布在这些VDEV上,没有冗余。(您可以使用 copies 属性添加一些冗余,如第4章所述,但这并不能防止完全磁盘故障。)ZFS池将VDEV视为提供存储空间的单个单元。存储池在VDEV丢失后无法生存,因此重要的是,您要么使用具有冗余的VDEV,要么提前决定丢失此池中的数据是可以的。

在池中使用多个VDEV可以创建类似于高级RAID阵列的系统。

在这两种情况下,ZFS在每个VDEV上对数据进行条带化,没有冗余。单个VDEV提供冗余。

VDEV冗余

包含多个磁盘的VDEV可以使用多种不同的冗余方案来提供容错。没有什么能让一个单独的磁盘变得多余。ZFS支持使用镜像磁盘和几个基于奇偶校验的阵列。

ZFS使用冗余来自我修复。没有冗余的VDEV不支持自我修复。您可以在数据集层(使用 copies 属性)解决这个问题,但冗余VDEV支持自动自愈。

Stripe(1 Provider)

由单个磁盘组成的VDEV称为条带,没有冗余。正如您所料,丢失单个提供者意味着磁盘上的所有数据都消失了。条带池仅包含单个磁盘VDEV。

ZFS池将数据条带化到池中的所有VDEV上,并依赖VDEV提供冗余。如果一个条带设备发生故障,整个池也会发生故障。存储在池中的所有数据都消失了。这对于临时分区来说很好,但如果你关心你的数据,请使用一种提供容错的VDEV。

Mirror(2+ Providers)

镜像VDEV在每个磁盘上存储所有数据的完整副本。只要提供者中还有一个驱动器是好的,就仍然可以访问您的数据。镜像中可以使用任意数量的磁盘。

镜像提供了非常好的随机和顺序读取速度,因为可以一次从所有磁盘读取数据。写入性能会受到影响,因为所有数据都必须写入所有磁盘,并且在最慢的磁盘完成之前,操作不会完成。

RAID-Z1(3+ Providers)

ZFS包括三个现代RAID风格的冗余VDEV,称为RAID-Z。RAID-Z类似于RAID-5,但包括校验和以确保文件完整性。在【校验和】和ZFS的写时复制功能(第7章)之间,RAID-Z确保不完整的写入不会导致文件系统不一致。

RAID-Z在所有磁盘上传播数据和奇偶校验信息。如果RAID-Z中的提供者死亡或开始提供损坏的数据,RAID-Z将使用奇偶校验信息重新计算丢失的数据。您可能听说RAID-Z使用一个提供者来存储奇偶校验信息,但没有单一的奇偶校验提供者——奇偶校验角色通过提供者轮换,传播数据。

RAID-Z1 VDEV可以承受任何单一存储提供商的故障。如果在更换第一个发生故障的驱动器之前,第二个提供程序发生故障,则所有数据都将丢失。从奇偶校验数据重建磁盘阵列可能需要很长时间。如果你使用的是大磁盘,比如超过2 TB,那么在修复第一个驱动器时,第二个驱动器发生故障的可能性非常大。对于更大的磁盘,您可能应该考虑RAID-Z2

RAID-Z2(4+ Providers)

RAID-Z2类似于RAID-Z1,但每个VDEV有两个奇偶校验磁盘。与RAID-6一样,RAID-Z2允许它即使在两个失败的提供程序中也能继续运行。它比RAID-Z1稍慢,但允许您在更换驱动器时更从容。

RAID-Z3(5+ Providers)

RAID-Z3是RAID-Z最偏执的形式,每个VDEV使用三个奇偶校验磁盘。是的,您的五磁盘阵列中可以有三个故障磁盘。它比RAID-Z2稍慢。第四个磁盘的故障会导致全部数据丢失。

RAID-Z磁盘配置

使用任何版本的RAID-Z时要记住的一件重要事情是,RAID-Z中的提供者数量是完全固定的。您无法向RAID-Z VDEV添加驱动器以扩展它们。您可以通过添加VDEV来扩展池,但不能通过添加磁盘来扩展VDEV。没有计划添加此功能。

假设您有一个可以接受20个硬盘驱动器的主机。您安装了12个驱动器并将其用作单个RAID-Z2,以为以后会根据需要向池中添加更多驱动器。这些新驱动器必须作为单独的RAID-Z2 VDEV安装。

更重要的是,您的VDEV将不平衡。您的池将有一个12驱动器的VDEV和另一个8驱动器的VDEV。一个会比另一个慢。ZFS允许你强制它将这些设备集中在一起,但这样做真的不是一个好主意。

提前计划。看看你的物理设备,你必须开始的驱动器数量,以及你将如何扩展存储。我们的示例服务器可以在包含单个RAID-Z2 VDEV的池上运行,也可以在包含其他八个磁盘的完全独立的池中运行。在开始之前,不要割断自己的喉咙!

RAID-Z的两倍规则

一种常见的配置是,数据磁盘的数量等于2的倍数,再加上给定RAID-Z级别所需的奇偶校验磁盘。也就是说,该规则规定RAID-Z1应使用2n+1个磁盘,或三个、五个、七个、九个等。RAID-Z2应使用2n+2个磁盘(四个、六个、八个等),而RAID-Z3应使用2n+3个磁盘(五个、7个、9个等)。

此规则有效——当且仅当(if and only if)您的数据由大小为2的幂次方的小块组成时。不过,其他因素的影响要大得多。压缩通常被认为更有效。压缩数据会减小块的大小,从而消除这一好处。

修复VDEVs

当属于冗余VDEV的提供者发生故障时,它所属的VDEV将“降级”(degraded)。降级的VDEV仍拥有其所有数据,但性能可能会降低。第5章介绍了替换失败的提供者。

更换提供者后,系统必须将数据存储在新提供者上。镜像使这变得容易:从剩余磁盘读取数据并将其写入替换磁盘。对于RAID-Z,必须从奇偶校验重新计算数据。

ZFS结合RAID和文件系统的方式意味着ZFS知道哪些块包含数据,哪些块是空闲的。ZFS不必将每个字节都写入新驱动器,只需要写入实际使用的块。传统的RAID控制器不了解或不知道文件系统层,因此它不知道正在使用什么以及什么是可用空间。当RAID控制器更换磁盘时,它必须复制新磁盘的每个字节。这意味着损坏的ZFS RAID-Z恢复得更快,减少了可能导致数据丢失的并发故障的可能性。我们在第5章讨论ZFS恢复。

RAID-Z与传统RAID对比

与传统RAID相比,RAID-Z具有许多优势,但最大的优势来自ZFS是卷管理器和文件系统,此外还有磁盘冗余层。

在过去,文件系统只能在一个磁盘上工作。如果您有两个磁盘,则需要两个单独的文件系统。传统的RAID允许您将多个磁盘组合成一个虚拟磁盘,允许创建高达100 MB甚至更大的海量磁盘!然后,操作系统将自己的文件系统放在上面,而不了解块在物理磁盘上的布局方式。同时,RAID可以提供容错功能。考虑到当时硬件和软件的局限性,RAID似乎是一个不错的选择。

通过结合文件系统和卷管理器,ZFS可以准确地看到所有数据的位置以及存储层和数据的交互方式。这允许ZFS做出许多重要决定,例如确保重要数据的额外副本(如同ditto块(第3章))存储在单独的磁盘上。将关键数据的两到三个副本都放在一个底层存储提供程序上是没有用的,因为一个硬件故障就可以将其清除。ZFS甚至将ditto块放在相邻的磁盘上,因为从统计学上讲,作为邻居的两个磁盘同时发生故障,可能性较小。

传统RAID可能存在一个被称为“写入漏洞”(write hole)的缺点——即两步操作在中途被缩短。RAID 5和6设备将数据分块写入所有数据磁盘。一旦此操作完成,将计算奇偶校验块并将其存储在奇偶校验磁盘上。如果系统崩溃或在写入数据后但在写入奇偶校验之前断电,磁盘最终将处于不确定状态。当系统恢复时,数据与奇偶校验不匹配。如果一个驱动器完成更新而另一个驱动器没有完成更新,镜像驱动器也会发生同样的情况。

在更换故障磁盘之前,不会发现写入漏洞问题。不正确的奇偶校验或不正确的镜像会导致RAID设备向文件系统返回垃圾数据。传统的文件系统将此垃圾数据作为文件内容返回。

ZFS通过写时复制和校验和解决了这些问题。写时复制(第7章)意味着数据永远不会被就地(in place)覆盖。每次更新都是事务性的,要么完全完成,要么不执行,使系统恢复到更新前的状态。ZFS还具有校验和功能,因此可以检测驱动器何时返回无效数据。当ZFS检测到无效数据时,它会用来自其他来源的正确数据替换该数据,例如数据的其他副本、镜像驱动器或RAID-Z奇偶校验。结合起来,这些创造了ZFS的自愈特性。

特殊VDEVs

池可以使用专用VDEV来提高池的性能。这些特殊的VDEV类型不用于持久存储数据,而是在更快的设备上临时保存额外的数据副本。

单独意图日志(SLOG,ZIL)

ZFS维护一个ZFS意图日志(ZFS Intent Log,ZIL)作为池的一部分。与其他一些文件系统中的日志类似,这是它写入正在进行的操作的地方,因此可以在系统崩溃或电源故障时完成或回滚这些操作。ZIL受磁盘正常运行条件的影响。池的使用量或与负载相关的延迟可能会突然激增,从而导致性能下降。

提高性能的一种方法是将ZIL与正常池操作分开。您可以将专用设备用作单独的意图日志或SLOG,而不是使用池的常规部分。专用设备通常是一个很小但速度很快的设备,例如耐久性很高的SSD。

ZFS可以将数据分为合理的组进行批处理,并更有效地写入数据,而不是按照接收的顺序将数据从SLOG复制到池的主存储器。

某些软件在继续之前,坚持要收到它写入磁盘的数据确实在磁盘上的确认。数据库通常会这样做,以避免在系统崩溃或断电时发生损坏。某些NFS操作也会执行相同的操作。通过将这些请求写入更快的日志设备并报告“全部完成”,ZFS加速了这些操作。数据库完成事务并继续。您几乎可以在SSD级别获得写入性能,同时使用廉价的磁盘作为存储介质。

您可以镜像您的ZIL以防止数据丢失。

缓存(Cache , L2ARC)

当从磁盘读取文件时,系统会将其保存在内存中,直到内存需要用于其他目的。这是一项古老的技术,甚至可以追溯到原始的BSD时代。查看基于UFS的BSD系统的 top(1) ,您将看到一块标记为 Buf 的内存。那是缓冲区缓存。

然而,传统的缓冲区缓存是几十年前设计的。ZFS有一个自适应替换缓存(Adaptive Replacement Cache,ARC),专为现代硬件设计,可以提高速度。ARC保留最近和经常访问的文件。

然而,很少有现代系统有足够的RAM来缓存他们想要的数据。正如ZFS可以使用SLOG来加速写入一样,它也可以使用非常快的磁盘来加速读取。这被称为2级ARC(Level 2 ARC)或称L2ARC。

当一个对象的使用频率足以从缓存中受益,但不足以对存储在RAM中的对象进行评级时,ZFS可以将其存储在缓存设备上。L2ARC通常是一种非常快速和高耐久性的SSD或NVMe设备。现在,当请求该数据块时,可以从更快的SSD读取,而不是从构成池其余部分的较慢磁盘读取。ZFS知道后端磁盘上的哪些数据已被更改,因此它可以确保读取缓存与存储池上的数据同步。

VDEVs如何影响性能

每种不同类型的VDEV的性能都不同。对磁盘性能进行基准测试和剖析是一个复杂的话题,如果有人愿意阅读的话,它值得一本大教科书。我们在这里给出的任何具体建议都会很快过时,所以让我们讨论一些通用术语。

一个常见的度量是每秒输入/输出(Input/Output Per Second,IOPS),即驱动器每秒可以执行的不同操作的数量。旋转驱动器IOPS通常受到读/写头在盘片上从一个位置移动到另一个位置的速度的物理限制(即物理寻道时间)。固态磁盘具有非常出色的性能,因为它们不需要物理移动任何东西。

非对称轴(non-parity spindles)的数量限制了未损坏池的流式读写性能。 “流”(Streaming)性能归结为驱动器每秒可以读取或写入的兆字节数(MB/s)。当驱动器按顺序读取或写入数据时,磁头不必来回寻找不同的位置。正是在这些条件下,驱动器才能实现最佳的流媒体性能,从而提供最高的吞吐量。主轴计数会影响随机和流媒体性能。12个1 TB(12 x 1 TB)驱动器的阵列通常优于6个2 TB(6 x 2 TB)驱动器阵列,因为更大的主轴和磁头数量可以提高IOPS和流性能。拥有更多磁头意味着ZFS可以同时从磁盘上的更多不同位置读取或写入,从而提高IOPS性能。更多的磁盘轴意味着有更多的磁盘以最快的速度读取和写入数据。然而,驱动器数量越多,就需要更大的机架或机箱、更多的电源和更多的控制器。

其他常见的测量包括读取带宽、写入带宽、空间效率和流媒体性能。

一般来说,镜像可以提供更好的IOPS和读取带宽,但RAID-Z可以提供更好地写入带宽和更高的空间效率。

具有多个VDEV的池将其数据条带化到所有VDEV上。这提高了性能,但可能会占用空间,因为每个单独的VDEV都有自己的冗余磁盘。具有多个VDEV的池可能提高了可靠性和容错性。虽然ZFS的冗余都在VDEV级别,但具有多个冗余VDEV的池可能可以承受更多的磁盘故障。池中的VDEV越多,池的性能就越好

让我们来看看一些常见的VDEV配置,看看各种可能的安排如何影响性能和容量。假设我们使用的是一组普通的1TB旋转磁盘。每个磁盘的IOPS为250,流式读/写速度为100 MB/s。

一个硬盘

只有一个磁盘,只有一种可能的配置,即单个ZFS条带VDEV。这是最基本的配置,不提供容错功能。如果那一个磁盘坏了,你的所有数据都会消失。

Table 1: Single Disk Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
1Stripe2502501001001 TB (100%)none

单磁盘条带设备的性能特征看起来与底层磁盘的特征非常相似。奇怪吧?

两个硬盘

如果您的系统有两个磁盘,您可以用两个条带VDEV或一个镜像VDEV构建池。

条带VDEV使可用存储和带宽加倍,但故障风险也加倍。ZFS将每个文件的块分散在两个磁盘上。如果任一磁盘发生故障,所有数据都将无法使用。

使用单个镜像VDEV将每个数据块存储在两个磁盘上。这保持了改进的读取性能,因为可以同时从两个磁盘读取块。但你只能得到最小磁盘的容量。写入性能取决于最慢磁盘的速度。但是,一个磁盘可能会发生故障,池仍然可用。

Table 2: Two-Disk Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
22 x Stripe5005002002002TB (100%)none
21 x 2 disk Mirror15002502001001TB (50%)1

如表所示,我们的镜像池的写入性能只有条带池的一半,空间也只有条带化池的一半。

三个硬盘

三个磁盘意味着更多的选择,包括更深的镜像和RAID-Z。您也可以使用三个条带磁盘的池,但失败的可能性要高得多。

更深的镜像有更多的磁盘,提供更多的容错能力和改进的读取性能。更多的主轴和磁头意味着VDEV可以从三个驱动器中最不繁忙的驱动器读取数据,从而更快地进行随机读取。镜像中的写入性能仍然局限于镜像中最慢的驱动器。

RAID-Z1提供了更好的空间效率,因为容错只需要VDEV中的一个磁盘。数据分布在所有驱动器上,因此它们必须协同工作以执行读取和写入。将数据分散到所有驱动器上可以提高流式写入性能。与镜像不同,在RAID-Z中,所有驱动器可以同时写入其共享的数据,而不是每个驱动器写入相同的数据。

Table 3: Three-Disk Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
31 x 3 disk Mirror7502503001001 TB (33%)2
31 x 3 disk RAID-Z12502502002002 TB (66%)1

请注意,IOPS不一定能扩展到实际的读/写性能。镜像VDEV的读取IOPS是RAID-Z1的三倍,因为每个驱动器中的磁头可以独立工作,而在RAID-Z中,磁头必须协同工作。以兆字节每秒为单位的镜像具有将所有磁盘的吞吐量用于数据的优点,而RAID-Z1由于奇偶校验数据而损失了一个磁盘的吞吐量。三磁盘镜像也会写入一半的MB/s,因为它向每个磁盘写入相同的数据,而RAID-Z1可以将写入分散到所有磁盘上,但会因奇偶校验而损失一些吞吐量。

四或五个硬盘

有了四到五个磁盘,你就有了更多的选择。

多个镜像VDEV(类似于传统的RAID 10)为数据库等随机I/O工作负载提供了最佳性能。当您将四个磁盘划分为两个镜像VDEV,每个镜像VDEV包含两个磁盘时,ZFS会在两个镜像上对写入进行条带化。一个镜像包含一半的数据,另一个镜像另一半。这有助于缓解镜像的写入瓶颈,同时仍然提供令人印象深刻的读取性能。

有了四个磁盘,RAID-Z2成为一种选择。RAID-Z2的两个奇偶校验磁盘意味着VDEV可以在丢失任何两个磁盘的情况下继续运行。与具有相同数量磁盘的镜像相比,性能更差;然而,哪两个磁盘同时发生故障已不再重要。

在五个磁盘上,我们可以部署RAID-Z3。RAID-Z3 VDEV可以在任何三个磁盘丢失的情况下幸存下来。RAID-Z3交换了容错性能。

当然,RAID-Z1仍然是一种选择。

Table 4: Four- or Five-Disk Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
42 x 2 disk Mirror10005004002002 TB (50%)2 (1/VDEV)
41 x 4 disk RAID-Z12502503003003 TB (75%)1
41 x 4 disk RAID-Z22502502002002 TB (50%)2
51 x 5 disk RAID-Z12502504004004 TB (80%)1
51 x 5 disk RAID-Z22502503003003 TB (60%)2
51 x 5 disk RAID-Z32502502002002 TB (40%)3

请注意RAID-Z1的流式(MB/s)读写性能与RAID-Z2的比较,以及RAID-Z3的性能与两者的比较。添加奇偶校验磁盘意味着牺牲该磁盘的吞吐量。

多镜像VDEV的容错性有点棘手。记住,冗余是针对每个VDEV的,而不是针对每个池的。每个镜像VDEV仍然提供n-1容错。只要每个镜像VDEV中的一个驱动器仍然工作,所有数据都是可访问的。池中有两个双磁盘镜像VDEV,您可以从每个VDEV中丢失一个磁盘并继续运行。但是,如果您丢失了同一VDEV中的两个磁盘,则池将死亡,所有数据都将丢失。

六或十二个硬盘

对于大量磁盘,决策转向平衡容错性、空间效率和性能。

六个磁盘可以变成三个双磁盘镜像VDEV,为您提供相当大的空间和良好的写入性能。您可以选择一对三磁盘镜像VDEV,这样可以减少空间,但允许每组三个磁盘中的两个磁盘发生故障,而不会有数据丢失的风险。或者它们可以成为RAID-Z VDEV。

获得六个以上的磁盘,您可以在一个池中拥有多个RAID-Z VDEV。十几个磁盘可以作为一个VDEV一起操作,提供最大的可用空间,也可以分成两个单独的VDEV,提供更少的可用空间但性能更好,容错能力更强。

Table 5: Six- to Twelve-Disk Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
63 x 2 disk Mirror15007506003003 TB (50%)3 (1/VDEV)
62 x 3 disk Mirror15005006002002 TB (33%)4 (2/VDEV)
61 x 6 disk RAID-Z12502505005005 TB (83%)1
61 x 6 disk RAID-Z22502504004004 TB (66%)2
61 x 6 disk RAID-Z32502503003003 TB (50%)3
126 x 2 disk Mirror3000150012006006 TB (50%)6 (1/VDEV)
124 x 3 disk Mirror3000100012004004 TB (33%)8 (2/VDEV)
121 x 12 disk RAID-Z12502501100110011 TB (92%)1
122 x 6 disk RAID-Z15005001000100010 TB (83%)2 (1/VDEV)
123 x 4 disk RAID-Z17507509009009 TB (75%)3 (1/VDEV)
121 x 12-disk RAID-Z22502501000100010 TB (83%)2
122 x 6-disk RAID-Z25005008008008 TB (66%)4 (2/VDEV)
121 x 12-disk RAID-Z32502509009009 TB (75%)3
122 x 6-disk RAID-Z35005006006006TB (50%)6 (3/VDEV)

在一个池中使用多个RAID-Z设备与在一个池中使用多台镜像设备非常相似。对磁盘故障的容忍度是针对每个VDEV的,而不是针对每个池的。如果每个VDEV只丢失两个磁盘,那么由两个六磁盘RAID-Z2 VDEV组成的12磁盘阵列可以处理四个磁盘的丢失。

很多硬盘

常见的建议是每个VDEV使用不超过9到12个磁盘。您可以使用更多,但ZFS不是为此而设计的。让我们来看一个由36个磁盘组成的阵列,看看一些可能的安排及其对性能的影响。

Table 6: Many Disks Virtual Device Configurations

DisksConfigRead IOPSWrite IOPSRead MB/sWrite MB/sUsable SpaceFault Tolerance
3618 x 2 disk Mirror900045003600180018 TB (50%)18 (1/VDEV)
3612 x 3 disk Mirror900030003600120012 TB (33%)24 (2/VDEV)
361 x 36 disk RAID-Z22502503400340034 TB (94%)2
362 x 18 disk RAID-Z25005003200320032 TB (89%)4 (2/VDEV)
364 x 9 disk RAID-Z2100010002800280028 TB (78%)8 (2/VDEV)
366 x 6 disk RAID-Z2150015002400240024 TB (66%)12 (2/VDEV)

通过使用更多的VDEV,您可以创建快速池。一个由18个双磁盘镜像VDEV组成的池可以比其他任何东西更快地读取数据,并且在发生故障之前可能会丢失18个驱动器!是的,它们必须是正确的18个驱动器,但如果你有两个带不同电源的磁盘架,这是完全可能的。另一方面,如果该池中错误的两个磁盘发生故障,则整个池都会死亡。

为每个VDEV添加奇偶校验或镜像可以提高可靠性。更多的VDEV可以提高性能。你的工作是兼顾这两个特征来支持你的环境。

每个VDEV仅限于最慢磁盘的随机读/写性能,因此,如果你在一个VDEV中有太多磁盘,你只会为了空间效率的小幅提高而牺牲性能。虽然您可以添加L2ARC和SLOG设备来提高性能,但最好完全避免这些问题。

因此,如果更多的VDEV总是更好,为什么6 x 6磁盘RAID-Z2池的读写速度比1 x 36磁盘RAID-Z2中池慢得多?答案就在容错栏中。当你有更多的RAID-Z2 VDEV时,你就有了更多的冗余,你可以在更多的故障中幸存下来。当磁盘提供容错功能时,它会存储数据的额外副本,这样它就可以替换磁盘故障时丢失的副本。每次数据更改时,系统都会重新计算并存储奇偶校验数据。读取文件时不使用奇偶校验数据,除非原始副本丢失。用于奇偶校验的磁盘不再有助于流媒体性能。您可以通过添加更多磁盘来恢复该性能。一个6 x 8磁盘的RAID-Z2池相当于36个数据磁盘和12个奇偶校验磁盘,并且能够超越1 x 36磁盘的RAID-Z2池。

让我们利用您对VDEV的了解,用它们创建一些实际的池。