我有一个很大的外部驱动器,我想用它来备份。部分备份是针对需要从 Windows 访问的 Windows 分区,部分备份是针对某些 Linux 分区的备份。
由于我无法准确预测存储大小,我考虑创建多个分区,首先是 NTFS,然后是 ZFS。如果 ZFS 上的磁盘空间不足,我只需将另一个备用分区添加到 ZFS 卷即可。如果 NTFS 需要更多空间,我会调整其大小(或者如果不可能,重新创建,但这意味着再次复制所有数据)。
- 这种设置值得推荐或者可行吗?
- 有没有更好的方法可以让使用的磁盘空间稍微灵活的?
- 这是否会导致寻道地狱,或者 ZFS 卷是否可以由一个磁盘上的多个分区组成而不会降低性能(没有备用副本)?
- 问题的其他解决方案是什么?
更新:我使用 将整个磁盘安装为加密环回卷cryptsetup
。然后我在其上创建了一个巨大的 ZFS 文件系统。如果我设置copies=2
,这是否也会导致寻道地狱,或者是否存在一些巧妙的 ZFS 机制,可以使用缓冲区将所有文件的副本存储在同一磁盘上 [假设:同样寻道地狱 + 只有一个副本,因为您需要多个设备来存储多个副本]。
答案1
这种设置值得推荐或者可行吗?
从技术上讲,这是可行的。我不确定 NTFS 文件系统的增长限制是什么,但我怀疑您可以从磁盘的开头向内增长 NTFS 文件系统,并且我知道您可以通过添加任意分区来增长 ZFS 池,因此您可以从磁盘的末尾向内增长它。这样做会导致两者在中间某处相遇。
但是推荐吗?我会说绝对不推荐!
这是否会导致寻道地狱,或者 ZFS 卷是否可以由一个磁盘上的多个分区组成而不会降低性能(没有备用副本)?
ZFS 一开始就很耗寻道,因为它采用了写时复制设计。(如果使用快照,这种情况会更加严重。快照恰好是许多人非常喜欢的 ZFS 功能,即使他们实际上不使用 ZFS 的任何其他功能,但快照在数据碎片风险方面要付出巨大代价,特别是如果您进行许多小的写入。)
当您向现有池添加额外存储(按照您建议的方案),已存储的数据不会自动重新平衡。相反,ZFS 写入新的数据块到具有最多可用空间的 vdev,这会导致数据分布在所有 vdev 上随着时间的推移。就您而言,这意味着数据将大致按照您的预期分布:新写入的数据(包括对现有文件的更改)更有可能写入新添加的 vdev,而不是先前存在的 vdev。由于所有 vdev 都位于同一物理磁盘上,因此这不会带来真正的可靠性提升;如果单个磁盘坏了,那么您的池也会坏掉,并带走您的所有数据。
ZFS 还会尝试均匀分布数据之内vdev,假设这样可以降低局部物理损坏或逻辑错误对所有副本产生同等影响的风险。这是其采用 Merkle 树磁盘设计的一个驱动原因,也是它尝试尽可能远离的原因copies
,最好是放置在不相关的 vdev 上。
据我所知,ZFS 目前不支持在添加额外存储后重新平衡 vdev 之间的数据。Btrfs 有命令btrfs rebalance
,但 ZFS 没有类似命令。您可以通过复制数据(使用zfs send ... | zfs recv ...
)来获得一些接近的效果,但这只是副作用。
底线是,我怀疑你提议的设置是否明显更糟就磁盘寻道而言,比在单个分区上类似设置的 ZFS 要好。
然后我在其上创建了一个巨大的 ZFS 文件系统。如果我设置了副本数 = 2,是否也会以寻道地狱结束,或者是否存在一些巧妙的 ZFS 机制,可以使用缓冲区将所有文件的副本存储在同一磁盘上 [假设:同样寻道地狱 + 只有一个副本,因为您需要多个设备来存储多个副本]。
首先,请记住 ZFS 池和 ZFS 文件系统之间的区别。您创建了一个水池,默认情况下包含一个文件系统与池同名。池规定了物理存储的属性,例如 vdev 配置和最小块大小(在 ZFS 中称为 ashift),并使用该zpool
实用程序进行管理。文件系统规定了逻辑存储的属性,例如压缩、配额、挂载点和校验和,并使用该实用程序进行管理。zfs
这与将两者合并在一起的 Btrfs 等形成了对比。
其次,让我简单介绍一下copies
ZFS文件系统属性的工作原理。copies
指定冗余超越物理冗余,实际上类似于为单个文件制作多个用户可见的副本(但如果文件系统上使用重复数据删除,则不会破坏用户的思维模型)。虽然它适用于所有 vdev 冗余类型,但用镜像来说明最容易:双向镜像 vdev 将通过镜像的简单属性存储两个相同的数据副本。如果您还设置了copies=2
,那么两个磁盘中的每一个在镜像对中还保存两份数据,总共存储四份数据,总共约有 25% 的可用存储空间(与可用的原始存储空间相比)。raidz 的简单解释有些不准确否vdevs,但结果是一样的:相同位的多个副本存储在磁盘上,这样如果一个出现问题,可以使用另一个。
默认情况下,会存储一份用户数据副本,并存储两份文件系统元数据副本。通过增加copies
,您可以调整此行为,以便copies
存储用户数据副本(在该文件系统中),并copies
存储一份系统元数据副本(在该文件系统中)。为了获得最佳效果,如果您想将副本设置为大于 1 的值,则应在使用 时这样做zpool create -O copies=N
,以确保存储所有根文件系统元数据的额外副本。
正常情况下读操作,额外的副本只会消耗存储空间。当发生读取错误时,如果存在数据的冗余有效副本,则可以使用这些冗余副本作为替代方案,以满足读取请求并透明地重写损坏的副本。读取错误可能是完全的 I/O 错误,或者如果校验和已打开(默认情况下是打开的,您可以真的应该保持这种状态(除非您有一些非常不寻常的工作量),从磁盘返回的数据不是最初打算写入的内容(校验和不匹配)。
然而,在写道,所有副本都必须更新以确保它们保持同步。由于 ZFS 旨在将副本彼此远离,因此这引入了额外的寻道。另外,不要忘记它的 Merkle 树设计,元数据块与数据块有一定物理距离(以防止例如单个写入故障破坏校验和和数据)。我相信 ZFS 的目标是将copies
vdev 彼此相距至少 1/8,并且包含数据块校验和的元数据块始终与数据块保持一定距离。
因此,设置copies
大于 1 不会有显著帮助或受伤性能的同时阅读,但会降低性能,同时写作与请求的副本数和底层存储的 IOPS(每秒 I/O 操作)性能有关。