我们的大部分系统管理培训都侧重于文件系统。计算机的文件系统决定了它的性能和行为。在过去的几十年里,我们重建了整个系统,因为一个主要的文件系统配置不正确,或者选择的文件系统不适合这项任务,或者因为微妙的文件系统损坏遍布我们的文件,现在我们甚至不能信任操作系统附带的基本程序。任何做过几年多系统管理员的人都学会了如何修复文件系统、重建文件系统、解决从烦人到近乎致命的错误、重新排列磁盘以支持文件系统限制,并广泛使用不少于九种语言的文件系统。
在计算规模上,当今一些最流行的文件系统是古老的。我们丢弃硬件,因为它已经使用了五年,而且速度太慢,无法承载——然后用一个30年陈的文件系统来替换它。甚至更现代的文件系统,如extfs、UFS2和NTFS,也在其核心使用了旧的思想。
Z文件系统(ZFS)将改变这一切。
ZFS是一种现代文件系统,其核心思想是文件系统应该能够保证数据完整性。ZFS为磁盘上的每条数据计算一个校验和,因此它可以识别存储介质何时发生错误并损坏数据。它对所有元数据执行相同的加密签名。当底层硬件出现问题或出现故障时,ZFS会意识到它检索到的数据与其记录不匹配,并可以采取行动。ZFS甚至可以自动纠正发现的错误!ZFS拒绝提供已知已损坏的数据。
文件系统设计人员在30年前就有了这些想法,但当时的硬件无法以合理的性能执行如此大量的错误检查。ZFS的创建者查看了当前的硬件以及硬件的发展方向,并决定ZFS将充分利用新兴硬件。其结果是,文件系统不仅比传统文件系统更可靠,而且通常更快。
今天,传统的文件系统似乎是用【good enough for now】——目前足够好——的理念编写的。许多文件系统都受到专制的(arbitrary)大小限制的困扰,这足以维持五年、十年甚至二十年,但最终需要重写和返工。许多较旧的文件系统无法处理大于2GB的分区,如今,这比你免费连接到开瓶器上的闪存驱动器还小。(事实上,你之所以选择它,是因为你想要开瓶器。)但在20世纪80年代初,当UFS首次发布时,2GB的存储空间大得离谱,需要花费数百万美元。像FAT这样的文件系统需要有效地使用360 KB软盘上的空间。UFS“目前已经足够好了”,在未来的一段时间里也是如此。
ZFS经过精心(deliberately)设计,可以在可预见的未来甚至更长时间内生存下来。许多新的文件系统在内部使用64位标识符和索引,因此它们在未来十年或二十年内可以使用而无需更改。ZFS内部使用128位标识符,使其有足够的容量在未来几千年内在存储系统上工作。《Star Trek》(星际迷航)中的企业计算机可能运行ZFS。未来的系统管理员必须处理超过ZFS内置限制的磁盘、分区和文件,他们将把我们与洞穴人和第一批星际旅行者混为一谈。
严格来说,ZFS不仅仅是一个文件系统。它是文件系统和卷管理器的组合。将这两个功能组合在一组软件中确实会带来某些限制,我们稍后会讨论这些限制,但这也使一些非常有趣的事情成为可能。ZFS知道数据在磁盘上的确切位置,可以从上到下最佳地排列文件和条带。ZFS可以使用辅助快速存储作为专用缓存,进一步提高性能。
《FreeBSD Mastery: ZFS Essentials》将带您了解运行这个现代、高性能、面向未来的(future-proof)文件系统所必需的知识。
Matt Ahrens 和 Jeff Bonwick 为 Sun Microsystems的Solaris®操作系统创建了ZFS。虽然Sun销售各种规模的系统,但其主要重点是高端服务器硬件。Sun硬件驱动了世界上大多数大型数据库。Sun根据其通用开发和分发许可证(Common Development and Distribution License,CDDL)向世界提供了ZFS源代码。人们开始将ZFS移植到其他操作系统,包括FreeBSD,并将更改贡献回Sun。
随后,Oracle收购了Sun Microsystems。虽然Oracle有一些开源软件,如MySQL,但它的大部分软件都是专有的。Oracle将ZFS开发完全内部化,并停止在任何开源许可证下提供源代码。
但ZFS代码已经公开发布,根据CDDL许可条款,Oracle无法阻止人们使用它。各种开源项目都展开了自己的ZFS开发工作。
今天,OpenZFS项目(http://open-zfs.org)是ZFS开源版本的主要协调人。OpenZFS汇集了来自许多公司和操作系统的ZFS开发人员,包括Linux、OS X、Illumos和FreeBSD。Matt Ahrens领导这个项目。
与FreeBSD的其他部分不同,ZFS具有限制性许可证。CDDL限制了一个人提起专利诉讼的能力,对ZFS的捐款会自动归入CDDL。FreeBSD的2-clause BSD许可证允许任何人将代码用于任何事情,包括专利诉讼。但是CDDL允许重用、重新分发和更改代码,因此代码可供任何常见企业环境中的任何人使用。但是,如果您想将ZFS作为产品的基础或将ZFS包含在另一个产品中,请咨询律师。
本书是为对ZFS感兴趣的FreeBSD系统管理员编写的。我们假设您熟悉FreeBSD的基础知识,包括安装、配置用户和管理基于GEOM的存储。你应该知道什么是“storage provider (存储提供者)”,以及我们为什么使用这个术语。如果你不确定自己的技能,你可以拿起一本书,比如《Absolute FreeBSD》(No Starch Press,2007)或其他 《FreeBSD Mastery》书籍来增加你的知识,或者查阅在线文档和手册页。
如果你在FreeBSD以外的操作系统上使用OpenZFS,这本书提供了一堆实用的ZFS知识和经验,你可以利用。你需要忽略FreeBSD特有的东西,但你会学习如何优化和管理ZFS。
我们还没有针对Oracle ZFS测试这本书。Oracle已经将其闭源ZFS推向了自己的方向,如果您必须运行Oracle Solaris,最好阅读Oracle的官方文档。
你真的应该了解一些磁盘技术。FreeBSD的ZFS可以在任何GEOM提供程序上运行,但在原始(raw)磁盘上运行有一定的好处。在RAID容器上运行ZFS消除了这些好处。您应该能够将RAID控制器作为一堆磁盘来使用。
你还应该有一台测试机器来玩ZFS。不要买这本书,立即将主数据库服务器迁移到ZFS!在测试机器上安装ZFS,然后在不太关键的机器上安装。尝试ZFS功能,直到您确信可以最好地配置ZFS以支持系统的目的。虽然ZFS很快,但没有一个文件系统如此宽容,以至于系统管理员无法将其配置为性能不佳。
您可以在任何地方使用ZFS,但在某些地方它不会很好地工作。
ZFS可能不是某些虚拟化系统的最佳选择。我们使用了多个基于Linux KVM的虚拟化系统,这些系统阻塞了ZFS文件系统,看到其他系统也有类似的问题,我们不会感到震惊。主机之间的迁移和从基于映像的(image-based)备份还原等功能可能会出现问题。在使用ZFS之前,您需要在虚拟化系统上对其进行全面测试。Lucas在这些系统上部署了ZFS,但他使用了其他备份和迁移策略。
ZFS是为现代硬件编写的。它预计你至少有几GB的RAM。Raspberry Pi等嵌入式系统更适合UFS2等传统文件系统。
某些硬件上的某些高强度工作负载在UFS2上比在ZFS上表现更好,特别是如果你有实际512字节块的硬盘驱动器。如果您希望击败数据库中的鼻涕虫(the living snot),请使用UFS2和ZFS测试其性能。
传统硬盘的扇区大小为512字节,这类硬盘称为原生512硬盘。
许多人推荐ZFS的高端硬件。我们也喜欢高端硬件。它很漂亮。但ZFS在普通硬件上运行良好,只要你了解硬件的局限性。你在互联网上找到的许多ZFS文档都包含了不适用于现代ZFS或不适用于FreeBSD的建议。
Sun的文档说你需要ECC RAM才能很好地使用ZFS,这并不奇怪。Sun销售高端服务器。但根据Matt Ahrens的说法,“在没有ECC的系统上,ZFS并不比在有ECC的系统中的任何其他文件系统更危险。” ZFS的内置纠错功能可以补偿大多数但不是所有由内存引起的错误。
当然,支持ECC RAM的通用论点仍然有效。具有非ECC内存的机器可能会出现内存损坏,其中一些错误可能会到达磁盘。然而,无论您使用什么文件系统,都会发生这种情况,ZFS校验和为识别问题提供了希望。如果您正在运行高可用性服务,出于所有常见原因,您都需要ECC。但是,您的ZFS笔记本电脑或家庭电影服务器在正常RAM下运行良好。
永远不要使用硬件RAID控制器。在硬件RAID设备上运行ZFS会创建一种具有RAID和ZFS所有缺点的配置。为磁盘控制器使用非RAID主机总线适配器(host bus adapter,HBA)。
所有RAID都是软件RAID。您的硬件RAID控制器运行自定义操作系统来执行RAID任务,并在此过程中将硬件与操作系统隔离开来。这在商业计算普及的早期是有道理的,当时消费者操作系统无法被信任来管理存储。花三秒钟考虑在Windows 3.1上运行操作系统级软件RAID,你就会明白为什么硬件RAID变得如此普遍。
我们的操作系统已经变得更好了。我们的硬件性能要强大数十亿倍。环境已经发生了变化。 ZFS设计用于直接访问硬件。它故意将关键元数据存储在多个磁盘上。它监视这些磁盘是否有错误,并根据这些错误做出决定。硬件RAID设备对操作系统隐藏了所有这些令人担忧的细节,消除了ZFS自我修复的能力。硬件RAID没有竞争能力。
由于ZFS将冗余与文件系统集成在一起,重建ZFS阵列比重建RAID阵列快得多。如果使用硬件RAID管理冗余,则会失去这种速度。
然而,许多RAID控制器不允许您在没有某种RAID的情况下使用磁盘。即使您将控制器配置为“只有一堆磁盘”(just a bunch of disks,JBOD),这些控制器实际上也会将每个驱动器格式化为单个磁盘RAID-0。这会从操作系统中屏蔽某些信息,如块大小和许多磁盘错误。更糟糕的是,这种控制器上使用的磁盘只能由这种品牌的控制器读取,有时甚至只能由这种型号的RAID控制器读取!将这种RAID控制器用于ZFS意味着您将无法在不重新格式化的情况下将这些硬盘驱动器移动到另一台机器上,除非新盒子恰好有完全相同的RAID卡。这消除了ZFS的所有池可移植性。
一些硬件RAID卡可以重新刷新为JBOD控制器。坏的闪存可能会损坏您的RAID卡。由于两位作者都不会再次使用硬件RAID,我们冒着这个风险。
如果你注定要使用硬件RAID,可能是因为你前世是一个非常糟糕的人,那么就给操作系统配备一个磁盘。如果RAID控制器坚持将每个磁盘格式化为RAID-0,那么您就陷入了困境。禁用控制器上的“回写”(write back)模式;否则,控制器的写缓存可能会损坏您的文件系统。让自己屈服于增加的复杂性、降低的性能和增加的风险。一定要在给管理层的电子邮件中记录所有这些,这样当不可避免的失败发生时,你会很高兴地说“我早就告诉过你”,以弥补从备份中恢复的痛苦。
主机总线适配器比RAID卡便宜得多,不仅在金钱上,而且在时间上。使用它们。
数据存储设备有各种类型。ZFS可以使用SAS驱动器、SATA驱动器、旋转磁盘、SSD设备或操作系统支持的任何其他存储介质。
这并不是说驱动器是等效的。在相同的负载下,SAS驱动器的使用寿命通常比SATA驱动器长得多。闪存驱动器比任何类型的旋转磁盘都快得多。ZFS可以在其中任何一个上存储数据。根据组织的需求而不是ZFS来选择驱动器硬件。
ZFS可以特别利用超快速存储作为读写缓存。如果你能在基于SAS或SATA的存储阵列中添加几个固态磁盘,你就可以大大提高ZFS的性能。
存储阵列同时丢失多个磁盘的情况并不罕见。电源浪涌会损坏多个磁盘。密集的阵列重建会对剩余的磁盘造成压力。架子的一侧可能会积聚热量。正是由于这些原因,ZFS支持多种冗余场景。
如果你买了一大堆相同的磁盘,它们可能都是在同一天或同一批中制造的。制造厂糟糕的一天会让你很痛苦。遗憾的是,磁盘零售商无法为您发货不同日期或不同批次的驱动器。你能做的最好的事情就是让每个阵列都包括多个制造商制造的驱动器。
FreeBSD支持多路径(multipath)存储,使您能够解决许多硬件问题。重新排列硬件可能会提高系统的可用性和可靠性。如果您有两个外部磁盘阵列,也许可以使用镜像对(mirrored pair)中每个阵列中的一个磁盘。这样,如果磁盘阵列的电源耗尽,每个镜像仍然有一个活动磁盘。当故障阵列恢复时,镜像会自动恢复。由于这是专用设备,我们将在《FreeBSD Mastery:Advanced ZFS》中讨论多路径。
安装前检查硬件。考虑一下它可能会如何失败,以及如何正确安排您的套件来防止停机。
不,不要使用标签机,在每个硬盘上贴一个小标签。这些东西上的胶水永远不会粘(尽管你应该给磁盘贴上物理标签)。FreeBSD支持全局唯一ID(Globally Unique ID,GUID)分区表(Partition Tables,GPT)标签,允许您在硬盘或分区上放置任意逻辑标记。如果存储设备有问题,FreeBSD会宣布问题,并通过设备名称或设备节点识别出有问题的单元。虽然很高兴知道磁盘 /dev/da239 有问题,但您必须将其追溯到物理设备。许多ZFS用户的机器有许多硬盘,加剧了这个问题。
FreeBSD工具允许您获取故障驱动器的序列号。然而,根据您的硬件,您可能需要实际检查每个驱动器以识别其序列号。这通常涉及打开机箱或从磁盘阵列中取出单个驱动器。这是乏味、不愉快的,而且最常见的是中断服务。
如果在安装过程中进行准备,您可以直接瞄准故障磁盘,甚至是远程设施中的磁盘。Jude在世界各地运行着许多非常密集的存储阵列,并使用这种方案来防止硬盘维护让他不堪重负。
为您的存储阵列制定一个命名和编号方案。许多存储阵列都有一个标准的命名方案,通常印在设备上。如果您的设备已经有编号的机架,请使用该编号。否则,制定简单的规则,如“机架0始终在顶部,磁盘0始终在左侧”。您可以使用前缀“f”表示前面,“b”表示后面,或者任何适合您的前缀。
在阵列中安装每个驱动器时,请记下其序列号。在安装每个驱动器托盘时,根据物理位置和序列号对其进行物理标记。是的,这很乏味,但你最终会需要这些信息。你可以按照自己的节奏平静地完成这项工作,也可以在人为延长和不必要的压力中断期间拼命地完成它。
现在,要么安装FreeBSD,要么启动live media。使用 camcontrol devlist 获取所有存储设备的列表,然后在每个存储设备节点上运行 diskinfo -v 以获取其序列号。(您还可以从 camcontrol(8) 中提取序列号。这将告诉您,例如,磁盘 /dev/da0 实际上是机架4上的磁盘3。
现在,您有一个设备节点及其相关序列号的列表,以及一个物理位置和序列号列表。将它们相互匹配,然后使用GPT标签将位置和序列号附加到您正在使用的磁盘分区。(有关GPT标签的详细信息,请参阅FreeBSD文档或《FreeBSD Mastery:Storage Essentials》)GPT标签最大长度为15个字符,因此您可能需要截断长序列号。在大多数序列号中,最后一位数字是最唯一的,所以去掉前面的数字。
组合在一起,机框2中序列号为WD-WCAW36477223的磁盘9可能会获得类似 /dev/gpt/s2d9-AW36477223 的标签。
您希望您的系统使用这些标签,并且只使用这些标签。禁用系统上的GPTID和磁盘标识标签。这避免了以后的混淆。
通过此设置,在硬件故障期间,FreeBSD现在可以告诉您机框4上的第三个磁盘(序列号等)坏了。考虑到这些信息,即使是托管提供商的最初级技术人员也应该能够取出正确的磁盘。在安装之前,让技术人员给你更换驱动器的序列号,这样你就可以创建正确的标签。
提前规划可以大大减少停机带来的创伤。我们强烈推荐它。
xxxxxxxxxx# camcontrol devlist<INTEL SSDSC2BX480G4 G2010150> at scbus0 target 0 lun 0 (pass0,ada0)<TOSHIBA MG08ADA800E 4302> at scbus1 target 0 lun 0 (pass1,ada1)<HGST HUS728T8TALE6L4 V8GNW9G0> at scbus2 target 0 lun 0 (pass2,ada2)<WDC WD6003VRYZ-02JCFB0 01.01H01> at scbus3 target 0 lun 0 (pass3,ada3)<KIOXIA-EXCERIA SATA SSD SBFA1a.1> at scbus4 target 0 lun 0 (pass4,ada4)然后在每个存储设备节点上运行diskinfo -v命令以获取其序列号:
xxxxxxxxxx# diskinfo -v /dev/ada0/dev/ada0 512 # sectorsize 480103981056 # mediasize in bytes (447G) 937703088 # mediasize in sectors 4096 # stripesize 0 # stripeoffset 930261 # Cylinders according to firmware. 16 # Heads according to firmware. 63 # Sectors according to firmware. INTEL SSDSC2BX480G4 # Disk descr. BTHC703208JM480MGN # Disk ident. ahcich0 # Attachment Yes # TRIM/UNMAP support 0 # Rotation rate in RPM Not_Zoned # Zone Mode这本书适合任何管理ZFS文件系统或对现代高性能文件系统感兴趣的人。虽然它侧重于FreeBSD上的ZFS,但ZFS的一般信息适用于运行OpenZFS的任何平台。本书的部分内容恰好适用于其他实现,如Oracle ZFS,但你不能假设本书适用于这些其他实现。
我们真的很想写一本FreeBSD OpenZFS的书,但所选出版平台的局限性使这变得不切实际。《FreeBSD Mastery: ZFS》涵盖了ZFS的日常使用。下一本书《FreeBSD Mastery: Advanced ZFS》涵盖了在线复制、性能调优和其他需要更好地理解ZFS的主题。然而,第二本书假设你理解这本书中的所有内容。
OpenZFS不断进步。这本书是一个静态的实体。更重要的是,一本涵盖OpenZFS所有功能的书的大小相当于曼哈顿电话簿的印刷版。这些书试图提供绝大多数系统管理员运行ZFS所必须知道的知识。如果你正在寻找一个我们不讨论的功能,或者你有一个我们没有涵盖的特殊边缘案例,一定要查看手册页、在线OpenZFS文档以及FreeBSD邮件列表档案和论坛。
第0章是这份介绍。
第1章,介绍ZFS
为您提供了ZFS软件套件的鸟瞰图。您将学习如何查看ZFS文件系统和数据池,并了解ZFS的大块(large chunks)是如何组合在一起的。
第2章,Introducing ZFS,虚拟设备
将带您了解ZFS的物理冗余方案。ZFS支持传统的镜像磁盘和级联设备,但也提供了自己的高级基于奇偶校验的冗余RAID-Z。
第3章,Pools,池
讨论了ZFS存储池。您将学习如何将虚拟设备组装到池中,如何检查池,以及如何管理和查询存储池。
第4章,Datasets,数据集
将带您了解传统主义者所说的文件系统。除了ZFS,它并不是一个真正的文件系统。是的,你把文件放在数据集中,但数据集要多得多。
第5章,Pool Repairs and Renovations,池维修和翻新
涵盖了对存储池的更改。您可以使用其他磁盘扩展存储池,修复故障磁盘,并调整池以支持新功能。
第6章,Disk Space Management,磁盘空间管理
涵盖了使用ZFS时最容易被误解的部分之一。为什么您的1TB驱动器声称有87TB的空闲容量?如何为某些用户保留空间并限制其他用户?那么这种重复数据删除的东西呢?本章涵盖了所有这些以及更多。
第7章,Snapshots and Clones,快照和克隆
讨论了ZFS的快照功能。您可以创建数据集的时间点照片,稍后再参考。你想要一份昨天存在的文件的副本吗?快照是你的朋友。同样,克隆允许您复制文件系统。你会明白的。
第8章,Installing to ZFS,安装到ZFS
介绍了如何将FreeBSD安装到ZFS。FreeBSD安装程序可以为您安装基于ZFS的系统。安装程序一直在改进,但现实世界比任何安装程序所期望的都要复杂。知道如何按照你想要的方式安装系统是有用的。
系好安全带,准备好进入21世纪的文件系统。