我有包含旧增量备份的目录,它们充满了各种文件的冗余副本。我的计划是使用 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 字节的空间,因此减少了十倍。
哪里有问题。如何处理这种冗余?是否有比 ZFS 更好的文件系统来实现此目的?
非常感谢您的帮助。
一般来说
这要求您的 ZFS 池(或文件系统)已配置为启用重复数据删除。
来自OpenZFS 文档:
默认情况下,重复数据删除处于禁用状态,因为如上所述,它可能会占用大量 CPU 和内存。
与所有 ZFS 属性一样,该
dedup
属性可以在 ZFS 池或数据集(文件系统)级别设置,并由底层文件系统继承。在启用之前
dedup
,您应该考虑以下事项:要检查您的池是否会受益
dedup
,您可以运行(其中tank
是池名称):模拟
-S
统计dedup
数据,并且仅适用于整个池。输出将是一个模拟的 DDT(重复数据删除表),并以一些统计信息结尾,例如:根据经验,如果估计
dedup
比率高于 2,重复数据删除可能是节省空间的一个选项。在上面的示例中,由于dedup
比率为 1.2,因此可能不值得。要检查
dedup
池的属性,请键入:要为池设置重复数据删除,请键入:
要仅为数据集 (
tank/home
) 设置它,请键入:dedup
在现有池上启用该功能后,只会对新创建的数据进行重复数据删除。compression=lz4
正如文档中提到的,在池上设置该属性可能是更好的选择(lz4
压缩对大多数系统几乎没有性能影响)。针对您的情况
对于您的特定情况,我将创建一个仅用于备份的特定数据集(文件系统),并仅在此数据集上启用重复数据删除。
例如,如果您创建 ZFS 数据集
poolname/backup
:然后设置:
通过这种方式,您可以测试它是否按预期方式工作。如果遇到问题,您可以随时将备份传输到普通的 ZFS 数据集而不
dedup
启用(但也可以使用压缩)。注意:一旦启用池或数据集的重复数据删除功能,就无法将其禁用。在这种情况下,只能备份数据,销毁数据集,然后将数据移动到另一个数据集而不进行重复数据删除。这就是为什么我永远不会建议在整个 Zpool 上启用重复数据删除。
Mastodon 上的另一个有用的用户刚刚发布了该命令的链接
hardlink
(https://manpages.debian.org/unstable/util-linux/hardlink.1.en.html),这听起来比我的程序更好地解决了您的问题写道(在对更长且明确的答案 WRT ZFS 的评论中提到。)在 Ubuntu 22.04 上,
hardlink
默认安装(作为软件包的一部分util-linux
),在您的情况下,默认运行的命令是(如果目录/poolname/zalohy
包含备份数据):请参阅
hardlink
手册页以获取更多信息。