Linux ZFS 入门指南(二)

原文:Introducing ZFS on Linux

协议: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 空间。这将为你以后省去很多麻烦。虽然几乎为空的未拍摄快照的池可能不是很有挑战性,但随着时间的推移,每个添加的快照或保留可能会增加混乱。空间是你的朋友,但前提是你要和它成为朋友。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值