注意

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

The ClientRequest pipeline

RADOS 要求对每个对象的写入操作都按顺序执行。如果客户端提交了一系列并发写入(即在提交下一个写入之前不等待前一个写入完成),客户端可能依赖于写入操作按照提交的顺序完成。

因此,客户端->osd 通信以及双方的排队机制必须确保(连接、对象)对的写入操作在整个过程中保持有序。

crimson-osd 通过管道和阶段(crimson/osd/osd_operation.h)来强制执行这种排序。消息到达 OSD 后,会进入 ConnectionPipeline::AwaitActive 阶段,并依次通过一系列管道阶段

  • ConnectionPipeline:按连接划分的阶段,表示消息在被移交给目标 PG 之前的处理路径

  • PerShardPipeline:中间管道,表示从接收分片移交给具有目标 PG 的分片的过程。

  • CommonPGPipeline:表示在目标 PG 上获取操作目标 ObjectContext 之前的处理。

  • CommonOBCPipeline:表示在目标对象上实际处理 IO 的过程

因为 CommonOBCPipeline 是按对象而不是按连接或按 PG 划分的,所以不同对象上的多个请求可以同时处于同一个 CommonOBCPipeline 阶段。这允许我们在同一个 PG 中并发处理多个读取操作。我们还可以并发处理多个对象上的写入操作,直到实际提交写入操作为止。

有关详细信息,请参阅 crimson/osd/osd_operations/client_request.(h|cc)。

由 Ceph 基金会为您呈现

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