第二章 虚拟设备

磁盘和其他存储介质

ZFS也可以运行在磁盘以外的存储介质上。

所有FreeBSD GEOM存储提供者都可以成为ZFS存储介质。

ZFS甚至支持使用文件作为后备存储。这仅适用于测试环境,不适合生产环境。

ZFS可以使用任何块设备进行物理存储,但每种类型都有其优缺点。

原始磁盘存储

使用整个硬盘可以降低ZFS的复杂性。但需要注意以下几点:

分区存储

使用分区的最大优点是,可以通过创建一个小的引导分区从包含ZFS分区的磁盘引导,而不需要单独的引导设备。

使用分区还允许将部分磁盘空间用于其他用途,比如原始交换分区、另一个文件系统,或者只是在磁盘末尾留出一些备用空间,这样在替换磁盘时就不必担心匹配扇区数。

分区还可以利用磁盘的“短行程”以提高性能。

出于性能原因,Solaris ZFS管理指南建议不要使用分区(在Solaris术语中叫slices)。在Solaris中为文件系统使用分区会禁用写缓存。在FreeBSD中,禁用写缓存与磁盘分区或文件系统完全分离。

FreeBSD在分区上使用ZFS时提供了完整的性能。

强烈建议在FreeBSD中使用GPT分区方案。

MBR将限制主分区数量为4个,GPT最多支持128个分区。 MBR最多只能管理2TB磁盘,GPT最多可以管理512字节扇区的8ZB和4K字节扇区的64ZB。

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

GEOM设备存储

使用GEOM设备介于文件系统和物理设备之间。

GEOM类提供了全盘加密(GELI,GBDE)、高可用性、标签、多路径和可插拔调度器等功能。

GEOM类可基于整个设备创建,也可以在另一个GEOM类(如分区、多路径设备或加密磁盘)上创建。

GELI是FreeBSD磁盘加密子系统。是实现加密ZFS池的最佳方式。

GELI在ZFS和物理磁盘之间传递块时对其进行加密和解密,故对ZFS来说是透明的。

GELI支持多种加密算法,默认的AES-XTS提供了最佳新能,特别是在支持AES新指令(AES-NI——AES New Instructions)的现代CPU上。借助此硬件卸载功能,GELI可以以超过1GB/秒的速度加密速度,解密速度更快。这意味着即使是在SSD上添加加密也不会降低性能。

GELI可以选择提供数据身份验证,在每个扇区中存储哈希消息身份验证码(HMAC——Hashed Message Authentication Code)。它使用此验证码来验证数据的完整性(数据未被篡改)和真实性(此数据是合法写入)。默认情况下HMAC功能未启用,对ZFS来说是多余的,因为ZFS的每个数据块上都提供了自己的校验和。

FreeBSD的分布式存储解决方案(HAST——High Availability Storage Technology,高可用存储技术)允许通过网络在计算机之间镜像块设备。

使用HAST作为ZFS池的后备存储,可以将每个后备磁盘镜像到第二台机器。

HAST的优点是它是实时的,在将块写入HAST集群中所有主机之前,不认为该块已经被写入。但在使用HAST时,第二台机器不能与第一台同时导入或装载池。

GEOM标签提供了一种方便的方法,可以在每个磁盘或分区上附加有意义的注释。

标签类型有很多,包括磁盘标识、gpid、GPT标签和GEOM特定的glabel等标准。

对于“双端口”的企业驱动器,GEOM还支持多路径以实现高可用性。

GEOM调度模块允许管理员指定不同的I/O调度算法,以尝试实现更好的性能。当前可用的调度器有两种

基于文件的存储

仅推荐用于测试环境。

提供者 vs. 磁盘

Provider是FreeBSD中的一个技术术语。用于表示提供数据存储的东西。

可以是一块磁盘,也可以是一个以某种方式转换存储的GEOM类。

理论上讲,一个磁盘上可以有多个provider,但如果使用这种provider创建存储池,则冗余形同虚设。

VDEVs:Virtual Devices

VDEV是ZFS的逻辑存储单元。

每个VDEV由一个或多个GEOM提供者组成。

常见的VDEV类型包括镜像磁盘、普通磁盘、三种RAID-Z。

虚拟设备的排列决定了池的性能以及它抵抗物理损伤的能力。

ZFS几乎所有冗余都来自VDEVs。

当存储池由多个VDEV组成时,池数据会分布在这些VDEV上,没有冗余。

ZFS讲VDEV视为提供存储空间的单个单元。

存储池在VDEV丢失后无法生存。

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

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

VDEV冗余

ZFS使用冗余来自我修复,没有冗余的VDEV不支持自我修复。

Stripe(1 Provider)

单个磁盘组成的VDEV成为条带,没有冗余。

ZFS池将数据条带化到池中所有VDEV上,并依赖VDEV提供的冗余。

Mirror(2+ Providers)

镜像中可以使用任意数量的磁盘,只要有一个是好的,数据就不会丢失。

镜像提供了非常好的随机和顺序读取速度。但写入速度会受影响。

最终的写入速度取决于最慢的那块磁盘。

RAID-Z1(3+ Providers)

类似于RAID-5,但包括了校验和以确保文件完整性。

校验和和ZFS的写时复制(copy-on-write)功能可以确保不完整的写入不会导致文件系统不一致。

RAID-Z在所有磁盘上传输数据和奇偶校验信息。如果有提供者失效,RAID-Z将使用奇偶校验信息重新计算丢失的数据。

RAID-Z1 VDEV可以承受任何单一的提供者故障。在更换完成之前又有一个提供者出现故障,则数据将全部丢失。

从奇偶校验数据重建磁盘阵列可能需要很长时间。如果使用的是大磁盘,比如超过2TB,则在修复第一个驱动器时,第二个驱动器发生故障的几率会很大。

对于更大的磁盘,尽量考虑RAID-Z2。

RAID-Z2(4+ Providers)

类似与RAID-Z1,但每个VDEV有两个奇偶校验磁盘。

比RAID-Z1稍慢,但在更换磁盘时,可以更从容一些。

RAID-Z3(5+ Providers)

最偏执的RAID-Z形式,每个VDEV使用三个奇偶校验磁盘。

比RAID-Z2更慢。

RAID-Z磁盘配置

任何RAID-Z中的提供者数量是完全固定的,无法向VDEV中添加驱动器以扩展它们。

可以通过添加VDEV来扩展池,但不能通过添加磁盘扩展VDEV。

且ZFS项目没有计划添加此功能。

不要将不同结构的VDEV放在同一个池中。

RAID-Z规则

以上规则当且仅当(if and only if)数据由大小为2的幂次方的小块组成时有效。

所以,制订何种RAID-Z级别,应着重于数据的预期重要性,以及采用的设备的可靠性。

修复VDEVs

当属于冗余VDEV的提供者发生故障时,它所属的VDEV将降级(degraded)。降级的VDEV仍拥有其所有数据,但性能会降低。

更换提供者后,系统必须将数据存储在新提供者上。

ZFS在重建时仅写入实际使用的块,加快RAID-Z恢复速度,减少可能导致数据丢失的并发故障的可能性。

RAID-Z与传统RAID对比

RAID-Z最大的优势在于,ZFS是卷管理器和文件系统,以及磁盘冗余。

通过结合文件系统和卷管理器,ZFS可以准确判断所有数据的位置以及存储层和数据的交互方式。这允许ZFS做出许多重要决定,比如确保重要数据的额外副本存储在单独的磁盘上。

ZFS将重复块(ditto blocks)放在相邻的磁盘上,因为从统计学上讲,相邻的两个硬盘同时发生故障的概率很小。

传统RAID可能存在一个被称为“写入漏洞”(write hole)的缺点:RAID5/6在写入数据时断电造成奇偶校验不匹配;或不正确的镜像会导致设备向文件系统返回垃圾数据。

ZFS通过写时复制和校验和解决了写入漏洞问题。

特殊VDEVs

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

单独意图日志(SLOG,ZIL)

与其他一些文件系统中的日志类似,ZIL(ZFS Intent Log)是它写入正在进行的操作的地方,因此可以在系统崩溃或电源故障时完成或回滚这些操作。

ZIL受磁盘正常运行条件的影响。

池的使用量或与负载相关的延迟可能突然激增,从而导致性能下降。 提高性能的一种方法是将ZIL与正常池操作分开。将专用设备用作单独的ZIL或SLOG,专用设备通常是一个很小但速度很快的设备,比如耐久性很高的SSD。

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

数据库通常会在收到它写入磁盘的数据确实在磁盘上的确认信息后,才会继续工作。某些NFS操作也会这样做。通过将这些请求写入更快的日志设备并报告“全部完成”,可以加速这些软件的操作。

建议对ZIL进行镜像以确保数据完整性。

缓存(Cache , L2ARC)

ARC——Adaptive Replacement Cache 自适应替换缓存。

ARC保留最近和经常访问的文件。

ZFS使用高速磁盘来加速读取,这被称为Level 2 ARC(L2ARC)。

当一个对象的使用频率足以从缓存中受益,但不足以对存储在RAM中的对象进行评级时,ZFS可以将器存储在缓存设备上。

L2ARC通常是一种非常快速和高耐久性的SSD或NVME设备。

一般会使用两个SSD或NVME设备做条带,以提高速度。

VDEVs如何影响性能

一种常见的度量是每秒输入/输出(IOPS——Input/Output Per Second),即驱动器每秒可执行的不同操作的数量。

旋转驱动器的IOPS通常受到磁头在盘片上从一个位置移动到另一个位置的速度的物理限制(物理寻道时间)。固态盘则避免了这个问题。

磁头的数量限制了流式读写性能。“流”(streaming)性能归结为驱动器每秒可读取或写入的兆字节数(MB/s)。

顺序读写时磁头不必来回寻道,此时才能实现最佳的流媒体性能,从而提供最高的吞吐量。

主轴计数会影响随机和流媒体性能。

12个1TB驱动器的阵列通常优于6个2TB驱动器阵列,因为更多的主轴和磁头数量可以提高IOPS和流性能。

然而,驱动器数量越多,就需要更大的机箱或机架、更多的电源、更多的控制器。

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

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

具有多个VDEV的池将其数据条带化到所有VDEV上,这提高了性能,但可能占用空间,因为每个单独的VDEV都要有自己的冗余磁盘。

池中的VDEV约多,池的性能就越好。

以下假设使用的是一组普通的1TB硬盘,每个硬盘的IOPS为250,流式读/写速度为100MB/s。

一个硬盘

只有一个磁盘,即只有一种可能的配置——单个ZFS条带VDEV。没有容错。

Table 1: Single Disk Virtual Device Configurations

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

 

两个硬盘

两个硬盘可以组成两个条带(stripe)VDEVs,或者一个镜像(mirror)VDEV。

条带VDEV使可用存储和带宽加倍,但故障风险也加倍。

单个镜像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。

使用三个条带磁盘的池风险更大。

更深的镜像有更多的磁盘,提供更多的容错能力和改进的读取性能、更快的随机读取。而写入性能仍然取决于最慢的磁盘。

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不一定能扩展到实际的读/写性能。

四或五个硬盘

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

多个镜像VDEV为数据库等随机I/O工作负载提供了最佳性能。

将四个磁盘划分为两个镜像VDEV,每个镜像VDEV包含两个磁盘时,ZFS会在两个镜像上对写入进行条带化。

更多的奇偶检验磁盘意味着牺牲掉该磁盘的吞吐量。

对于多镜像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)

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

同样的,磁盘故障的容忍度是针对每个VDEV的,而不是针对每个池的。

很多硬盘

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不超过9到12个硬盘。