在 Linux 上运行 ZFS
简介: 尽管 ZFS 所属的操作系统未来有一定的风险,但是不妨碍它成为最先进、功能最丰富的文件系统之一。它合并了可变块大小、压缩、加密、重复数据删除、快照、克隆以及(顾名思义)对大容量的支持。了解 ZFS 背后的概念,并了解目前如何在使用用户空间文件系统(Filesystem in Userspace,FUSE)的 Linux 上使用 ZFS。
Linux 与文件系统具有有趣的关系。因为 Linux 是开放式的,所以它往往是下一代文件系统和创新文件系统理念的关键开发平台。两个有趣的最新示例包括可大规模扩展的 Ceph 和连续快照文件系统 nilfs2(当然,主力文件系统,比如第四个扩展文件系统 [ext4] 的演化)。它还可以运行一些旧的文件系统 — DOS VFAT、Macintosh(HPFS)、VMS ODS-2 和 Plan-9 的远程文件系统协议。在 Linux 支持的所有文件系统中,有一个您可能会因其实现的功能而非常感兴趣:Oracle 的 Zettabyte 文件系统(Zettabyte File System,ZFS)。
ZFS 是由 Sun Microsystems(在 Jeff Bonwick 下)设计和开发的,在 2004 年首次公布,并在 2005 年集成到 Sun Solaris 中)。虽然将最流行的开放式操作系统与谈论最多的、功能最丰富的文件系统配对在一起是最理想的匹配,但是许可证问题限制了集成。Linux 受 GNU 公共许可证(General Public License,GPL)保护,而 ZFS 是遵循由 Sun 的通用开发和发布许可证(Common Development and Distribution License,CDDL)的。这些许可证协议的目标不同,各自的限制会有些冲突。所幸,这并不意味着您作为 Linux 用户不能享受 ZFS 及其提供的功能。
本文探究了在 Linux 中使用 ZFS 的两种方法。第一种使用了用户空间文件系统(Filesystem in Userspace,FUSE)系统来推动 ZFS 文件系统到用户空间以便避免许可证问题。第二种方法是一个 ZFS 本机端口,用于集成到 Linux 内核,同时避免知识产权问题。
ZFS 简介
将 ZFS 称为文件系统有点名不副实,因为它在传统意义上不仅仅是个文件系统。ZFS 将逻辑卷管理器的概念与功能丰富的和可大规模扩展的文件系统结合起来。让我们开始先探索一些 ZFS 所基于的原则。首先,ZFS 使用池存储模型,而不是传统的基于卷的模型。这意味着 ZFS 视存储为可根据需要动态分配(和缩减)的共享池。这优于传统模型,在传统模型中,文件系统位于卷上,使用独立卷管理器来管理这些资产。ZFS 内嵌入的是重要功能集(如快照、即写即拷克隆、连续完整性检查和通过 RAID-Z 的数据保护)的实现。更进一步,可以在 ZFS 卷的顶端使用您自己最喜爱的文件系统(如 ext4)。这意味着您可以获得那些 ZFS 的功能,如独立文件系统中的快照(该文件系统可能并不直接支持它们)。
但是 ZFS 不只是组成有用文件系统的功能集合。相反,它是构建出色文件系统的集成和补充功能的集合。让我们来看看其中的一些功能,然后再看看它们的一些实际应用。
存储池
正如前面所讨论的,ZFS 合并了卷管理功能来提取底层物理存储设备到文件系统。ZFS 对存储池(称为 zpools)进行操作,而不是直接查看物理块设备,存储池构建自虚拟驱动器,可由驱动器或驱动器的一部分物理地进行表示。此外,可以动态构造这些池,甚至这些池正在活跃地使用时也可以。
即写即拷
ZFS 使用即写即拷模型来管理存储中的数据。虽然这意味着数据永远不会写入到位(从来没有被覆盖),而是写入新块并更新元数据来引用数据。即写即拷有利的原因有多个(不仅仅是因为它可以启用的快照和克隆等一些功能)。由于从来不覆盖数据,这可以更简单地确保存储永远不会处于不一致的状态(因为在新的写入操作完成以后较早的数据仍保留)。这允许 ZFS 基于事务,且更容易实现类似原子操作等的功能。
即写即拷设计的一个有趣的副作用是文件系统的所有写入都成为顺序写入(因为始终进行重新映射)。此行为避免存储中的热点并利用顺序写入的性能(比随机写入更快)。
数据保护
可以使用 ZFS 的众多保护方案之一来保护由虚拟设备组成的存储池。您不但可以跨两个或多个设备(RAID 1)来对池进行镜像,通过奇偶校验来保护该池(类似于 RAID 5),而且还可以跨动态带区宽度(后面详细介绍)来镜像池。基于池中设备数量,ZFS 支持各种不同的的奇偶校验方案。例如,您可以通过 RAID-Z (RAID-Z 1) 来保护三个设备;对于四个设备,您可以使用 RAID-Z 2(双重奇偶校验,类似于 RAID6)。对于更大的保护来说,您可以将 RAID-Z 3 用于更大数量的磁盘进行三重奇偶校验。
为提高速度(不存在错误检测以外的数据保护),您可以跨设备进行条带化(RAID 0)。您还可以创建条带化镜像(来镜像条带化设备),类似于 RAID 10。
ZFS 的一个有趣属性随 RAID-Z、即写即拷事务和动态条带宽度的组合而来。在传统的 RAID 5 体系结构中,所有磁盘都必须在条带内具有其自己的数据,或者条带不一致。因为没有方法自动更新所有磁盘,所以这可能产生众所周知的 RAID 5 写入漏洞问题(其中在 RAID 集的驱动器中条带是不一致的)。假设 ZFS 处理事务且从不需要写入到位,则写入漏洞问题就消除了。此方法的另外一个便捷性体现在磁盘出现故障且需要重建时。传统的 RAID 5 系统使用来自该集中其他磁盘的数据来重建新驱动器的数据。RAID-Z 遍历可用的元数据以便只读取有关几何学的数据并避免读取磁盘上未使用的空间。随着磁盘变得更大以及重建次数的增加,此行为变得更加重要。
校验和
虽然数据保护提供了在故障时重新生成数据的能力,但是这并不涉及处于第一位的数据的有效性。ZFS 通过为写入的每个块的元数据生成 32 位校验和(或 256 位散列)解决了此问题。在读取块时,将验证此校验和以避免静默数据损坏问题。在有数据保护(镜像或 AID-Z)的卷中,可自动读取或重新生成备用数据。
在 ZFS 上校验和与元数据存储在一起,所以可以检测并更正错位写入 — 如果提供数据保护(RAID-Z)—。
快照和克隆
由于 ZFS 的即写即拷性质,类似快照和克隆的功能变得易于提供。因为 ZFS 从不覆盖数据而是写入到新的位置,所以可以保护较早的数据(但是在不重要的情况下被标记为删除以逆转磁盘空间)。快照 就是旧块的保存以便及时维护给定实例中的文件系统状态。这种方法也是空间有效的,因为无需复制(除非重新写入文件系统中的所有数据)。克隆 是一种快照形式,在其中获取可写入的快照。在这种情况下,由每一个克隆共享初始的未写入块,且被写入的块仅可用于特定文件系统克隆。
可变块大小
传统的文件系统由匹配后端存储(512 字节)的静态大小的块组成。ZFS 为各种不同的使用实现了可变块大小(通常大小达到 128KB,但是您可以变更此值)。可变块大小的一个重要使用是压缩(因为压缩时的结果块大小理想情况下将小于初始大小)。除了提供更好的存储网络利用外,此功能也使存储系统中的浪费最小化(因为传输更好的数据到存储需要更少的时间)。
在压缩以外,支持可变块大小还意味着您可以针对所期望的特定工作量优化块大小,以便改进性能。
其他功能
ZFS 并入了许多其他功能,如重复数据删除(最小化数据重复)、可配置的复制、加密、缓存管理的自适应更换缓存以及在线磁盘清理(标识并修复在不使用保护时可以修复的潜在错误)。它通过巨大的可扩展性来实现该功能,支持 16 千兆兆个字节的可寻址存储(264 字节)。