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

类似文章