SmartOS 使用 ZFS 和客户文件系统

SmartOS 使用 ZFS 和客户文件系统

如果我使用 10 个左右的磁盘执行类似 RAIDZ2 的操作,那么在客户操作系统上,如果我使用像 ext3/4 这样的文件系统,客户文件系统是否会像使用 ZFS 一样安全?

我之所以问这个问题,是因为在阅读了一些资料后,建议在使用 ZFS 时,每 1TB 存储配备 1GB RAM(我最终会得到大约 20-40TB)。如果我在主机和客户机上都使用 ZFS,则需要双倍的 RAM。

答案1

是也不是。如果您在底层使用 ZFS,然后创建 zvols 并使用块协议提供它们 - 或者 - 您提供文件级协议 (NFS、CIFS) 并将文件创建为磁盘 (.vmdk、.vhd 等),您会获得一些安全性,但通常客户端 (在本例中为 VM 操作系统) 不一定默认设置为您现在受到的保护与您所期望的一样好。

原因是许多默认文件系统设置都追求性能,有时会牺牲安全性。这就是为什么即使使用本地硬盘,Windows 计算机在突然断电后也可能需要执行 CHKDSK(类似地,Linux 可能需要执行 fsck)。您必须仔细查看相关的操作系统和文件系统,以确定需要对其进行哪些修改(如果有的话),以使其更定期地与底层磁盘同步,和/或启用文件系统支持的任何日志记录。

此外,从客户端(VM OS)到服务器(ZFS)使用的协议选项也会产生一定影响。最臭名昭著的选项之一是 illumos/Solaris 衍生产品上通过 COMSTAR 实现的 iSCSI。大多数衍生产品上的默认设置是 COMSTAR 设置启用“写入缓存”的新 LU。默认情况下,这不会将所有传入的 I/O 同步传递到 ZFS,而只有在客户端(VM OS)明确标记时才会这样做。根据其他设置,VM OS 不将其所有 I/O 同步传递是很常见的,因此它不会同步进入 ZFS,因此它不会利用磁盘 ZIL 机制,因此您无法避免断电事件。

这里的主要问题基本上是,虽然 ZFS 本身应该是无损坏的,而且实际上甚至没有“fsck”样式的实用程序,因为 ZFS 通常不可能“损坏”自身,但如果这些上层文件系统没有在获得每个磁盘 I/O 后立即将其同步(默认选项很少这样做),则该逻辑不一定适用于 .vmdk 或 zvols 中的文件系统。如果您的 ZFS 设置未使用 ZIL(例如,因为您禁用了它)或 ZFS 所在的底层存储忽略或未发送缓存刷新命令(例如,因为您告诉 ZFS 不要这样做),它也不会成立。在这些情况下,ZFS 应该在磁盘上始终保持一致,但问题是,在电源事件后,当它重新启动时,它将是“X”秒前的一致性——它将在 ZFS 中无损坏地启动,但它将保持 5-30 秒前的状态。这对于 ZFS 来说没问题,但对于这些 zvols/disks-as-files (.vmdk) 中的文件系统来说可能就不是那么好了。如果您愿意的话,5 秒的“回滚”可能是该 .vmdk 中文件系统的关键元数据,并且它在更高级别上会损坏甚至无法启动。与此同时,ZFS 仍然认为一切都很好。

为了使您的上层操作系统尽可能的安全,以下所有条件都应满足:

  • 你的 zfs 需要使用 zil,例如不要执行 sync=disable
  • 您的 zfs 需要写入由电池/NVRAM 支持的磁盘,或者遵守缓存刷新命令;不要将 zfs_nocacheflush 更改为 1
  • 您的块协议提供商,可能是 COMSTAR(SmartOS 上是 COMSTAR),不需要使用“写入缓存”设置 - 即使您认为您的客户端已经发送同步,情况也是如此 - 如果您希望一切都同步,为什么要保持启用状态并冒着某些事情不被如此处理的风险。类似地,如果使用文件级协议(在我看来,您应该尽可能地使用块协议),请确保它设置为同步,这是 NFS 上的默认设置(确保客户端上的 NFS 挂载选项没有显示“异步”)。
  • 你可能想要在提供 VM 磁盘的 zfs 中的数据集/zvols 上设置 sync=always
  • 您的虚拟机管理程序应配置为发送同步,或者至少不会忽略和删除来自 VM 的同步请求(据我所知,在 SmartOS 上不是问题;但在 VMware 上可能存在问题)
  • 你的虚拟机操作系统需要设置为不进行任何写入缓存 - 它们至少需要立即记录日志,如果不是最好在每次写入时同步,而不是缓存写入。如何在每个单独的文件系统和操作系统选项上执行此操作对于这篇文章来说太多了,但请查找有关如何使你的操作系统“免受电源故障影响”的信息,关键词:写入屏障、写入缓存、同步/fsync、日志

如果您的客户端操作系统文件系统没有阻止写入,没有中间人吞噬您的同步数据请求,并且作为后端的 ZFS 已正确设置同步并位于正确的存储上,那么您应该完全可以预期任何类型的断电事件对 VM 文件系统的影响都将很小。最坏的情况下,它们需要在启动时快速执行 chkdsk/fsck,即使如此,也绝不会严重损坏或完全丢失。上述列表中的不正确项越多,严重损坏的可能性就越高。

与往常一样,我还必须提到,保留备份。即使您完成了上述所有操作并构建了一个完全防断电的环境,这些都无法保护您免受虚拟机上的病毒、黑客、清醒 36 小时后犯下的错误、心怀不满的员工、严重的硬件问题或(非)自然灾害的侵害。

答案2

RAID 仅适用于物理磁盘,以防止磁盘故障导致数据丢失。RAIDZ2
提供类似 RAID6 的功能,但它在文件级别而不是磁盘级别运行。因此,RAIDZ2 提供的任何保护都会自动扩展到客户机,因为它们文件。

相关内容