注意

本文档适用于 Ceph 的开发版本。

CephFS 动态元数据管理

元数据操作通常占所有文件系统操作的 50% 以上。与扩展存储(进而线性扩展 I/O 吞吐量)相比,元数据的扩展方式更为复杂。这是由于文件系统元数据的层次结构和相互依赖的特性所致。因此,在 CephFS 中,元数据工作负载与数据工作负载解耦,以避免对 RADOS 集群施加不必要的压力。因此,元数据由一个元数据服务器 (MDS) 集群处理。CephFS 通过动态子树分区在 MDS 之间分配元数据。

动态子树分区

在传统的子树分区中,文件系统层次结构的子树被分配给各个 MDS。这种元数据分配策略提供了良好的层次局部性、缓存的线性增长、跨 MDS 的横向扩展以及元数据在 MDS 之间的相当好的分布。

../../_images/subtree-partitioning.svg

传统子树分区的问题在于,按深度(跨单个 MDS)的工作负载增长会导致活动热点。这导致缺乏纵向扩展以及非繁忙资源/MDS 的浪费。

这导致采用了更动态的元数据处理方式:动态子树分区,其中来自繁忙 MDS 的目录层次结构中负载密集的部分被迁移到非繁忙的 MDS。

该策略确保活动热点在出现时得到缓解,从而在横向扩展的基础上实现了元数据工作负载的纵向扩展。

子树迁移过程中的导出过程

一旦导出器验证子树可以导出(非降级集群、非冻结的子树根),子树根目录被临时进行 auth pin,开始子树冻结,并且导出器致力于子树迁移,除非导入器或其自身出现干预性故障。

MExportDiscover 消息用于确保正在导出的基本目录的 inode 在目标节点上打开。它被导入器进行 auth pin 以防止被修剪。这发生在导出器完成子树冻结之前,以确保导入器能够复制必要的元数据。当导出器收到 MDiscoverAck 时,它通过移除其临时 auth pin 来允许冻结继续进行。

仅当基本子树目录被除导入器和导出器之外的节点打开时,才会发生警告阶段。如果不是,则意味着子树内或嵌套在子树下的元数据未被除导入器和导出器之外的任何节点复制。如果是,则 MExportWarning 消息通知任何旁观者该区域的权限暂时不明确,并列出导出器和导入器作为权威 MDS 节点。特别是,正在从其缓存中修剪项目的旁观者必须将 MCacheExpire 消息发送给新旧两个权威机构。这对于确保幸存的权威机构可靠地接收所有过期通知是必要的,即使导入器或导出器发生故障。当子树被冻结(在导入器和导出器上)时,过期通知不会立即处理;相反,它们将被排队,直到该区域解冻并且可以确定该节点是否具有权威性。

然后,导出器打包一个包含子树所有元数据的 MExport 消息,并将对象标记为非权威。MExport 消息将实际的子树元数据发送给导入器。收到后,导入器将数据插入其缓存中,将所有对象标记为权威,并在 EImportStart 日志消息中记录所有元数据的副本。一旦安全刷新,它会回复 MExportAck。导出器现在可以记录 EExport 日志条目,最终指定导出成功。在发生故障的情况下,只有 EExport 条目的存在才能在恢复期间消除权限歧义。

记录后,导出器将向任何旁观者发送 MExportNotify,告知他们权限不再模糊,并且缓存过期通知应仅发送给新的权威机构(导入器)。一旦这些被回复给导出器,隐式刷新旁观者到导出器消息流中的任何杂散过期通知,导出器解冻子树,清理其与迁移相关的状态,并向导入器发送最终的 MExportFinish。收到后,导入器记录 EImportFinish(true)(在本地记录导出确实成功),解冻其子树,处理任何排队的缓存过期通知,并清理其状态。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入