注意
本文档适用于 Ceph 的开发版本。
OSD
概念
- Messenger
参见 src/msg/Messenger.h
代表 OSD 处理消息的发送和接收。OSD 使用两个 messenger:
cluster_messenger - 处理到其他 OSD 和 monitor 的流量
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 进程包含用于不同任务的工作队列:
OpWQ:处理 ops(来自客户端)和 subops(来自其他 OSD)。在 op_tp 线程池中运行。
PeeringWQ:处理对等任务和 pg map 推进。在 op_tp 线程池中运行。参见 Peering
CommandWQ:处理命令(pg 查询等)。在 command_tp 线程池中运行。
RecoveryWQ:处理恢复任务。在 recovery_tp 线程池中运行。
SnapTrimWQ:处理快照修剪。在 disk_tp 线程池中运行。参见 SnapTrimmer
ScrubWQ:处理主擦洗路径。在 disk_tp 线程池中运行。参见 Scrub
ScrubFinalizeWQ:处理主擦洗完成。在 disk_tp 线程池中运行。参见 Scrub
RepScrubWQ:处理副本擦洗路径。在 disk_tp 线程池中运行。参见 Scrub
RemoveWQ:异步删除旧的 pg 目录。在 disk_tp 线程池中运行。参见 PGRemoval
- ThreadPool
参见 src/common/WorkQueue.h 另参见上文。
有 4 个 OSD 线程池:
op_tp:处理 ops 和 subops
recovery_tp:处理恢复任务
disk_tp:处理磁盘密集型任务
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 实例,则可能多于一个。