首先,我知道这个话题很容易变得主观,但我试图避免这种情况,因为在众多糟糕的答案中应该至少有一个好的答案,而且很难找到。
乍一看我的问题似乎很简单;如何将虚拟机磁盘存储在硬盘上,同时确保数据完整性不受影响,并且性能不会太差。
但实际上它比看起来要难;
- ZFS 和 BTRFS 不是最佳选择:众所周知,写时复制文件系统在处理大文件方面表现不佳,尤其是当它们本身可能包含另一个写时复制文件系统时!能关闭 BTRFS 上的 COW,但这也会关闭校验和(以及压缩、重复数据删除等)。
- EXT2/3/4、XFS、ReiserFS、NTFS 等都不像 BTRFS/ZFS 那样进行完整的数据校验和,并且不是一种选项。
那么这就是将军了吗?除了简单的 RAID 设置外,您无法获得完整的数据完整性,这些设置还存在其他问题,例如写入漏洞(RAID5)以及通常非常糟糕的处理腐败无法确定两个副本中哪个是正确的文件。使用更高级别的系统可以避免这些问题,这些系统会在将文件返回给操作系统或用户之前对文件进行校验和并验证其完整性。
我能想到的唯一选择是在虚拟机内部而不是在主机上使用 BTRFS/ZFS,并在每台机器上适当地安排快照和备份,尽管这比在主机上执行要麻烦得多。
有人知道还有其他方法可以实现我的目标吗?
答案1
让我们从一个简单的证据开始:更高的数据弹性和完整性功能通常需要付出性能代价。从这里,我们可以做更多的考虑:
ZFS 的性能比 BTRFS 好得多用作 VM 支持文件系统时,至少在 RHEL/CentOS 主机上是如此。虽然在纯机械 HDD 上它确实比更传统的文件系统慢,但即使使用相对较小的 SSD 作为 SLOG 设备也会显著提高其性能。换句话说,ZFS 上的 VM 是一个完全合理的用例;
即使使用没有完整数据校验和的传统文件系统(如 XFS 和 EXT4),健康系统上数据损坏的几率也非常小。BER/UBER/URE 评级经常被断章取义,并且没有考虑到定期清理;
硬件 RAID5/6 卡具有断电保护缓存是免疫写入漏洞。此外,RAID6 还可以用作数据校验和的一种形式(注意:这取决于特定的控制器/实现)。因此,具有适当大小的写回缓存的 RAID6 阵列是一个合理的解决方案;
最后,正如建议的那样,您可以使用 ZFS里面VM。对于这样的设置,我会将原始 LVM 卷导出到客户机,将数据容器格式化为 ZFS。但是,我会对 LVM 卷本身进行快照,而不是从单个客户机 VM 内部进行快照。为了获得更好的性能,我会在主机上使用 RAID10(作为 LVM 的基础)