我一直在使用 LVM 快照来备份 MySQL 数据库。
FLUSH TABLES WITH READ LOCK
发出,然后lvcreate --snapshot --size 4G
等等。由于数据库在快照处于活动状态时处于活动状态,因此snap_percent
(用于跟踪与拍摄快照时文件系统原始状态的差异的快照存储量)开始增加。snap_percent
每天都会对此进行监控,--size
如果达到 80%,则会增加。
我的问题是,是否存在等效的统计数据或属性虚拟文件系统用于确定快照占用的空间占池中剩余空间的百分比?显然我不需要传递参数--size
,zfs snapshot
但是如何确定基于该快照的克隆是否接近池的限制。
希望这是有意义的,现在我读到它时它确实听起来像是一个复杂的问题。
答案1
ZFS 快照空间反映在文件系统的消耗中。您可以通过监控下面最合适的字段来获取所需的信息。
最后,您将看到文件系统的“可用”空间...看看“used”+“avail”是否小于“size”?:
root@deore:~# df -h /volumes/vol1/LA_Specialty
Filesystem size used avail capacity Mounted on
vol1/LA_Specialty 800G 391G 254G 61% /volumes/vol1/LA_Specialty
我过滤了下面的输出zfs get all pool/filesystem
以显示相关属性。下面,我有一个 800GB 的文件系统(配额),其中使用了 545GB。391GB 是引用,这意味着这是真实数据的大小。快照使用了 154GB。
root@deore:/volumes# zfs get all vol1/LA_Specialty
NAME PROPERTY VALUE SOURCE
vol1/LA_Specialty type filesystem -
vol1/LA_Specialty creation Sat Sep 24 18:44 2011 -
vol1/LA_Specialty used 545G -
vol1/LA_Specialty available 255G -
vol1/LA_Specialty referenced 391G -
vol1/LA_Specialty compressratio 2.96x -
vol1/LA_Specialty quota 800G local
vol1/LA_Specialty reservation none default
vol1/LA_Specialty recordsize 16K local
vol1/LA_Specialty mountpoint /volumes/vol1/LA_Specialty inherited from vol1
vol1/LA_Specialty usedbysnapshots 154G -
vol1/LA_Specialty usedbydataset 391G -
vol1/LA_Specialty usedbychildren 0 -
vol1/LA_Specialty usedbyrefreservation 0 -
然后查看快照...可以看到快照的单独大小以及它们引用的总数据大小。
root@deore:/volumes# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
vol1/LA_Specialty@snap-daily-1-2013-09-07-020003 57.6G - 389G -
vol1/LA_Specialty@snap-daily-1-2013-09-08-020003 1.95G - 391G -
vol1/LA_Specialty@snap-daily-1-2013-09-09-020008 3.42G - 392G -
vol1/LA_Specialty@snap-daily-1-2013-09-10-020003 3.05G - 391G -
vol1/LA_Specialty@snap-daily-1-2013-09-11-020003 2.81G - 391G -
vol1/LA_Specialty@snap-daily-1-2013-09-12-020004 2.65G - 391G -
vol1/LA_Specialty@snap-daily-1-2013-09-13-020003 2.70G - 391G -
vol1/LA_Specialty@snap-daily-1-2013-09-14-020003 25K - 391G -
vol1/LA_Specialty@snap-daily-1-latest 25K - 391G -
以及du
快照目录的列表...
root@deore:/volumes/vol1/LA_Specialty/.zfs/snapshot# du -skh *
389G snap-daily-1-2013-09-07-020003
391G snap-daily-1-2013-09-08-020003
392G snap-daily-1-2013-09-09-020008
391G snap-daily-1-2013-09-10-020003
391G snap-daily-1-2013-09-11-020003
391G snap-daily-1-2013-09-12-020004
391G snap-daily-1-2013-09-13-020003
391G snap-daily-1-2013-09-14-020003
391G snap-daily-1-latest
答案2
ZFS 快照中有很多隐藏数据。一般来说,我建议你
zfs list -ro space
显示类似以下内容的输出:
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
rootpool/export/home 6.37G 11.7G 2.80G 8.87G 0 0
rootpool/export/[email protected] - 134M - - - -
rootpool/export/[email protected] - 320M - - - -
rootpool/export/[email protected] - 251M - - - -
rootpool/export/[email protected] - 1.02M - - - -
rootpool/export/[email protected] - 1.04M - - - -
rootpool/export/[email protected] - 850K - - - -
rootpool/export/[email protected] - 747K - - - -
rootpool/export/[email protected] - 326K - - - -
rootpool/export/[email protected] - 454K - - - -
rootpool/export/[email protected] - 319K - - - -
这将告诉您,我在此特定数据集上总共使用了 11.7G,其中 2.8G 由快照使用,8.87 由实际文件系统(活动数据)使用。但是,每个快照旁边的已使用大小非常具有误导性。
如果你把快照已用列中的所有数字加起来,你会发现它们根本不接近 USEDSNAP 总数。这是因为 USED 值是多少独特的每个快照占用的空间。
例如:
如果我有一个名为“newpool”的池,并且它有 2 个 1G 文件(fileA 和 fileB):
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 11.0G 2.0G 0.00G 2.0G 0 0
现在我拍下了:
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 11.0G 2.0G 0.00G 2.0G 0 0
newpool@snap1 11.0G 0.0G 0.00G 2.0G 0 0
现在我删除其中 1 个 1G 文件 (fileA):
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 11.0G 2.0G 1.00G 1.0G 0 0
newpool@snap1 - 1.0G - - - -
现在我创建一个新的1G文件(fileC):
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 10.0G 3.0G 1.00G 2.0G 0 0
newpool@snap1 - 1.0G - - - -
现在我再次拍摄它
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 10.0G 3.0G 1.00G 2.0G 0 0
newpool@snap1 - 1.0G - - - -
newpool@snap2 - 0.0G - - - -
现在我删除文件 B(在两个快照中都有):
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 10.0G 3.0G 2.00G 1.0G 0 0
newpool@snap1 - 1.0G - - - -
newpool@snap2 - 0.0G - - - -
注意快照 USED 列是如何做的不是反映出变化?这是因为文件 B 被两个快照引用,并且由于它不是唯一的,所以它不会显示在任何特定快照的 USED 计数中。USEDSNAP 列反映出快照已使用该空间,但它不会将其与任何特定快照关联。
现在如果你要删除 snap1:
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
newpool 11.0G 2.0G 1.00G 1.0G 0 0
newpool@snap2 - 1.0G - - - -
snap2 现在显示它已使用了 1.0G,因为该数据现在是该快照所独有的。
USED 列将显示如果删除单个快照可以回收多少空间,但不会真正显示该快照保留了多少空间。
既然我已经说完了这些——
如果您计划仅保留任何特定数据集的一个快照,那么zfs 列表 -ro 空间命令应该会给你你所寻找的内容。
如果您要同时拥有多个快照,这些数据可能会产生误导。处理多个快照时,不要想当然地认为 USED 列有任何意义。此外,杜对于快照目录来说是一个糟糕的选择,因为它只显示快照引用的内容,而不是快照实际使用的空间。
zfs 手册页介绍了其中的一些内容,但不能很好地展示这些关系。
答案3
ZFS 中没有直接等效项。最接近的等效项是池中的可用空间,您可以从 获得zfs list
。在 ZFS 上,快照可以增长,直到整个池的空间耗尽。