我有一个关于 ZFS 快照的问题:
因此,据我所知,当我拍摄 ZFS 数据集的快照时,快照的最初大小为 0 字节,因为在创建时,数据集本身和快照之间的文件没有差异,对吗?
当我现在删除实时数据集中的一个 1GB 文件时,实时数据集会变小 1GB,而快照会变大 1GB,因为该文件现在仅在快照中被引用。
现在,如果我有来自不同时间点的多个快照(假设有 10 个,其中所有快照都存在 1GB 文件),删除 1GB 文件后,所有 10 个快照都会变大 1GB,对吗?但是,我假设它们只会显示为大 1GB,但写入 1GB 文件的实际块仍然只在磁盘上出现一次,因此磁盘本身只填充了 1GB,并且所有 10 个快照都引用了该 1GB,对吗?
换句话说:所有 10 个快照都会显示(例如在“zfs list -t snap”中)它们都是 1GB 大,但所有 10 个快照加起来只会占用磁盘上 1GB 的实际空间?
如果是这种情况:通过 syncoid 进行复制会如何影响这种情况?当我有一个备份服务器通过 syncoid 从我的主服务器提取快照,并且主服务器上的那些快照变得更大(因为文件被删除),syncoid 是否会再次提取这些已更改的快照(或至少是更改内容的增量),即使它们之前已被提取过?如果再次提取它们(或它们的增量):是否只会更新引用,或者提取到备份服务器的快照是否每个都包含已删除文件的实际数据?换句话说:删除 1GB 文件是否会导致备份服务器上也占用 1GB 的空间,还是会占用该机器上的 10GB(每个快照 1GB)?
提前感谢你的帮助!
答案1
为了回答你的问题,以下是我的理解:
数据集的第一个快照非常重要,它将是数据集中所有细节的实时图片。因此它将与实际数据集的总大小非常接近。它被用作所有其他快照的基础。因此,始终保留第一个快照非常重要。我建议将其重命名为“BASE-2023-10-16_13:42”之类的名称,并且永远不要删除它。这将有助于任何未来的 zfs send / zfs recv(或 syncoid)功能。
在初始快照之后,用于保存数据集和快照信息的数据块数量将永远不会低于第一个快照。
但是,当您在快照之间添加或(减少)减去新文件时,总存储大小将(增加)。删除数据集中的文件不会影响快照使用的总存储量,直到您进行另一次快照。如果您自上次快照以来删除了文件,则数据集大小将减小,但下一个快照的大小将为 0(即新数据增加 0)。如果您自上次快照以来添加了一个或多个文件,则数据集大小将增加,下一个快照的大小将为新文件的大小。
需要澄清的是,所有快照的“数据存储块大小”实际上是所有快照和原始数据集中唯一使用的数据块的大小。
当我现在删除实时数据集中的一个 1GB 文件时,实时数据集会变小 1GB,而快照会变大 1GB,因为该文件现在仅在快照中被引用。
实际上,如果您删除数据集中的文件,快照数据存储不会改变。上一个快照仍存储该数据。但是,下一个快照会指示不保存已删除的文件。因此,快照本身会更小,但所有快照使用的总数据存储将相同。
...它们只会显示为大 1GB,但写入 1GB 文件的实际块仍然只在磁盘上出现一次,因此磁盘本身只填充了 1GB,并且所有 10 个快照都引用那 1GB,对吗?
正确的。
...所有 10 个快照都会显示(例如在“zfs list -t snap”)它们都是 1GB 大,但所有 10 个快照加起来只会占用磁盘上 1GB 的实际空间?
实际上,“zfs list -t snap”将显示第一个快照为 1 GB,后续快照将为 0(即,从上一个快照增加的存储量)。
关于备份服务器和使用 syncoid 复制快照的问题。一般来说,原始池和快照的副本永远不会超过原始数据存储大小。复制快照通常只会复制快照之间的差异,而不是整个数据集。结构和数据存储将与原始源完全相同。
希望这有助于理解 zfs。