Ceph OSD 启动时做了什么

这个问题非常好 👍,已经从“组件理解”进入到“系统行为 + 性能机制”层面了。
我给你分两大块讲清楚:


一、Ceph OSD 启动时做了什么?

可以把 OSD 启动理解成 5 个阶段:


🧱 1️⃣ 设备与存储引擎初始化(BlueStore)

OSD 启动第一件事:

1
打开磁盘 → 初始化 BlueStore → 加载元数据

核心动作:

  • 打开 block 设备(NVMe / SSD / SPDK bdev)
  • 初始化 BlueStore
  • 挂载 RocksDB
  • 读取 superblock(OSD 信息)

👉 如果是第一次启动:

  • 格式化 BlueStore
  • 初始化 allocator / WAL / DB


🌐 2️⃣ 网络与集群注册

OSD 会连接 Ceph 集群:

1
OSD → Monitor(MON)

作用:

  • 获取 cluster map
  • 获取 OSD map
  • 注册自己(上线)

👉 包括:

  • public network(客户端流量)
  • cluster network(OSD 间复制)


🧠 3️⃣ 加载 PG(Placement Group)

这是核心步骤:

1
OSD 加载属于自己的 PG

每个 PG:

  • 对应一部分数据
  • 有自己的状态机

👉 加载内容:

  • PG metadata
  • 对象信息
  • 日志(log)


🔁 4️⃣ Recovery / Peering

如果集群不是干净状态:

1
OSD 会进入恢复流程

包括:

  • peering(主从同步)
  • recovery(数据补齐)
  • backfill(大规模重建)


⚙️ 5️⃣ 启动 IO 处理线程

OSD 最终进入:

1
等待客户端 IO

启动:

  • op queue(请求队列)
  • worker 线程
  • messenger 网络线程


二、OSD 如何支持“大流量并发”?

这是重点,我给你拆成 6 大机制。


🚀 1️⃣ PG 分片(核心并发单位)

👉 Ceph 最大的并发设计:

1
数据 → 切分为 PG(Placement Group)

例如:

1
1000个PG → 分布在多个OSD

👉 每个 PG:

  • 独立处理 IO
  • 独立锁(避免全局锁)

✔ 好处:

1
天然水平扩展


🚀 2️⃣ 多队列 + 多线程模型

OSD 内部:

1
client → op queue → worker threads

👉 有:

  • shard queue(分片队列)
  • 多 worker 并行处理

类似:

1
2
CPU0 → PG1, PG2
CPU1 → PG3, PG4


🚀 3️⃣ 异步 IO(AIO)

BlueStore 使用:

1
aio / io_uring / SPDK(可选)

👉 特点:

  • 非阻塞
  • pipeline 化

1
提交 IO → 不等待 → 继续处理


🚀 4️⃣ Transaction 批处理

ObjectStore 层:

1
多个操作 → 合并成一个 Transaction

👉 优点:

  • 减少 IO 次数
  • 减少锁竞争
  • 提高吞吐


🚀 5️⃣ RocksDB 优化(元数据并发)

RocksDB 提供:

  • LSM-tree 写优化
  • memtable + compaction
  • batch 写

👉 避免:

1
频繁随机写


🚀 6️⃣ 网络层优化(Messenger)

Ceph 使用:

1
Async Messenger(msgr v2)

特点:

  • 多连接
  • 零拷贝
  • RDMA(可选)


三、如果结合 SPDK(更强)

当你引入:

SPDK


IO路径变成:

1
2
3
4
5
6
7
OSD

BlueStore

SPDK bdev

NVMe

提升:

  • 无 syscall
  • 无中断
  • 多队列直达硬件


四、整体并发模型(总结图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
客户端并发请求

Messenger(网络)

PG 分片(并发核心)

Op Queue(多队列)

Worker Threads

Transaction(批处理)

BlueStore

(SPDK / AIO)

NVMe SSD

五、关键设计总结(非常重要)


❗1. 并发单位不是线程

👉 是:

1
PG(Placement Group)

❗2. 数据路径是无锁/低锁设计

  • PG 内部锁
  • 避免全局锁

❗3. IO 全部异步化

  • 网络 async
  • 磁盘 async
  • 事务 async

❗4. 扩展靠“横向扩展”

1
加 OSD → 加性能

六、一句话总结

👉 OSD 启动时完成设备初始化、PG加载和集群注册;运行时通过 PG 分片 + 多队列 + 异步 IO + 批处理 来支撑大规模并发


🚀 如果你想再深入(建议)

可以继续往这几个“真正核心”挖:


🔥 1. PG 状态机(peering / active)

🔥 2. OSD op queue 调度算法(wpq / mclock)

🔥 3. BlueStore 并发模型(txc / kv_sync_thread)

🔥 4. SPDK 在 Ceph 中的线程绑定方式


你可以直接说:

👉 “讲 OSD op queue 调度”
👉 或 “讲 PG 状态机”

我可以带你进入源码级理解 👍

文章互动

阅读 --

留言

0 条留言

正在加载留言…