注意
本文档适用于 Ceph 的开发版本。
CephFS 配额
CephFS 允许在文件系统中的任何目录上设置配额。配额可以限制存储在该目录层次结构中该位置下的字节数或文件数。
与 CephFS 中的大多数其他内容一样,配额使用虚拟扩展属性进行配置
ceph.quota.max_files-- 文件限制
ceph.quota.max_bytes-- 字节限制
如果扩展属性出现在目录上,则表示在此处配置了配额。如果它们不存在,则该目录上未设置配额(尽管可能仍在父目录上配置了配额)。
要设置配额,请在 CephFS 目录上设置具有值的扩展属性
setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir # 100 MB
setfattr -n ceph.quota.max_files -v 10000 /some/dir # 10,000 files
ceph.quota.max_bytes 也可以使用人性化的单位来设置
setfattr -n ceph.quota.max_bytes -v 100K /some/dir # 100 KiB
setfattr -n ceph.quota.max_bytes -v 5Gi /some/dir # 5 GiB
注意
即使输入的是 SI 单位,值也会被严格转换为 IEC 单位,例如 1K 转换为 1024 字节。
注意
要使客户端能够通过修改相应的扩展属性来设置配额,除了 rw 之外,还需要在客户端的身份验证功能中设置 p 标志。有关详细信息,请参阅 CephFS 客户端功能 - 布局和配额限制(“p”标志)。
查看配额限制
$ getfattr -n ceph.quota.max_bytes /some/dir
# file: dir1/
ceph.quota.max_bytes="100000000"
$
$ getfattr -n ceph.quota.max_files /some/dir
# file: dir1/
ceph.quota.max_files="10000"
注意
对 CephFS 目录运行 getfattr /some/dir -d -m - 将不会打印任何 CephFS 扩展属性。这是因为 CephFS 内核和 FUSE 客户端从 listxattr(2) 系统调用中隐藏了此信息。相反,可以通过运行 getfattr /some/dir -n ceph.<some-xattr> 来查看特定的 CephFS 扩展属性。
要删除或禁用配额,请删除相应的扩展属性或将值设置为 0。
使用移除
$ setfattr -x ceph.quota.max_bytes /some/dir
$ getfattr /some/dir -n ceph.quota.max_bytes
/some/dir/: ceph.quota.max_bytes: No such attribute
$
$ setfattr -x ceph.quota.max_files /some/dir
$ getfattr /some/dir/ -n ceph.quota.max_files
/some/dir/: ceph.quota.max_files: No such attribute
通过将值设置为零来移除
$ setfattr -n ceph.quota.max_bytes -v 0 /some/dir
$ getfattr /some/dir -n ceph.quota.max_bytes
/some/dir/: ceph.quota.max_bytes: No such attribute
$
$ setfattr -n ceph.quota.max_files -v 0 /some/dir
$ getfattr /some/dir/ -n ceph.quota.max_files
/some/dir/: ceph.quota.max_files: No such attribute
空间使用报告和 CephFS 配额
当 CephFS 挂载的根目录设置了配额时,空间使用报告工具(如 df)报告的 CephFS 上的可用空间基于配额限制。也就是说,可用空间 = 配额限制 - 已用空间,而不是 可用空间 = 总空间 - 已用空间。
可以通过在 ceph.conf 的 client 部分设置以下选项来禁用此行为
client quota df = false
限制
配额是协作而非对抗性的。 CephFS 配额依赖于挂载文件系统的客户端的协作,以便在达到限制时停止写入者。修改或对抗性的客户端无法被阻止写入所需的数据量。在客户端完全不受信任的环境中,不应依赖配额来防止系统被填满。
配额是不精确的。 写入文件系统的进程将在达到配额限制后不久停止。它们不可避免地会被允许写入超过配置限制的数据量。它们能够超出配额多少主要取决于时间量,而不是数据量。一般来说,写入者将在超过配置限制后的 10 秒内停止。
配额在内核客户端 4.17 及更高版本中实现。 用户空间客户端(libcephfs、ceph-fuse)支持配额。Linux 内核客户端 >= 4.17 支持 CephFS 配额,但仅限于 mimic+ 集群。内核客户端(即使是最新版本)也无法在较旧的集群上处理配额,即使它们可能能够设置配额扩展属性。
与基于路径的挂载限制一起使用时,必须仔细配置配额。 客户端需要访问配置了配额的目录 inode 才能强制执行配额。如果客户端对特定路径(例如
/home/user)的访问受到基于 MDS 功能的限制,并且在他们无权访问的祖先目录(例如/home)上配置了配额,则客户端将无法强制执行它。使用基于路径的访问限制时,请确保在客户端受限制的目录(例如/home/user)或其下的嵌套目录上配置配额。对于内核客户端,它需要访问配置了配额的目录 inode 的父级才能强制执行配额。如果在目录路径(例如
/home/volumes/group)上配置了配额,则 kclient 需要访问父级(例如/home/volumes)。创建此类用户的示例如下
$ ceph auth get-or-create client.guest mds 'allow r path=/home/volumes, allow rw path=/home/volumes/group' mgr 'allow rw' osd 'allow rw tag cephfs metadata=*' mon 'allow r'
已删除或更改的快照文件数据不计入配额。 另请参阅:http://tracker.ceph.com/issues/24284