配额管理

CephFS 允许给系统内的任意目录设置配额,这个配额可以限制目录树中这一点以下的字节数或者文件数。

局限性

  1. 配额是合作性的、非对抗性的。 CephFS 的配额功能依赖于挂载它的客户端的合作,在达到上限时要停止写入;无法阻止篡改过的或者对抗性的客户端,它们可以想写多少就写多少。在客户端完全不可信时,用配额防止多占空间是靠不住的。

  2. 配额是不准确的。 在达到配额限制一小段时间后,正在写入文件系统的进程才会被停止。很难避免它们超过配置的限额、多写入一些数据。会超过配额多大幅度主要取决于时间长短,而非数据量。一般来说,超出配置的限额之后 10 秒内,写入会被停掉。

  3. 内核客户端在 4.17 及更高版才实现配额功能。 用户空间客户端( libcephfs 、 ceph-fuse )早已支持配额了; >=4.17 的 Linux 内核客户端也支持配额,但仅在 mimic 及更高版本的集群上支持。内核客户端(即使是最近的版本),即使它们能设置配额扩展属性,也不能处理老集群上的配额。

  4. 基于路径限制挂载时必须谨慎地配置配额。 客户端必须能够访问配置了配额的那个目录的索引节点,这样才能执行配额管理。如果某一客户端被 MDS 能力限制成了只能访问一个特定路径(如 /home/user ),并且它们无权访问配置了配额的父目录(如 /home ),这个客户端就不会按配额执行。所以,基于路径做访问控制时,最好在限制了客户端的那个目录(如 /home/user )、或者它下面的子目录上配置配额。

  5. 此后删除或更改的快照文件数据不计入配额。 另见 http://tracker.ceph.com/issues/24284

配置

就像 CephFS 里的其它配置一样,配额也是用虚拟扩展属性来配置的:

  • ceph.quota.max_files – file limit

  • ceph.quota.max_bytes – byte limit

如果这些属性出现在目录索引节点里,就意味着那里配置了配额;如果不存在,那么那个目录就没设置配额(然而父目录仍然有可能配置了)。

要设置配额:

# 100 MB
setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir
# 10000 个文件
setfattr -n ceph.quota.max_files -v 10000 /some/dir

要查看设置的配额:

getfattr -n ceph.quota.max_bytes /some/dir
getfattr -n ceph.quota.max_files /some/dir

需要留意的是,如果这些扩展属性的值是 0 ,就说明没设置配额。

要删除配额:

setfattr -n ceph.quota.max_bytes -v 0 /some/dir
setfattr -n ceph.quota.max_files -v 0 /some/dir