注意
本文档适用于 Ceph 开发版本。
子树导出
正常迁移
导出器首先在 export_dir() 中执行一些检查,以验证此时是否允许导出子树。特别是,集群不能处于降级状态,子树根目录不能冻结或已冻结(即已经导出,或嵌套在正在导出的内容下),路径必须被固定(即不与重命名冲突)。如果满足这些条件,子树冻结将被启动,导出器将致力于子树迁移,除非导入器或导出器本身发生中间故障。
MExportDirDiscover 的作用只是为了确保要导出的基本目录在目标节点上是打开的。它被导入器固定以防止被修剪。这发生在导出器完成子树冻结之前,以确保导入器能够复制必要的元数据。当导出器收到 MExportDirDiscoverAck 时,它允许冻结继续进行。
然后是 MExportDirPrep 消息,用于填充一个包含所有目录、inode 和 dentry 的生成树,这些是到达导出区域内任何嵌套导出的必要元素。这也复制了元数据,但它是由导出器推送的,避免了与常规发现和复制过程的死锁。导入器负责在确认之前从任何第三方打开边界目录。这确保了导入器拥有关于所有嵌套在正在迁移的子树中的点的正确 dir_auth 信息。在处理 MExportDirPrep 时,导入器冻结整个子树区域,以防止任何新的复制或缓存过期。
警告阶段仅发生在基本子树目录被导入器和导出器以外的节点打开时。如果是这样,那么 MExportDirNotify 消息会通知任何旁观者该区域的权限暂时不明确。特别是,从其缓存中修剪项目的旁观者必须向旧的和新的权限发送 MCacheExpire 消息。这是必要的,以确保即使导入器或导出器失败,幸存的权限也能可靠地接收所有过期信息。在子树冻结时(在导入器和导出器上),过期信息不会立即处理;相反,它们将被排队,直到区域解冻,并且可以确定节点是否对区域有权限。
MExportDir 消息将实际的子树元数据发送给导入器。收到后,导入器将其数据插入其缓存,在 EImportStart 中记录副本,并回复 MExportDirAck。现在导出器可以记录 EExport,这最终指定导出成功。在存在故障的情况下,EExport 的存在在恢复过程中消除了权限的不明确性。
一旦记录,导出器将向任何旁观者发送 MExportDirNotify,通知他们权限不再不明确,缓存过期信息应仅发送给新权限(导入器)。一旦确认,隐式地清空旁观者到导出器的消息流中的任何 stray 过期通知,导出器解冻子树,清理其状态,并发送最终的 MExportDirFinish 给导入器。收到后,导入器记录 EImportFinish(true),解冻其子树,并清理其状态。
部分故障恢复
从日志恢复
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.