我正在考虑从 ext3 迁移到 ZFS 以在我的 Debian Linux 主机上使用ZFS on Linux进行数据存储。我真正想要的 ZFS 的一个杀手级特性是它的数据完整性保证。随着我的存储需求增加而微不足道地增加存储的能力也是我所期待的。
但是,我也在同一台主机上运行了一些虚拟机。(虽然通常情况下,在我的情况下,任何时候主机上都只有一个 VM 运行。)
考虑到 ZFS 的数据校验和和写时复制行为,以及 VM 磁盘映像是相对较大的文件这一事实(我的主 VM 的磁盘映像文件目前位于 31 GB),这样的 VM 来宾内部的性能影响是什么?迁移?我可以采取哪些步骤来减少可能的负面性能影响?
如有必要,我可以在 VM 磁盘映像上使用较少的数据完整性保证(我不会在任何 VM 内做任何真正关键的事情),并且可以轻松地将它们与文件系统的其余部分分开,但如果我不这样做会很好不必(甚至有选择地)关闭几乎让我想迁移到不同文件系统的功能。
硬件对于工作站级系统来说是相当强大的,但对于高端服务器(32 GB RAM,很少使用 > 10 GB,6 核 3.3 GHz CPU,目前 2.6 TB 可用磁盘空间根据df
总共大约 1.1 TB 可用;迁移到 ZFS 可能会增加一些可用空间)而且我不打算运行重复数据删除(因为在我的情况下打开重复数据删除不会增加太多)。计划是从 JBOD 配置开始(显然有良好的备份),但如果条件允许,我最终可能会转向双向镜像设置。
由于 ZFS 在块级别上工作,因此文件的大小没有区别。ZFS 需要更多的内存和 CPU,但作为文件系统本身并不会明显变慢。尽管您需要注意 RAIDZ 在速度上并不等同于 RAID5。RAID10 在速度优先的情况下很好。
体面(即 buff)硬件上的 ZFS 可能比其他文件系统更快,您可能希望在快速(即 SSD)位置创建 ZIL。这本质上是缓存写入的位置(嗯,更像是 ext3/4 中的日志)。这使得 box ack 在实际主轴有数据之前写入磁盘。
您还可以在 SSD 上创建 L2 ARC 用于读取缓存。这在 VM 环境中非常棒,您可以通过同时启动多个 VM 来使物理磁盘瘫痪。
驱动器进入 VDEV,VDEV 进入 zpool(请一次使用整个磁盘)。如果这是一个较小的系统,您可能需要一个 zpool 和(如果您不太担心数据丢失)一个 VDEV。VDEV 是您选择 RAID 级别的地方(尽管如果您有足够的磁盘,您也可以镜像 VDEV)。VDEV 中最慢的磁盘决定了整个 VDEV 的速度。
ZFS 是关于数据完整性的——许多用于文件系统维护的传统工具(如 fsck)不存在的原因是它们解决的问题在 ZFS 文件系统上不存在。
IMO ZFS 的最大缺点是,如果您的文件系统接近满载(例如 75%+),它会变得非常缓慢。只是不要去那里。
31GB真的一点都不大……
无论如何,根据您当前使用的文件系统,您可能会发现 ZFS 稍微慢一些,但考虑到您的硬件规格,它可能可以忽略不计。
显然,ZFS 将使用大量 RAM 进行缓存,这可能会使您的 VM 在一般使用中看起来“更敏捷”(当不进行大量读取或写入时)。我不确定如何在 Linux 上调整 ZFS,但如果可能的话,您可能需要限制它的 ARC,以阻止它与所有 RAM 一起跑掉(因为您需要为您的主机系统和虚拟机)。
我会启用压缩(这些天的建议是打开它,除非你有充分的理由不这样做)。请记住,这必须在将数据放入文件系统之前完成。大多数人惊讶地发现它实际上更快,因为压缩算法通常比磁盘 IO 运行得更快。我怀疑这会对您的 6 核处理器造成很大的性能问题。我没想到虚拟机会压缩太多,但我设法将大约 470GB 的虚拟机数据转换为 304GB,只是使用默认压缩设置。
不要为重复数据删除而烦恼,它稍后会再次困扰您,您将花费数周的时间来调整数据以试图摆脱它。
如果您确实遇到性能问题,那么显而易见的答案是添加 SSD 作为 ZIL/L2ARC 或两者兼而有之。对两者都使用一个设备并不理想,但它很可能仍会提高包含少量磁盘/vdev 的池的性能。
补充:如果可能的话,我真的会尝试从冗余配置开始(理想情况下是镜像),或者尽快从条带转换为镜像。虽然 ZFS 将对所有数据进行校验和并在运行中(或在清理期间)检测错误,但它无法对此做任何事情(不使用副本 = 2,这将使磁盘使用量翻倍)。您将只剩下它告诉您文件(可能是您的 VM 磁盘映像)中存在错误,如果不删除并重新创建这些文件,您将无法做很多事情。
根据您的用例和虚拟机,我会考虑以下内容。让主机操作系统处理您存储在 ZFS 卷上的文件。
如果可能,为每个虚拟机只创建一个 LUN,只包含操作系统和必要的二进制文件。并通过 NFS、samba 或 iSCSI(或评论中提到的 zvols)将个人数据的存储空间呈现为共享。ZFS 能够通过校验和和访问时间等跟踪每个文件。当然,如果速度不是那么重要,您也可以在某些数据存储上启用压缩。好处将是另一个文件系统的缺失层。如果您要为第二个虚拟硬盘创建一个 LUN 并在其上创建一个 NTFS 文件系统,ZFS 必须处理一个不知道任何内容或文件的大二进制 blob,因此无法利用 ZIL 或 ARC 缓存就像飞机文件一样。
提到 ACL,ZFS 能够通过 NFSv4 或 Samba(如果启用)使用 ACL。我确实承认我在 FreeBSD 上使用 ZFS,但不能确定如何使 Sambas ACL 与 ZFS 卷匹配。但我相信这应该没什么大不了的。
当所有虚拟机开始读取相同的块时,在节省一些空间和改进大量读取(引导风暴)时,重复数据删除与读取缓存相结合是一个很大的优势。
VM 和数据存储的 ZFS 快照也是如此。您可以创建一个简单的 shell 脚本来冻结虚拟机,拍摄虚拟机和数据存储的快照并继续工作,或者只创建数据存储,然后克隆虚拟机并呈现原始快照并测试一些东西。
ZFS 的可能性是无穷无尽的;)
编辑:希望我现在已经解释得更好了
EDIT2:个人意见:考虑使用 RAIDZ2(RAID6),因为您可以承受双磁盘故障!如果你只剩下一个备用磁盘,它永远不会出错,但两个磁盘故障应该足以快速反应。我只是在此处发布用于监视磁盘状态的脚本