注意

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

OSD

概念

Messenger

参见 src/msg/Messenger.h

代表 OSD 处理消息的发送和接收。OSD 使用两个 messenger:

  1. cluster_messenger - 处理到其他 OSD 和 monitor 的流量

  2. client_messenger - 处理客户端流量

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

Dispatcher

参见 src/msg/Dispatcher.h

OSD 实现了 Dispatcher 接口。特别值得注意的是 ms_dispatch,它充当通过客户端或集群 messenger 接收到的消息的入口点。因为有两个 messenger,所以 ms_dispatch 可能会被至少两个线程调用。osd_lock 始终在 ms_dispatch 期间保持锁定。

WorkQueue

参见 src/common/WorkQueue.h

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

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

  2. PeeringWQ:处理对等任务和 pg map 推进。在 op_tp 线程池中运行。参见 Peering

  3. CommandWQ:处理命令(pg 查询等)。在 command_tp 线程池中运行。

  4. RecoveryWQ:处理恢复任务。在 recovery_tp 线程池中运行。

  5. SnapTrimWQ:处理快照修剪。在 disk_tp 线程池中运行。参见 SnapTrimmer

  6. ScrubWQ:处理主擦洗路径。在 disk_tp 线程池中运行。参见 Scrub

  7. ScrubFinalizeWQ:处理主擦洗完成。在 disk_tp 线程池中运行。参见 Scrub

  8. RepScrubWQ:处理副本擦洗路径。在 disk_tp 线程池中运行。参见 Scrub

  9. RemoveWQ:异步删除旧的 pg 目录。在 disk_tp 线程池中运行。参见 PGRemoval

ThreadPool

参见 src/common/WorkQueue.h 另参见上文。

有 4 个 OSD 线程池:

  1. op_tp:处理 ops 和 subops

  2. recovery_tp:处理恢复任务

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

  4. command_tp:处理命令

OSDMap

参见 src/osd/OSDMap.h

crush 算法需要两个输入:集群的图像,包含有关哪些节点处于启动/停止和进入/退出状态的状态信息,以及要放置的 pgid。前者由 OSDMap 封装。Map 按 epoch (epoch_t) 编号。这些 map 在 OSD 内部作为 std::tr1::shared_ptr<const OSDMap> 传递。

参见 MapHandling

PG

参见 src/osd/PG.* src/osd/PrimaryLogPG.*

rados 中的对象被散列到 PGs 中,PGs 通过 crush 被放置到 OSD 上。PG 结构负责处理与特定 PG 相关的请求,以及维护相关元数据和控制恢复。

OSDService

参见 src/osd/OSD.cc OSDService

OSDService 充当 PG 线程和 OSD 状态之间的中介,允许 PG 使用 OSD 服务(例如 workqueues 和 messengers)执行操作。这仍在进行中。未来的清理将侧重于将此类状态完全从 OSD 转移到 OSDService。

概述

参见 src/ceph_osd.cc

OSD 进程代表 crush 层次结构中的一个叶设备。每个物理机器可能有一个 OSD 进程,如果用户为每个磁盘配置一个 OSD 实例,则可能多于一个。

由 Ceph 基金会为您呈现

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