2. Ceph OSD 基础:定义、功能与生命周期

2.1 OSD 的定义与核心功能

OSD(Object Storage Daemon)是 Ceph 存储集群中最核心的守护进程,负责将数据以对象形式存储到物理磁盘上,并提供数据读写、复制、恢复和再平衡能力。每个 OSD 通常对应一块独立的物理磁盘或逻辑卷,是集群中唯一直接与存储介质交互的组件。

功能维度 具体职责 说明
数据存储 对象持久化 将 PG 内的对象以文件形式写入底层文件系统(BlueStore 或 Filestore)
数据复制 副本维护 根据 CRUSH 规则将对象副本分发到其他 OSD,保证数据冗余
数据恢复 故障自愈 当 OSD 故障或新 OSD 加入时,自动执行 PG 内对象的回填与恢复
心跳监控 集群状态上报 定期向 Monitor 上报自身状态(up/down/in/out),参与集群选主
数据校验 完整性保障 通过 CRC 校验和 Scrubbing 机制检测并修复静默数据损坏
关键认知:OSD 是 Ceph 中唯一“触碰磁盘”的组件。RADOS 层的所有读写请求最终都由 OSD 完成。在 Rook 管理的 Kubernetes 集群中,每个 OSD 运行在一个独立的容器内,容器挂载宿主机磁盘或 PVC。

2.2 OSD 的生命周期

OSD 从创建到退役经历四个主要阶段:启动 → 运行 → 故障 → 替换。理解每个阶段的状态转换是自动化 OSD 替换的基础。

OSD 生命周期状态机 启动 (booting) OSD 进程初始化 运行 (active) 正常服务 I/O 故障 (down) 心跳超时/崩溃 替换 (replacing) 数据迁移/退役 说明: 虚线表示 OSD 替换完成后,新 OSD 重新进入启动阶段;实线表示正常状态流转。

2.3 各阶段详细说明

2.3.1 启动阶段

  • 触发条件:OSD 进程首次启动、重启或替换后重新加入集群。
  • 关键动作:
    • 读取 OSD 元数据(OSD ID、FSID、CRUSH 位置)。
    • 挂载数据目录并初始化 BlueStore 实例。
    • 向 Monitor 注册并获取集群 Map 最新版本。
    • 等待 PG 分配并开始服务。
  • 状态标识:up: true, in: true 表示 OSD 已启动并参与集群。

2.3.2 运行阶段

  • 核心任务:处理来自客户端的读写请求、执行 PG 内对象复制、参与 Scrubbing。
  • 健康指标:
    • OSD 心跳间隔默认 6 秒,超时 30 秒判定为 down。
    • OSD 负载通过 ceph osd perf 查看延迟和 IOPS。
  • 常见状态:up: true, in: true 且 PG 状态为 active+clean。

2.3.3 故障阶段

  • 故障类型:
    故障类型 原因 影响
    进程崩溃 OSD 守护进程异常退出 OSD 标记为 down,PG 进入 degraded 状态
    磁盘故障 磁盘 I/O 错误、坏道、SMART 告警 OSD 无法读写,需立即替换
    网络分区 OSD 与 Monitor 心跳中断 OSD 被标记为 down,恢复后自动重连
    慢盘 磁盘延迟超过阈值(默认 30s) OSD 被标记为 down,触发自动恢复
  • 自动恢复机制:当 OSD 故障后,Ceph 自动将其标记为 out,并将该 OSD 上的 PG 迁移到其他健康 OSD。

2.3.4 替换阶段

  • 触发场景:磁盘物理损坏、性能劣化、容量不足、硬件生命周期结束。
  • 替换流程:
    1. 将故障 OSD 标记为 out(ceph osd out osd.0)。
    2. 等待 PG 数据迁移完成(ceph -w 监控 backfill 进度)。
    3. 停止 OSD 进程并卸载磁盘。
    4. 更换物理磁盘或重新分配 PVC。
    5. 创建新 OSD 并加入 CRUSH Map。
    6. 新 OSD 自动接收 PG 并进入 active+clean 状态。
  • Rook 自动化:Rook 通过 OSD 准备 Job 自动检测新磁盘并创建 OSD,无需手动执行 ceph osd create。
⚠ 替换避坑:切勿在 PG 未完成 backfill 时强制移除 OSD,否则可能导致数据丢失。生产环境中建议设置 osd_max_backfills = 2 和 osd_recovery_max_active = 3 控制恢复速度,避免影响正常 I/O。

2.4 OSD 与 PG 的关系

PG(Placement Group)是 Ceph 中数据分布的核心逻辑单元,OSD 是 PG 的物理载体。理解二者关系是掌握数据迁移和 OSD 替换的前提。

OSD 与 PG 的映射关系 对象层 (Objects) — 用户数据单元,每个对象有唯一 OID PG 层 (Placement Group) — 对象通过 hash(oid) % pg_num 映射到 PG OSD 层 (Object Storage Daemon) — PG 通过 CRUSH 算法映射到一组 OSD 映射规则示例 • 对象 "photo-2024.jpg" → hash("photo-2024.jpg") % 256 = PG 0x42 • PG 0x42 → CRUSH(pool=photos, pg=0x42) → OSD.3, OSD.7, OSD.12(3副本) • 当 OSD.7 故障时,PG 0x42 自动迁移到 OSD.15,保证副本数不变

2.5 关键映射规则

概念 映射方式 说明
对象 → PG pg_id = hash(oid) % pg_num 同一 PG 内的对象共享相同的副本策略和故障域
PG → OSD 集合 CRUSH 算法计算 根据集群拓扑(host/rack/row)选择 N 个 OSD 存储副本
OSD 故障影响 PG 自动迁移 故障 OSD 上的 PG 被标记为 degraded,Ceph 自动在其他 OSD 上重建副本
OSD 替换影响 PG 重新平衡 新 OSD 加入后,CRUSH 重新计算分布,部分 PG 迁移到新 OSD
💡 运维要点:在 Rook 环境中,OSD 替换通常由 rook-ceph-osd-* 控制器自动完成。当检测到 OSD 对应的 PVC 被删除或磁盘故障时,Rook 会自动创建新的 OSD 并触发 PG 回填。建议在替换前使用 ceph osd safe-to-destroy osd.<id> 确认 PG 已完全迁移。

2.6 本章小结

  • OSD 是 Ceph 的存储执行单元,负责数据持久化、复制、恢复和心跳上报。
  • OSD 生命周期包括启动、运行、故障、替换四个阶段,每个阶段都有明确的状态标识和恢复策略。
  • PG 是对象到 OSD 的中间映射层,OSD 替换本质上是 PG 内对象从故障 OSD 迁移到健康 OSD 的过程。
  • 理解 OSD 与 PG 的映射关系是设计自动化替换门禁的基础,后续章节将基于此构建门禁检查点。