强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Ceph 存储运维完全指南 / 06 - 文件存储 CephFS

06 - 文件存储 CephFS

6.1 CephFS 概述

CephFS(Ceph File System) 是一个基于 RADOS 的 POSIX 兼容文件系统,通过 MDS(Metadata Server) 管理元数据,数据存储在 RADOS 中。

CephFS 架构

┌───────────────────────────────────────────┐
│              CephFS 客户端                │
│   (libcephfs / FUSE / 内核驱动)           │
└──────────┬───────────────┬────────────────┘
           │ 元数据请求     │ 数据请求
           ↓               ↓
    ┌──────────┐    ┌──────────────┐
    │   MDS    │    │    RADOS     │
    │ (元数据) │    │  (文件数据)  │
    └──────────┘    └──────────────┘
    管理目录结构      存储实际文件内容
    文件属性/权限

适用场景

场景说明
共享文件存储多节点同时读写同一目录
日志收集多节点写入日志到共享目录
机器学习训练数据共享存储
Web 应用共享静态资源和上传文件
HPC高性能计算共享存储

6.2 部署 MDS

# cephadm 方式部署
ceph fs volume create myfs --placement="3 node1 node2 node3"

# 这会自动创建:
# 1. 数据池 (myfs-data)
# 2. 元数据池 (myfs-metadata)
# 3. MDS 服务

# 手动部署
ceph osd pool create cephfs-data 256 256 replicated
ceph osd pool create cephfs-metadata 128 128 replicated
ceph fs new myfs cephfs-metadata cephfs-data

# 查看文件系统状态
ceph fs ls
ceph fs status myfs

# 查看 MDS 状态
ceph mds stat

输出示例:

myfs:1 {0=node1=up:active} 2 up:standby

6.3 CephFS 挂载方式

方式一:内核驱动挂载

# 获取 admin 密钥
ceph auth get-key client.admin > /tmp/ceph.admin.key

# 使用 mount 命令
sudo mount -t ceph node1:6789,node2:6789,node3:6789:/ /mnt/cephfs \
    -o name=admin,secretfile=/tmp/ceph.admin.key

# 验证挂载
df -h /mnt/cephfs
ls -la /mnt/cephfs/

# 写入 /etc/fstab 实现开机自动挂载
echo "node1:6789,node2:6789,node3:6789:/ /mnt/cephfs ceph name=admin,secretfile=/tmp/ceph.admin.key,noatime,_netdev 0 0" | sudo tee -a /etc/fstab

方式二:FUSE 挂载

# 安装 ceph-fuse
sudo apt install -y ceph-fuse

# FUSE 挂载
sudo ceph-fuse -m node1:6789,node2:6789,node3:6789 /mnt/cephfs

# 使用配置文件
sudo ceph-fuse /mnt/cephfs --conf /etc/ceph/ceph.conf

# /etc/fstab
# none /mnt/cephfs fuse.ceph ceph.conf=/etc/ceph/ceph.conf,_netdev 0 0

内核挂载 vs FUSE 挂载

对比项内核驱动FUSE
性能较低(用户态切换)
稳定性
安装要求内核模块ceph-fuse 包
权限需要 root可用普通用户
功能基础功能完整功能
推荐✅ 生产环境开发/测试

6.4 CephFS 授权用户

# 创建专用的 CephFS 用户(最小权限原则)
ceph auth get-or-create client.cephfsuser \
    mon 'allow r' \
    mds 'allow rw path=/myfs/userdata' \
    osd 'allow rw pool=cephfs-data' \
    mgr 'allow r'

# 查看用户权限
ceph auth get client.cephfsuser

# 使用专用用户挂载
ceph auth get-key client.cephfsuser > /tmp/cephfs.key
sudo mount -t ceph node1:6789:/ /mnt/userdata \
    -o name=cephfsuser,secretfile=/tmp/ceph.key,fs=myfs

6.5 子卷(Subvolume)管理

子卷是 CephFS 中的逻辑隔离单元,类似于目录配额。

# 创建子卷组
ceph fs subvolumegroup create myfs mygroup

# 创建子卷(带配额)
ceph fs subvolume create myfs myvol mygroup --size 10737418240  # 10GB

# 创建不带配额的子卷
ceph fs subvolume create myfs unlimited-vol mygroup

# 列出子卷
ceph fs subvolume ls myfs mygroup

# 查看子卷信息
ceph fs subvolume info myfs myvol mygroup

# 获取子卷路径(用于挂载)
ceph fs subvolume getpath myfs myvol mygroup
# 输出: /volumes/mygroup/myvol

# 调整子卷大小
ceph fs subvolume resize myfs myvol mygroup --size 21474836480  # 20GB

# 删除子卷
ceph fs subvolume rm myfs myvol mygroup

子卷快照

# 创建子卷快照
ceph fs subvolume snapshot create myfs myvol mysnap mygroup

# 列出快照
ceph fs subvolume snapshot ls myfs myvol mygroup

# 恢复快照
ceph fs subvolume snapshot clone myfs myvol mysnap myvol-restored --group-name mygroup

# 删除快照
ceph fs subvolume snapshot rm myfs myvol mysnap mygroup

6.6 CephFS 配额

目录级配额

# 设置目录配额(使用 CephFS 扩展属性)
sudo setfattr -n ceph.quota.max_bytes -v 10737418240 /mnt/cephfs/mydir    # 10GB
sudo setfattr -n ceph.quota.max_files -v 100000 /mnt/cephfs/mydir         # 10万个文件

# 查看配额
sudo getfattr -n ceph.quota.max_bytes /mnt/cephfs/mydir
sudo getfattr -n ceph.quota.max_files /mnt/cephfs/mydir

# 取消配额
sudo setfattr -n ceph.quota.max_bytes -v 0 /mnt/cephfs/mydir
sudo setfattr -n ceph.quota.max_files -v 0 /mnt/cephfs/mydir

6.7 CephFS 快照

# 创建快照目录(如果未启用自动快照)
mkdir /mnt/cephfs/.snap/my-snapshot-$(date +%Y%m%d)

# 查看快照
ls /mnt/cephfs/.snap/

# 从快照恢复文件
cp /mnt/cephfs/.snap/my-snapshot-20260510/important.txt /tmp/recovered.txt

# 删除快照
rmdir /mnt/cephfs/.snap/my-snapshot-20260510

6.8 多活 MDS 配置

多活 MDS 可以提升 CephFS 的元数据处理性能。

# 查看当前 MDS 数量
ceph fs get myfs | grep max_mds

# 设置最大活跃 MDS 数量(如 3 个节点各运行 1 个活跃 MDS)
ceph fs set myfs max_mds 3

# 查看 MDS 状态
ceph fs status myfs

# 输出示例:
# myfs - 3 clients
# =====
# Rank  State       MDS       Activity  dns    inos   caps   repl  reads  requests
#  0    active      node1     Reqs:    100/s  5000   5000   500   10     100/s
#  1    active      node2     Recs:     50/s  3000   3000   300   5      50/s
#  2    active      node3     Reqs:     75/s  4000   4000   400   8      75/s

# 降级回单 MDS
ceph fs set myfs max_mds 1

注意事项

  • 多活 MDS 适用于元数据密集型负载(大量小文件)
  • Rank 0 是主 MDS,其他 Rank 分担子目录的元数据
  • 需要至少与 max_mds 数量相同的 standby MDS

6.9 业务场景

场景一:NFS 导出 CephFS

# 使用 NFS-Ganesha 将 CephFS 导出为 NFS
# cephadm 方式
ceph nfs cluster create mynfs --placement="2 node1 node2"
ceph nfs export create cephfs myfs mynfs /share --fsname=myfs

# 客户端挂载 NFS
sudo mount -t nfs node1:/share /mnt/nfs-share

场景二:机器学习数据共享

# 创建训练数据目录并设置配额
mkdir -p /mnt/cephfs/ml/datasets
sudo setfattr -n ceph.quota.max_bytes -v 1099511627776 /mnt/cephfs/ml/datasets  # 1TB

# 创建快照用于版本管理
mkdir /mnt/cephfs/.snap/dataset-v1.0

# 多个训练节点同时读取
# node-a: mount -t ceph ... /data → 读取 /ml/datasets
# node-b: mount -t ceph ... /data → 读取 /ml/datasets

6.10 CephFS 性能调优

# 调整 MDS 缓存大小
ceph config set mds mds_cache_memory_limit 8589934592  # 8GB

# 调整 MDS 日志大小
ceph config set mds mds_log_max_segments 256

# 禁用不必要的 POSIX 锁
ceph config set mds mds_enforce_unique_names false

# 客户端缓存调整
mount -t ceph ... /mnt -o rsize=65536,wsize=65536,name=admin,secretfile=key

扩展阅读

  1. CephFS 官方文档
  2. CephFS 子卷管理
  3. NFS-Ganesha CephFS
  4. CephFS 多活 MDS

下一章07 - 对象存储 RGW — 学习 RGW 对象存储网关的配置、S3 兼容接口、用户管理和桶策略。