ZFS 如何处理文件的冗余副本?

ZFS 如何处理文件的冗余副本?

我有一些包含旧增量备份的目录,其中充满了各种文件的冗余副本。我的​​计划是使用 ZFS 来处理文件的校验和并防止冗余。

因此,模型情况如下:

cd /poolname/zalohy
zfs list -p poolname
NAME        USED         AVAIL     REFER  MOUNTPOINT
poolname  995328  374734901248     98304  /poolname

for i in {0..10}; do echo {1..99999} >file$i.txt; done # I create eleven identical files of the size 588888 bytes.

zfs list -p poolname
NAME         USED         AVAIL     REFER  MOUNTPOINT
poolname  5677056  374730219520     98304  /poolname

374734901248 - 374730219520 = 4 681 728, i.e. cca 5MB.

我预计 11 个相同的文件(具有相同的校验和)将占用比 588888 字节多一点的空间,所以要少 10 倍。

问题出在哪里。如何处理这种冗余?有没有比 ZFS 更好的文件系统来实现这个目的?

非常感谢您的帮助。

答案1

一般来说

这要求你的 ZFS 池(或文件系统)已配置重复数据删除已启用。

OpenZFS 文档

重复数据删除

重复数据删除是在块级别删除冗余数据的过程,从而减少存储的数据总量。如果文件系统启用了重复数据删除属性,则会同步删除重复的数据块。结果是只存储唯一数据,文件之间共享通用组件。

重复数据删除是一项非常耗费资源的操作。启用重复数据删除时,通常建议每 1 TiB 存储至少配备 1.25 GiB RAM。计算确切要求在很大程度上取决于池中存储的数据类型。

在设计不当的系统上启用重复数据删除可能会导致性能问题(I/O 和管理操作缓慢)。它可能会导致由于内存耗尽而导致导入池出现问题。重复数据删除会消耗大量处理能力(CPU)和内存,并产生额外的磁盘 I/O。

在创建启用了重复数据删除的池之前,请确保您已适当规划了硬件要求并实施了适当的恢复实践,例如定期备份。考虑使用压缩属性作为资源密集程度较低的替代方案。

重复数据删除默认是禁用的,因为如上所述,它会占用大量 CPU 和内存。

与所有 ZFS 属性一样,该dedup属性可以在 ZFS 池或数据集(文件系统)级别设置,并由底层文件系统继承。

在启用之前dedup,您应该考虑以下事项:

  • 确保您的数据确实受益于重复数据删除
  • 确保您的系统有足够的 CPU 和内存来支持该功能

要检查您的池是否受益dedup,您可以运行tank池名称在哪里)

sudo zdb -S tank

模拟-S统计dedup数据,仅适用于整个池。输出将是一个模拟的 DDT(重复数据删除表),并以以下一些统计数据结尾:

dedup = 1.20, compress = 1.28, copies = 1.03, dedup * compress / copies = 1.50

根据经验,如果估计dedup比率高于 2,则重复数据删除可能是节省空间的一种选择。在上面的例子中,由于dedup比率为 1.2,因此可能不值得。

要检查dedup池的属性,请输入:

zfs get dedup tank

要为池设置重复数据删除,请输入:

sudo zfs set dedup=on tank

若仅为数据集设置它(tank/home),请输入:

sudo zfs set dedup=on tank/home

dedup在现有池上启用后,只有新创建的数据才会被重复数据删除。

正如文档中提到的那样,compression=lz4在池上设置属性可能是一个更好的选择lz4压缩对大多数系统的性能影响很小甚至没有)

针对您的情况

对于您的具体情况,我将仅为备份创建一个特定的数据集(文件系统),并仅在该数据集上启用重复数据删除。

例如,如果您创建 ZFS 数据集poolname/backup

sudo zfs create poolname/backup

然后设置:

sudo zfs set dedup=on poolname/backup

通过这种方式,您可以测试它是否按预期工作。如果遇到问题,您可以随时将备份传输到普通的 ZFS 数据集(无需dedup启用压缩功能)(但可以改为使用压缩功能)。

注意:这是不是一旦启用了重复数据删除功能,就可以禁用池或数据集上的重复数据删除功能。在这种情况下,只能备份数据、销毁数据集并将数据移动到另一个数据集,而无需重复数据删除。这就是为什么我永远不会建议在整个 Zpool 上启用重复数据删除的原因。

答案2

Mastodon 上的另一位热心用户刚刚发布了一个命令链接hardlinkhttps://manpages.debian.org/unstable/util-linux/hardlink.1.en.html)这听起来比我编写的程序(在对更长更明确的答案 WRT ZFS 的评论中提到)更好地解决了您的问题。

在 Ubuntu 22.04 上,hardlink默认安装(作为软件包的一部分util-linux),并且在您的情况下,要运行的默认命令是(如果目录/poolname/zalohy包含备份数据):

hardlink /poolname/zalohy

请参阅hardlink 手册页了解有关附加选项等的更多信息

相关内容