Ceph 概览与学习路径¶
Ceph 是开源的分布式存储系统。它将多台服务器上的磁盘组织为统一的 RADOS 存储集群,并在同一套底层存储之上提供块、文件和对象三种访问方式。
Ceph 解决的问题¶
传统单机 RAID 可以处理部分磁盘故障,但容量、性能和故障域仍受一台服务器限制。集中式存储可以向多台主机共享数据,但控制器或存储阵列可能成为扩展边界。
Ceph 将数据切分为对象并分布到多个 OSD,通过副本或纠删码保存冗余。当磁盘或节点故障时,集群根据当前拓扑重新放置数据,使容量和性能可以随节点数量横向扩展。
Ceph 的主要价值包括:
- 使用通用服务器和磁盘构建共享存储资源池。
- 通过 CRUSH 按主机、机架等故障域分布数据。
- 由客户端直接访问 OSD,避免所有数据经过单一中心节点。
- 同时提供 RBD、CephFS 和 RGW 三种存储服务。
- 节点或磁盘变化后自动执行恢复与数据均衡。
三种存储服务¶
| 服务 | 访问模型 | 常见用途 |
|---|---|---|
| RBD | 块设备 | KVM/OpenNebula/PVE 虚拟机磁盘、Kubernetes RWO 持久卷 |
| CephFS | POSIX 文件系统 | 多节点共享目录、Kubernetes RWX 持久卷、共享文件数据 |
| RGW | S3/Swift 风格对象 API | 备份、归档、镜像、日志、应用对象数据 |
三者不是同一种接口的不同名称。块存储由客户机管理文件系统;文件存储由 CephFS 提供目录和文件语义;对象存储通过 HTTP API 使用 Bucket/Object,不提供普通本地文件系统语义。
核心组件¶
| 组件 | 主要职责 | 是否承载业务数据 |
|---|---|---|
| MON | 维护集群成员、状态和各类 Cluster Map,并通过多数派形成一致视图 | 不在客户端正常数据路径中 |
| MGR | 汇总运行状态,提供管理模块、Dashboard、Prometheus 等接口 | 不保存用户业务数据 |
| OSD | 在磁盘上保存 RADOS 对象,处理复制、恢复、回填和 Scrub | 是 |
| MDS | 管理 CephFS 文件名、目录、权限等元数据 | 只服务 CephFS 元数据路径 |
| RGW | 将 S3/Swift 请求转换为 RADOS 对象操作 | 网关本身通常无状态,数据在 OSD |
一次写入的数据流¶
客户端先从 MON 获取最新 Cluster Map
↓
客户端根据 Pool、对象名和 PG 计算目标 OSD
↓
客户端直接向该 PG 的 Primary OSD 写入
↓
Primary OSD 向同一 Acting Set 的其他 OSD 写副本或 EC 分片
↓
满足确认条件后向客户端返回成功
MON 负责提供集群地图,不转发每一笔业务数据。CRUSH 让客户端和 OSD 能根据相同规则计算数据位置,减少对集中式查找服务的依赖。
容量的基本认识¶
三副本池中,一份逻辑数据通常占用约三份原始空间;扣除系统开销和安全水位后,可用容量会进一步减少。纠删码池使用 k 个数据分片和 m 个校验分片,空间利用率通常高于三副本,但写入、恢复和小 IO 的计算与读放大更复杂。
生产规划不能按“所有硬盘容量之和”承诺业务容量,还要保留故障恢复和数据均衡所需的空闲空间,并以最满 OSD 而不是集群平均使用率判断容量风险。
学习路径¶
- 架构、RADOS 与 CRUSH:理解 Object、Pool、PG、OSD 和数据放置。
- 规划与 cephadm 部署:完成节点、磁盘、网络和故障域规划。
- RBD、CephFS 与 RGW:根据业务访问模型选择存储服务。
- Rook、Ceph 与 Kubernetes CSI:这套 Ceph 作为 Kubernetes 专用存储时的部署和挂载链路。
- 日常运维与容量管理:巡检、扩容、维护、升级和备份。
- 故障排查:从 Health、PG、OSD、网络和磁盘逐层定位。