Ceph 源码分析
面给你做一份 Ceph 源码“骨架级别 + OSD主线”分析,按你这种做 FreeCAD/OCCT 那种拆源码思路来讲(直接抓核心路径,不绕)。
一、Ceph 整体源码结构(你先建立脑图)
Ceph 源码核心分 4 层:
用户层
├── librados / rbd / cephfs
↓
公共通信层
├── messenger (msgr)
├── mon client / auth
↓
集群核心层
├── OSD
├── MON
├── MDS
↓
存储后端
├── BlueStore
├── FileStore(旧)
├── kvdb / RocksDB
二、你真正要盯的核心:OSD(90%系统复杂度)
OSD入口文件:
src/osd/OSD.cc
src/osd/OSD.h
启动链路:
main()
→ OSD::mkfs()
→ OSD::init()
→ OSD::activate()
→ OSD::run()
三、OSD 的线程模型(Ceph最关键设计)
OSD 不是单线程,是“事件驱动 + 多Finisher线程”:
核心线程:
Messenger thread(网络IO)
Peering thread(PG状态机)
Recovery thread(数据恢复)
Backfill thread(数据重平衡)
BlueStore IO thread(磁盘IO)
四、数据模型:PG(Placement Group)
PG 是 Ceph 的核心抽象。
源码:
src/osd/PG.*
结构:
PG
├── pg_state(active / peering / recovering)
├── object_map
├── log(pg log)
├── missing set
└── osdmap epoch
五、OSD 收到请求的完整路径(重点)
从客户端写一个对象开始:
1)网络层进入
Messenger::dispatch()
路径:
src/msg/async/AsyncMessenger.cc
2)进入 OSD
OSD::ms_fast_dispatch(Message *m)
判断消息类型:
- MOSDOp(读写)
- MOSDPGCreate
- MOSDPGRemove
3)进入 PG
OSD::handle_op()
→ PG::do_request()
4)PG 状态机处理
PG::do_request()
→ primary / replica 分发
→ recovery判断
→ writeback / cache
5)最终写入 BlueStore
PrimaryLogPG::do_op()
→ BlueStore::write()
六、BlueStore(现代 Ceph 核心存储引擎)
源码:
src/os/bluestore/BlueStore.cc
结构:
BlueStore
├── RocksDB(元数据)
├── BlockDevice(裸盘)
├── Allocator(空间管理)
├── Extent map
写路径:
BlueStore::write()
→ prepare transaction
→ submit to kv + block
→ commit
七、CRUSH 算法(决定数据放哪)
源码:
src/crush/
核心:
CRUSH map
CRUSH rule
CRUSH chooseleaf
逻辑:
object → pg → osd set
关键函数:
crush_do_rule()
crush_choose()
八、MON(集群大脑)
源码:
src/mon/MonClient.cc
src/mon/Monitor.cc
作用:
- 管 OSD map
- 管 CRUSH map
- 管 cluster epoch
- 仲裁 quorum
九、通信层(Async Messenger)
源码:
src/msg/async/
核心:
AsyncMessenger
→ Epoll
→ EventCenter
→ Connection
特点:
- 无锁队列
- reactor模型
- per-core event loop
十、Ceph 一次写入完整路径(非常重要)
Client
→ librados
→ MON 获取 osdmap
→ CRUSH 计算 PG
→ Messenger 发送 MOSDOp
→ OSD::ms_fast_dispatch
→ PG::do_request
→ PrimaryLogPG
→ BlueStore
→ RocksDB + BlockDevice
十一、你做源码分析要抓的“3条主线”
主线1:数据路径(最重要)
client → osd → pg → bluestore
主线2:状态机(PG)
peering → active → degraded → recovering
主线3:分布式一致性
MON quorum + epoch + osdmap
十二、给你一个“逆向学习路线”(建议)
如果你要真吃透 Ceph:
第1阶段(必须)
- OSD.cc
- PG.cc
- BlueStore.cc
第2阶段
- AsyncMessenger
- CRUSH
第3阶段
- MON / Paxos
- Recovery / Backfill