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