协议:CC BY-NC-SA 4.0
七、空间监控
有了如此丰富的功能集,包括克隆、快照和压缩都依赖于文件系统组织,空间监控需要以不同于传统 Linux 文件系统的方式进行。每个 Linux 服务器管理员都熟悉的常用命令*df _-h_*
\已经不够用了,甚至可能会产生误导。
使用新命令
使用 ZFS,您需要学习两个新命令,并理解它们的参数和输出,以跟踪您的空闲空间— *sudo zpool list*
和*
sudo zfs list
*
。在我的家庭工作站上,这些命令产生以下输出。
trochej@madchamber:~$ sudo zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
data 2,72T 147G 2,58T - 3% 5% 1.00x ONLINE -
trochej@madchamber:~$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 147G 2,53T 96K /data
data/datafs 147G 2,53T 147G /mnt/data
此列表不完整,因为默认情况下它忽略了快照。请记住,随着时间的推移,快照会消耗越来越多的空间,因为拍摄快照的系统上的数据会发生变化。根据我的经验,新 ZFS 存储运营商提出的一个常见问题是,由于空间不足,他们无法删除数据。他们通常感到困惑的是,删除数据不会增加可用空间,ZFS 列表中已消耗的空间不会加到池中的总可用空间中。
输出术语
让我们看看输出中的列,了解它们对操作员的意义:
AVAIL
表示可用。文件系统中的总可用空间。USED
使用的意思。文件系统中的总已用空间。USEDSNAP
表示由快照使用。数据集快照使用的磁盘空间。一旦数据集的所有快照都被销毁,该空间就会被释放。由于多个快照可以引用相同的数据块,因此该数量可能不等于所有快照已用空间的总和。USEDDS
表示被数据集使用。数据集本身使用的磁盘空间。如果该数据集的所有快照和refreservation
都被销毁,从而销毁数据集本身,则该磁盘空间将被释放。USEDREFRESERV
表示被refreservation
使用。数据集上的refreservation
集合使用的磁盘空间。一旦refreservation
被移除,该空间被释放。USEDCHILD
指儿童使用的。数据集的子级使用的磁盘空间。销毁给定数据集的子数据集后,该空间将被释放。
要手动计算USED
属性,请遵循以下等式:USED = USEDCHILD + USEDDS + USEDREFRESERV + USEDSNAP
。
什么在消耗我的池空间?
理解什么消耗了您的池空间有时有点困难。我将使用一些例子来演示解决这个问题的方法,但是没有什么比经验更好的了。创建池,用数据填充池,运行快照,以及删除和创建预留。同时,观察*zfs list_ -t all -o snapshot_*
和*zfs list _-t all_*
以更好地理解空间计算。
诊断问题
让我们考虑一种情况,您有一个 3 TB 的池。
sudo zpool create datapool mirror /dev/sdb /dev/sdc
sudo zfs create datapool/data
成功导入 2 TB 的备份数据后,您决定创建一个快照,以便用户误删除数据时不会要求您重新运行备份恢复。
sudo zfs snapshot datapool/data@after-backup-restore
请注意,运行此快照是即时的,最初不占用磁盘空间。
也许,正如有时可能发生的那样,就在您运行快照后,拥有非常广泛的访问权限的用户意外地删除了整整 2 TB 的数据。但是,删除作业在不到 1 TB 时停止,并报告由于空间不足而无法删除更多内容。这怎么可能?答案是:快照。让我们首先观察我的工作站上的文件系统:
trochej@madchamber:~$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 134G 2,55T 96K /data
data/datafs 134G 2,55T 134G /mnt/data
现在,我们在那里创建一个快照:
trochej@madchamber:~$ sudo zfs snapshot data/datafs@testsnapshot
trochej@madchamber:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
data 134G 2,55T 96K /data
data/datafs 134G 2,55T 134G /mnt/data
data/datafs@testsnapshot 0 - 134G -
现在我们上传一个 CentOS 7 GB 的 ISO 文件到_/mnt/data_:
trochej@madchamber:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
data 141G 2,54T 96K /data
data/datafs 141G 2,54T 134G /mnt/data
data/datafs@testsnapshot 7,14G - 134G -
请注意,快照大小已经增加到新引入的数据。现在让我们删除包含存档 iso 的整个目录:
trochej@madchamber:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
data 141G 2,54T 96K /data
data/datafs 141G 2,54T 109G /mnt/data
data/datafs@testsnapshot 32,0G - 134G -
您将会看到,虽然data/datafs
ZFS 文件系统的REFER
大小有所缩减,但总体的USED
保持不变,快照大小增加到了 32 GB。为了比较,让我们看一下*df _-h_*
命令(为了清楚起见,我从输出中删除了非 ZFS 文件系统):
trochej@madchamber:~$ df -h
Filesystem Size Used Avail Use% Mounted on
data 2,6T 128K 2,6T 1% /data
data/datafs 2,7T 109G 2,6T 5% /mnt/data
现在让我们从datafs
中删除一些数据,只是为了增加快照的大小:
trochej@madchamber:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
data 141G 2,54T 96K /data
data/datafs 141G 2,54T 23,3G /mnt/data
data/datafs@testsnapshot 117G - 134G -
trochej@madchamber:~$ df -h
Filesystem Size Used Avail Use% Mounted on
data 2,6T 128K 2,6T 1% /data
data/datafs 2,6T 24G 2,6T 1% /mnt/data
正如您可能注意到的,从du
命令中没有收集到太多信息。它或多或少地跟踪了空间使用情况,但是它没有告诉我们任何关于模式的信息。另一方面,zfs
列表告诉了我们很多。仅通过这个输出,您就可以看到,虽然您的文件系统已用空间减少了,但总的已用空间保持不变;它刚刚移动到另一个数据集的位置。
*zfs*
命令可以让您更深入地了解空间在数据中是如何分布的。虽然它在我目前为止运行的小实验中不是很有趣,但是我马上会给你们提供更复杂的例子。然而,首先让我们看看*zfs list*
的另一个选项:
trochej@madchamber:~$ sudo zfs list -t all -o space
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
data 2,54T 141G 0 96K 0 141G
data/datafs 2,54T 141G 117G 23,3G 0 0
data/datafs@testsnapshot - 117G - - - -
Note
下一节将对-o space
进行更详细的解释。
现在应该很清楚数据删除的问题来自哪里了。由于 3 TB 池能够保存或多或少相同数量的数据(模数数据压缩),在已经保存 2 TB 数据的文件系统上引入 2 TB 数据的删除会导致池空间耗尽,因为随着用户不断删除数据,池需要向快照添加数据。
更多高级示例
前面的例子非常简单。这个池上没有发生太多事情,也没有使用太多附加功能。让我们使用文件存储(模拟真实块设备的文件)创建一个示例 ZFS 池,我们将尝试几个场景,看看设置各种 ZFS 属性如何影响可用空间和zfs -o space
输出。
在前面的例子中,*zfs _-o space_*
输出信息不多,也不有趣,所以让我们考虑以下配置:
- 具有 RAIDZ2 冗余的名为
datapool
的池。 - 五个文件系统,其中两个每小时拍摄定期快照,并保留两周。每周六拍摄一次快照,并保留一个月。
- 其中两个文件系统设置了配额。
- 一个文件系统设置了保留。
- 创建一个 zvol。
让我们把这个配置打印出来:
trochej@ubuntuzfs:~$ sudo zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
datapool 23.8G 5.37G 18.4G - 14% 22% 1.00x ONLINE -
因此,池显示池中有超过 18 GB 的可用空间。让我们仔细看看:
trochej@ubuntuzfs:~$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 13.2G 2.41G 34.0K /datapool
datapool/first 3.58G 6.83G 3.58G /datapool/first
datapool/five 50.0K 2.41G 32.0K /datapool/five
datapool/fourth 50.0K 2.41G 32.0K /datapool/fourth
datapool/second 50.0K 2.41G 32.0K /datapool/second
datapool/third 50.0K 2.41G 32.0K /datapool/third
datapool/vol01 5.16G 7.57G 16.0K -
但也不尽然。AVAIL
号不应该和*zpool list*
输出中的FREE
一样吗?ZFS 文件系统可以增长到池的容量。让我们列出所有数据集:
trochej@ubuntuzfs:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
datapool 13.2G 2.41G 34.0K /datapool
datapool/first 3.58G 6.84G 3.58G /datapool/first
datapool/first@2016-02-17-14:55 18.0K - 32.0K -
datapool/first@2016-02-17-15:04 0 - 3.58G -
datapool/five 50.0K 2.41G 32.0K /datapool/five
datapool/five@2016-02-17-14:55 18.0K - 32.0K -
datapool/fourth 50.0K 2.41G 32.0K /datapool/fourth
datapool/fourth@2016-02-17-14:55 18.0K - 32.0K -
datapool/second 50.0K 2.41G 32.0K /datapool/second
datapool/second@2016-02-17-14:55 18.0K - 32.0K -
datapool/third 50.0K 2.41G 32.0K /datapool/third
datapool/third@2016-02-17-14:55 18.0K - 32.0K -
datapool/vol01 5.16G 7.57G 16.0K -
好吧。有快照在起作用,所以它可能占用了一些容量,但为什么数据集之间的数字不同呢?我们先来看一下*zfs list*
输出中的_REFER_
列。它说明数据集保留引用的空间有多大。在输出中可以看到:
datapool/first@2016-02-17-15:04 0 - 3.58G -
_USED_
列为零,但_REFER_
在 3.5 GB 以上。这是典型的快照。自创建快照以来,文件系统datapool/first
没有发生任何变化,因此快照目前不使用任何空间。但是,它保留了对拍摄快照时datapool/first
包含的 3.5 GB 数据的引用。让我们通过删除我复制到数据池的一段数据来使用一些空间:
trochej@ubuntuzfs:~$ rm /datapool/first/Fedora-Live-KDE-x86_64-23-10.iso
这为我们提供了以下输出:
trochej@ubuntuzfs:~$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 14.7G 930M 34.0K /datapool
datapool/first 9.50G 4.91G 741M /datapool/first
所以,文件系统datapool/first
消耗了 9.5 GB 的空间,但引用的只有 741 MB?其余声称的空间消耗在哪里?首先,运行zfs list -t all
不仅可以看到文件系统,还可以看到快照:
trochej@ubuntuzfs:~$ sudo zfs list -t all
NAME USED AVAIL REFER MOUNTPOINT
datapool 14.7G 930M 34.0K /datapool
datapool/first 9.50G 4.91G 741M /datapool/first
datapool/first@2016-02-17-14:55 18.0K - 32.0K -
datapool/first@2016-02-17-15:04 18.0K - 3.58G -
datapool/first@2016-02-17-15:22 1.20G - 5.50G -
datapool/first@2016-02-17-15:27 0 - 741M -
trochej@ubuntuzfs:~$ ls -ahl /datapool/first/
total 741M
drwxr-xr-x 2 trochej trochej 3 Feb 17 15:25 .
drwxr-xr-x 7 trochej trochej 7 Feb 17 14:51 ..
-rw-r----- 1 trochej trochej 741M Feb 17 15:21 FreeBSD-11.0-CURRENT-amd64-20151130-r291495-disc1.iso
好吧。因此,文件系统保存 741 MB 的数据,但其快照消耗 1.20 GB 的空间。这还差不多。但是,剩下的空间在哪里?
trochej@ubuntuzfs:~$ sudo zfs list -t all -o space
NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD
datapool/first 4.91G 9.50G 4.78G 741M 4G 0
datapool/first@2016-02-17-14:55 - 18.0K - - - -
datapool/first@2016-02-17-15:04 - 18.0K - - - -
datapool/first@2016-02-17-15:22 - 1.20G - - - -
为了简洁起见,输出被删除了,但是您可以看到datapool/first
文件系统在快照中消耗了 4.78 GB。4 GB 由文件系统上设置的refreservation
属性使用,以其他文件系统为代价为其提供 4 GB 的空闲空间。
让自己熟悉-o 空间。这将为你以后省去很多麻烦。虽然几乎为空的未拍摄快照的池可能不是很有挑战性,但随着时间的推移,每个添加的快照或保留可能会增加混乱。空间是你的朋友,但前提是你要和它成为朋友。