Skip to content

4. 文件存储 CephFS

本章目标

  • 部署 MDS 并挂载 CephFS,理解元数据池与数据池的分离
  • 理解 MDS active/standby 与元数据缓存对性能的决定性影响
  • 知道 CephFS 的适用与不适用边界

4.1 CephFS = 元数据池 + 数据池

CephFS 把一个文件系统拆成两个 pool:

text
             文件系统 myfs
            /             \
   metadataPool            dataPools
   (目录树、inode、        (文件内容切成 4MiB 对象)
    xattr、打开文件表)      可副本、可 EC 4+2
   通常:ssd + 3副本          通常:EC 提得盘率

为什么分离?元数据是小、随机、极热的负载(一次 ls 可能摸几百个 inode),必须 SSD + 副本伺候;文件数据是大块顺序,EC 便宜大碗。一套 pool 伺候两种负载必然两头不讨好 —— 这与 rook 指南里 metadataPool.deviceClass 必须为 ssd 的硬性要求是同一条经验。

4.2 MDS:POSIX 语义的提供者

RBD 为什么不需要元数据服务?因为"块 0 到块 N"的映射就是简单切分,客户端自己算。而 POSIX 文件系统要回答"路径 /a/b/c.txt 在哪"、"谁能读"、"我读到的是别人写过的"—— 这些一致性答案由 MDS 集中给出:

  • MDS 维护目录树与 inode,把"文件→对象列表"的映射告诉客户端
  • 客户端之后的数据读写直接找 OSD(MDS 不在数据路径上)
  • 通过 capabilities(caps) 机制做多客户端缓存一致性:谁持有写 cap、谁只有读 cap,避免每次操作都问 MDS

ceph fs status 查看 active/standby:MDS 是 active + standby(不是负载均衡),元数据热点天然受限于单个 active MDS 的能力 —— 这是 CephFS 边界的根源。

内存是 MDS 的性能命脉。rook 手册给出的实战数字:生产 metadataServer.resources.memory 至少 32Gi;每条元数据约占 3KB 内存,热元数据全在内存时性能最好,内存不足会频繁回收缓存造成"断崖式"性能下降 —— 表现为"平时挺好,一到大促/高峰就卡"。

4.3 挂载方式

bash
# 内核客户端(推荐:性能好,随内核发布)
mount -t ceph mon1,mon2,mon3:/ /mnt/cephfs -o name=admin,secret=<key>
# 子目录挂载 + 只读示例:
mount -t ceph ...:/subdir /mnt/ro -o name=xx,secret=xx,ro

# FUSE(ceph-fuse):功能新、可移植;性能略低
ceph-fuse /mnt/cephfs

内核客户端版本跟内核走(新特性滞后),FUSE 跟 Ceph 版本走。实验环境两者都试一遍,注意多客户端同挂时的缓存一致性由 caps 保证 —— 但应用层自己缓存文件内容(如 NFS export 后再 export)依然危险

4.4 适用边界

适用 ✅慎用 ⚠️
共享目录、家目录、容器共享卷(RWX)海量小文件 + 极高元数据 OPS 的 AI 训练场景(storplan 选型表明确标注)
中等规模的文件服务、备份目标超大单目录(百万级 entry 的 ls
混合负载的统一存储对 P99 极敏感的低延迟共享

AI 场景慎用的根因:训练是"数千客户端同时打开百万小文件",元数据压力集中在单 active MDS + 每元数据 3KB 内存的缓存模型上,容量与 OPS 都容易撞墙。这正是 GPFS ECE / Weka / VastData 的主场 —— 第三篇选型详细对比。

本章小结

  • 双池设计:元数据池(ssd+副本)与数据池(EC)各司其职
  • MDS 管语义与一致性(caps),数据路径直连 OSD
  • MDS 内存 ≥32Gi 是生产硬要求;性能断崖多来自元数据缓存不足
  • 共享目录用 CephFS;海量小文件 AI 负载慎用

自测

QuizCephFS 客户端读取一个大文件的数据块时,数据来自?
Quiz生产 CephFS 的 metadataPool 应该怎么配?
🧪Lab · CephFS 挂载与压力画像进阶
⏱ 60 分钟🖥 Ceph 实验集群 + MDS
1. 部署 MDS(`ceph orch apply mds myfs:2`),创建 CephFS(元数据池 ssd+3副本 / 数据池 EC 或副本),两台客户端内核挂载同一子目录。 2. 客户端 A `git clone` 一个大仓库(或脚本生成 10 万个 1KB 小文件),客户端 B 同时 `ls -R` 与 `du`。 3. 观察 `ceph fs status`、`ceph daemon mds.myfs.a performance` 与 `ceph -s`:记录元数据池的 IOPS、MDS 内存占用变化。 4. 大文件对照实验:单线程 `dd` 一个 50GB 文件,对比小文件场景的元数据池 IOPS —— 你会看到两种完全不同的画像。 5. **验收标准**:用自己的话解释"小文件场景瓶颈在 MDS 而不是 OSD",并给出两张画像的数据支撑。
📎 参考手册 ↗

上一章 · 下一章:5. 对象存储 RGW →