Li Sheng | Backend / Distributed Storage Engineer Li Sheng | Backend / Distributed Storage Engineer
Home
Resume
Projects
Topics
Notes
GitHub (opens new window)
Home
Resume
Projects
Topics
Notes
GitHub (opens new window)
  • Go语言

  • C++

  • 算法题

  • 存储系统

    • 导航

    • 单机IO基础

    • IO语义与持久化

    • 块层与高速路径

    • Ceph

      • 架构与核心概念

      • 数据分布与一致性

      • 数据路径与存储引擎

        • Ceph数据路径总览
          • 1. 为什么 Ceph 的数据路径值得单独看
          • 2. 一个最简化的写路径脑图
          • 3. 一个最简化的读路径脑图
          • 4. Ceph 数据路径的几个关键分层
            • 1. 客户端与集群视图层
            • 2. Primary OSD 协调层
            • 3. OSD 内部对象管理层
            • 4. 存储引擎与本地持久化层
            • 5. 底层设备与高速路径层
          • 5. 为什么这篇能把 Ceph 和底层机制骨架接起来
          • 6. 后面最适合继续拆开的专题
          • 7. 与当前笔记的关系
        • OSD上的数据管理
        • ceph分布式存储-集群通信
        • Ceph写请求确认路径
      • 运维与调优

      • 实验与性能测试

    • DAOS

    • 归档

  • CephFS

  • 分布式系统

  • 计算机网络

  • Redis与缓存

  • Kubernetes

  • 技术笔记
  • 存储系统
  • Ceph
  • 数据路径与存储引擎
lisheng
2026-04-27
目录

Ceph数据路径总览

# Ceph数据路径总览

如果说 Ceph架构设计 解决的是“Ceph 有哪些组件、它们怎么分工”,那这篇更关注另一件事:

一次读写请求进入 Ceph 之后,数据究竟沿着什么路径流动?

这篇文章的目标,是把 客户端 -> CRUSH/PG -> Primary OSD -> 副本 OSD -> BlueStore/底层设备 这条主线先串起来,并把它和你前面已经整理好的 Page Cache / fsync / 块层 / blk-mq / NVMe 骨架接上。

# 1. 为什么 Ceph 的数据路径值得单独看

Ceph 的数据路径和普通单机文件 I/O 最大的不同在于:

  • 它不是“应用直接写本机文件系统”
  • 它先经过对象映射和副本放置
  • 它要处理主副本协调、一致性确认和恢复逻辑
  • 它的底层存储路径又会继续落到 BlueStore、块设备、网络和设备队列

所以 Ceph 的性能和一致性问题,通常不会只停留在某一层,而是会横跨:

  • 客户端路径
  • 集群映射路径
  • OSD 内部处理路径
  • 底层设备路径

# 2. 一个最简化的写路径脑图

把 Ceph 写路径先压缩成一句话:

客户端把对象写入请求发给 Primary OSD,Primary OSD 协调副本 OSD 完成复制和提交,再由各 OSD 的存储引擎把数据落到本地设备。

展开后大致是:

  1. 客户端拿到集群 map
  2. 客户端根据对象名计算 PG
  3. 客户端通过 CRUSH 计算 PG 对应的 OSD 集合
  4. 客户端把请求发给 Primary OSD
  5. Primary OSD 协调副本 OSD 执行复制和确认
  6. OSD 把对象数据和元数据交给 BlueStore 一类的后端
  7. BlueStore 再把数据推进到底层块设备

这里真正值得盯住的,不只是“有没有写进去”,而是:

  • 什么时候算副本都收到了
  • 什么时候算提交完成
  • 什么时候算真正落到稳定存储

# 3. 一个最简化的读路径脑图

读路径通常比写路径短一些,但同样经过映射和定位:

  1. 客户端根据对象名计算 PG
  2. 通过 CRUSH 算出目标 OSD 集合
  3. 一般由 Primary OSD 负责请求处理或协调
  4. 对应 OSD 从 BlueStore / 底层设备读取对象数据
  5. 数据返回客户端

如果只是看“功能正确”,这条路径不复杂;但一旦看延迟和抖动,问题就会分散到:

  • 对象映射
  • 网络往返
  • OSD 线程模型
  • RocksDB / BlueStore 元数据访问
  • 底层块设备和 NVMe 队列

# 4. Ceph 数据路径的几个关键分层

为了后面能继续深挖,我建议把 Ceph 数据路径拆成 5 层看。

# 1. 客户端与集群视图层

这一层关心的是:

  • 客户端如何拿到最新的集群状态
  • OSD Map、CRUSH Map、PG 映射如何参与路径选择
  • 为什么 Ceph 客户端可以直接定位数据,而不需要集中式元数据服务来决定对象放哪

对应笔记:

  • Ceph架构设计
  • CRUSH算法
  • PG和PGP的区别

# 2. Primary OSD 协调层

这一层关心的是:

  • 为什么客户端通常先找 Primary OSD
  • Primary OSD 如何把请求复制给其他副本 OSD
  • 一次写请求的确认边界在哪里
  • 一次恢复、重平衡或故障切换会怎么改变路径

这是 Ceph 一致性和尾延迟经常出现问题的地方。

# 3. OSD 内部对象管理层

这一层关心的是:

  • 对象到了某个 OSD 之后,怎么找到自己的内部位置
  • PG、对象、object metadata 之间如何组织
  • BlueStore / Filestore 后端如何管理数据和元数据

对应笔记:

  • OSD上的数据管理

# 4. 存储引擎与本地持久化层

这一层已经开始和你前面整理的底层机制骨架接轨:

  • BlueStore 是否使用 Page Cache
  • 数据和元数据怎样组织到 RocksDB / block device
  • 提交语义和 WAL / DB / main block 之间是什么关系
  • fsync、写回、块层、设备 flush 在这里各自扮演什么角色

这也是 Ceph 和“普通文件系统写文件”真正分叉的地方。

# 5. 底层设备与高速路径层

这一层关心的是:

  • 底层是 HDD、SSD 还是 NVMe
  • blk-mq、队列深度、中断亲和是否成为瓶颈
  • 是否存在 BlueStore + RocksDB + 设备多队列之间的耦合问题

到了这里,Ceph 问题就已经不再只是 Ceph 本身的问题,而会直接落到 Linux I/O 栈。

# 5. 为什么这篇能把 Ceph 和底层机制骨架接起来

你前面在 02.IO语义与持久化 和 03.块层与高速路径 里整理的内容,本质上回答的是:

  • 单机 I/O 路径如何走
  • 缓存和刷盘语义如何理解
  • 块层和多队列怎样影响性能
  • 高速设备时代软件路径为什么要变

Ceph 这篇总览的作用,就是把这些“单机 I/O 机制”重新挂回分布式对象存储场景。

比如:

  • Ceph 的提交语义,会回到 fsync、写回与刷盘语义
  • BlueStore 落盘路径,会回到 块层与I-O调度总览
  • NVMe 场景下的 OSD 表现,会回到 blk-mq多队列模型 和 高速存储路径总览

也就是说,Ceph 数据路径不是独立知识点,而是系统专题和底层机制的连接器。

# 6. 后面最适合继续拆开的专题

如果沿着这篇继续扩,最适合往下长的是:

  • 04.Ceph写请求确认路径
  • 12.Ceph读路径与Primary OSD
  • 13.BlueStore提交路径
  • 14.PG状态变化如何影响数据路径
  • 15.Ceph尾延迟从哪几层来

第一篇承接文章:

  • Ceph写请求确认路径

# 7. 与当前笔记的关系

  • 架构入口:Ceph架构设计
  • 映射与放置:CRUSH算法
  • PG 理解入口:PG和PGP的区别
  • OSD 内部管理:OSD上的数据管理
  • 写确认语义:Ceph写请求确认路径
  • IO语义与持久化骨架:VFS层
Edit (opens new window)
Last Updated: 2026/04/28, 15:19:51
ceph分布式存储-PG和PGP的区别
OSD上的数据管理

← ceph分布式存储-PG和PGP的区别 OSD上的数据管理→

最近更新
01
待完成专题池
04-28
02
待完成专题池
04-28
03
为什么 Kubernetes CSI 插件架构要拆成 Controller、Node 与 Sidecar
04-28
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式