一个磁盘上多个分区上的 ZFS

hoc*_*chl 4 linux backup hard-drive zfs partitioning

我有一个非常大的外部驱动器,我想用于备份。部分备份用于需要从 Windows 访问的 Windows 分区,部分是某些 Linux 分区的备份。

由于我无法准确预测存储大小,因此我考虑创建多个分区,从一个 NTFS 和一个作为 ZFS 开始。如果 ZFS 上的磁盘空间不足,我只需将另一个备用分区添加到 ZFS 卷。如果 NTFS 需要更多空间,我会调整它的大小(或者如果不可能重新创建,但这意味着再次复制所有数据)。

  • 这种设置是否值得推荐甚至可能?
  • 有没有更好的方法可以使使用的磁盘空间有点灵活
  • 这是否以寻求地狱结束,或者 ZFS 卷可以由一个磁盘上的多个分区组成而不会降低性能(没有备用副本)?
  • 问题的替代解决方案?

更新:我使用cryptsetup. 然后我在它上面创建了一个巨大的 ZFS 文件系统。如果我设置copies=2,它是否也以seek-hell结尾,或者是否有一些巧妙的ZFS机制可以使用缓冲区将所有文件的副本存储在同一磁盘上[假设:也寻求地狱+只有一个副本,因为您需要几个设备的几个副本]。

use*_*ser 5

这种设置是否值得推荐甚至可能?

技术上是可以的。我不确定扩展 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 文件系统之间的区别。您创建了一个pool,默认情况下它包含一个与该池同名的文件系统。池指示物理存储的属性,例如 vdev 配置和最小块大小(在 ZFS 中称为 ashift),并使用该zpool实用程序进行管理。文件系统规定了逻辑存储的属性,例如压缩、配额、挂载点和校验和,并使用该zfs实用程序进行管理。这与例如 Btrfs 形成对比,后者将两者混为一谈。

其次,让我简要介绍一下copiesZFS 文件系统属性的工作原理。copies指定超出物理冗余的冗余,实际上类似于制作单个文件的多个用户可见副本(但如果在文件系统上使用重复数据删除,则不会破坏用户的心理模型)。虽然它适用于所有 vdev 冗余类型,但最容易用镜像来说明:双向镜像 vdev 将通过作为镜像的简单属性存储数据的两个相同副本。如果您还设置了copies=2,那么镜像对中的两个磁盘中的每一个保存数据的两个副本,总共存储四个位的副本,总共大约 25% 的可用存储空间(与可用的原始存储量相比)。简单的解释在使用 raidz N vdevs时有些失灵,但结果是一样的:相同位的多个副本存储在磁盘上,这样万一一个变坏,另一个可以使用。

默认情况下,存储用户数据的单个副本,并存储文件系统元数据的两个副本。通过增加copies,您可以调整此行为,以便copies存储用户数据的副本(在该文件系统内),并存储copies系统元数据的一个副本(在该文件系统内)。为获得最佳效果,如果要将副本设置为大于 1 的值,则应在使用 创建池时这样做zpool create -O copies=N,以确保存储所有根文件系统元数据的其他副本。

在正常的操作下,额外的副本只会消耗存储空间。当发生读错误时,如果有冗余的、有效的数据副本,这些冗余副本可以作为替代,以满足读请求并透明地重写损坏的副本。读取错误可以是直接I / O错误,或者如果校验和检查已打开(这是在默认情况下,和你真的应该离开这样,除非你有一些非常不寻常的工作量),数据从磁盘回来其他的东西比最初打算写入的内容(校验和不匹配)。

但是,在写入期间,必须更新所有副本以确保它们保持同步。因为 ZFS 旨在将副本放置得远离彼此,所以这引入了额外的查找。也不要忘记它的默克尔树设计,元数据块与数据块保持一定的物理距离(以防止单个写入失败破坏校验和和数据)。我相信 ZFS 的目标copies是将 vdev 的至少 1/8 彼此远离,并且包含数据块校验和的元数据块总是放置在离数据块一定距离的地方。

因此,设置copies大于 1 不会显着帮助或损害读取时的性能,但会降低写入时与请求的副本数量和底层存储的 IOPS(每秒 I/O 操作)性能相关的性能。