注意

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

异步恢复

Ceph 放置组 (PGs) 维护写入事务的日志,以促进数据的快速恢复。在恢复过程中,每个 PG 日志用于确定每个 OSD 中缺失或过时的内容。这避免了扫描所有 RADOS 对象的需要。基于日志的PG了解此过程的更多详细信息。

在 Nautilus 发布之前,此恢复过程是同步的:它会阻止对 RADOS 对象的写入,直到其被恢复。相比之下,回填可以通过临时分配不同的执行集,并通过回填执行集外部的 OSD 来允许写入(假设有足够多的最新副本可用)。在某些情况下,这对可用性来说要好得多,例如,如果 PG 日志包含对不连续对象的 3000 次写入。当 PG 日志包含数千条条目时,实际上可能比迭代 PG 日志更快(尽管不太安全)通过删除和重新部署包含的 OSD 来用回填换取恢复。恢复数兆字节的 RADOS 对象数据(甚至更糟糕的是,数兆字节的 omap 键,特别是 RGW 桶索引)会大大增加小更新的延迟,并且与跨许多降级对象分布的请求相结合,这是导致请求缓慢的配方。

为了避免这种情况,我们可以在 OSD 上以与实时执行集分离的方式在后台执行恢复,类似于回填,但仍然使用 PG 日志来确定需要执行的操作。这被称为异步.

执行异步恢复而不是同步恢复的阈值并不明确。异步恢复需要满足几个条件:

  • 尽量保持min_size副本可用

  • 使用日志长度差异的近似值以及历史缺失对象来估计恢复成本

  • 使用参数osd_async_recovery_min_cost来确定

使用现有的对等过程,当我们选择执行集时,我们没有从每个对等方获取 PG 日志;我们只有它的界限和其他元数据来自它们的pg_info_t。在这个阶段获取和检查每个日志会更昂贵,所以我们目前只考虑对日志长度的近似检查。在 Nautilus 中,我们改进了缺失对象的核算,因此 Nautilus 之后,这些信息也用于确定恢复成本。

在异步恢复进行时,对执行集成员的写入可以继续,但我们需要将它们的日志条目发送到异步恢复目标(就像我们对回填 OSD 所做的那样),以便它们可以完全赶上。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.