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
扩展阅读
下一章:07 - 对象存储 RGW — 学习 RGW 对象存储网关的配置、S3 兼容接口、用户管理和桶策略。