注意

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

OSD

概念

消息传递者

查看 src/msg/Messenger.h

处理代表 OSD 发送和接收消息。OSD 使用两个消息传递者:

  1. cluster_messenger - 处理与其他 OSD 的流量,监控

  2. client_messenger - 处理客户端流量

    这种划分允许 OSD 使用不同的接口配置客户端和集群流量。

消息分发器

查看 src/msg/Dispatcher.h

OSD 实现了 Dispatcher 接口。特别值得注意的是 ms_dispatch,它是通过客户端或集群消息传递者接收消息的入口点。由于有两个消息传递者,ms_dispatch 可能从至少两个线程被调用。在 ms_dispatch 期间始终持有 osd_lock。

工作队列

查看 src/common/WorkQueue.h

WorkQueue 类抽象了为异步执行排队独立任务的过程。每个 OSD 进程都包含用于不同任务的工作队列:

  1. OpWQ: 处理操作(来自客户端)和子操作(来自其他 OSD)。在 op_tp 线程池中运行。

  2. PeeringWQ: 处理对等任务和 PG 地图推进

  3. CommandWQ: 处理命令(PG 查询等)

  4. RecoveryWQ: 处理恢复任务。

  5. SnapTrimWQ: 处理快照修剪

  6. ScrubWQ: 处理主要清理路径

  7. ScrubFinalizeWQ: 处理主要清理完成

  8. RepScrubWQ: 处理副本清理路径

  9. RemoveWQ: 异步删除旧的 PG 目录

线程池

查看 src/common/WorkQueue.h

有 4 个 OSD 线程池:

  1. op_tp: 处理操作和子操作

  2. recovery_tp: 处理恢复任务

  3. disk_tp: 处理磁盘密集型任务

  4. command_tp: 处理命令

OSDMap

查看 src/osd/OSDMap.h

破碎算法有两个输入:集群的图像,其中包含关于哪些节点是上下和进出状态的信息,以及要放置的 pgid。前者由 OSDMap 封装。纪元(epoch_t) 编号的。这些地图在 OSD 内部作为 std::tr1::shared_ptr<const OSDMap> 传递。

查看 MapHandling

PG

查看 src/osd/PG.* src/osd/PrimaryLogPG.*

rados 中的对象被哈希到PGsPGs通过破碎算法放置到 OSD 上。PG 结构负责处理特定PG的请求,以及维护相关元数据和控制恢复。

OSDService

查看 src/osd/OSD.cc OSDService

OSDService 作为 PG 线程和 OSD 状态之间的中介,允许 PG 使用 OSD 服务(如工作队列和消息传递者)执行操作。这仍然是一个进行中的工作。未来的清理工作将集中在将此类状态完全从 OSD 移动到 OSDService。

概述

查看 src/ceph_osd.cc

OSD 进程代表破碎层次结构中的一个叶设备。可能每台物理机器有一个 OSD 进程,或者如果用户配置每个磁盘一个 OSD 实例,则可能有一个以上的 OSD 进程。

由 Ceph 基金会带给您

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