Luminous 中的新增功能:CephFS 子树固定
Ceph 文件系统 (CephFS) 允许将文件系统树的一部分划分为子树,这些子树可以由多个 MDS 进程权威管理。这使得集群能够通过简单地向集群中添加更多的 MDS 服务器来扩展性能,并与文件系统的大小和使用情况相匹配。在可能的情况下,新的子树会被创建并分配给负载较低的 MDS。
在 Luminous 中,多个活动元数据服务器被认为是稳定的。现在在 Luminous 中也可以将一个目录固定到特定的进程。这使得操作员可以在指定哪个 MDS 可以分配给子树以及是否可以将其拆分为更小的子树方面拥有一定的自由度。
查看子树分区 ¶
您可以通过查询每个 MDS 的管理套接字(在每个 MDS 运行的主机上)来查看文件系统的当前子树划分。
$ ceph fs status cephfs - 0 clients ======== +------+--------+-----+---------------+-------+-------+ | Rank | Stat e | MDS | Activity | dns | inos | +------+--------+-----+---------------+-------+-------+ | 0 | active | b | Reqs: 0 /s | 0 | 0 | | 1 | active | c | Reqs: 0 /s | 0 | 0 | | 2 | active | a | Reqs: 0 /s | 0 | 0 | +------+--------+-----+---------------+-------+-------+ +-------------------+----------+-------+-------+ | Pool | type | used | avail | +-------------------+----------+-------+-------+ | cephfs_metadata | metadata | 4098 | 9554M | | cephfs_data | data | 0 | 9554M | +-------------------+----------+-------+-------+ $ bin/ceph daemon mds.a get subtrees | jq '.[] | [.dir.path, .auth_first]' ["~mds2", 2] ["", 0] ["/tmp", 2]
“” 子树是文件系统的根目录(“/”),始终由 rank 0 管理。“/tmp” 子树由 rank 2 管理。(以“~”开头的子树路径是内部子树,不属于文件系统层次结构。)
(请注意,任何尝试在家运行此命令的人:请注意,每个 MDS 并不一定拥有文件系统子树划分的完整视图。MDS 只需要知道其自身子树的相邻子树。如果您想对整个文件系统的子树划分进行任何类型的分析,则必须在每个 MDS 上运行此命令。)
固定子树 ¶
CephFS 平衡器会自动且动态地拆分或合并子树,从而可以将元数据负载分配到 MDS 进程上。但是,有时操作员可能希望通过将目录(及其子目录)固定到特定的进程来覆盖平衡器。这对于管理原因可能很有吸引力。
例如,它可以防止目录拆分为多个子树并使用多个 MDS 服务器的资源。或者,如果操作员事先知道要放置在集群上的元数据负载,则可以以一种均匀地将工作分配到各个进程的方式固定目录。该技术用于评估具有多个活动元数据服务器的 CephFS 的性能,并在 Vault 2017 和 CERN 的研讨会 上进行了演示。
将目录固定到特定进程是通过设置扩展属性来完成的
$ setfattr -n ceph.dir.pin -v 2 /mnt/cephfs/tmp
这可以防止 CephFS 目录“/tmp”被拆分为更小的子树,并将其固定到 rank 2(如果该 rank 存在)。完成此操作后,您可以查询 rank 2 MDS 以查看其子树映射
$ ceph daemon mds.b get subtrees | jq '.[] | [.dir.path, .auth_first, .export_pin]' ["", 0, -1] ["~mds0", 0, -1] ["/tmp", 2, 2]
我们可以在这里看到,“/tmp” 的 export_pin 设置为 2,并且 rank 2 是权威的 (auth_first)。
(注意:只有当目录不为空时,固定目录才会被发送到其 rank。)
固定层级 ¶
您还可以拥有固定层级。这意味着子目录可以设置一个覆盖父目录固定的 pin。所以我们可能有
$ setfattr -n ceph.dir.pin -v 0 /mnt/cephfs/users/ $ setfattr -n ceph.dir.pin -v 1 /mnt/cephfs/users/joe/ $ ceph daemon mds.b get subtrees | jq '.[] | [.dir.path, .auth_first, .export_pin]' ["", 0, -1] ["~mds0", 0, -1] ["/tmp", 2, 2] ["/users/joe", 1, 1] ["/users", 0, 0]
“/users” 子树为其自身及其子目录(主目录)设置了一个“默认” pin 到 rank 0。但是,“/users/joe” 有一个 pin 到 rank 1,这覆盖了“/users” 的 pin。
未来方向 ¶
早期 CephFS 致力于使子树管理和负载平衡动态。这使得 CephFS 优于其他文件系统,因为它允许可扩展的元数据分区和自适应负载平衡。但是,静态指定的子树对于操作员来说仍然有用,可以建立一种策略,将目录树保留在单个 MDS 上,或者以定义的方式在集群中划分负载。未来,CephFS 团队计划改进平衡器的行为,以便即使在具有先验已知负载模式的“完美”静态分区的情况下,动态子树分区也更加一致和高效。