Ceph系列第六期:Ceph 文件系统(CephFS)精讲
本期目标
- 理解 CephFS 的架构、MDS 角色及与其他存储类型的区别
- 掌握两种部署 CephFS 的方法:手动创建池/文件系统和
ceph fs volume快速部署 - 学习 MDS 服务的扩展与管理(多活/备用)
- 熟练使用 Kernel 客户端(krbd 风格)和 FUSE 客户端挂载 CephFS
- 实现子目录挂载、权限细化及开机自动挂载
- 管理 CephFS 快照(创建、恢复、删除)
- 了解并初步配置 CephFS Mirror 跨集群异步复制
前置要求:已完成第二期集群部署,理解 Cephx 认证(第三期),建议已完成第四期 RBD 和第五期 RGW 的实践。
1. CephFS 简介
CephFS(Ceph File System)是一个构建在 RADOS 之上的兼容 POSIX 的分布式文件系统。它允许用户像使用传统文件系统(如 ext4、XFS)一样创建目录、文件,并设置权限、时间戳等元数据。
1.1 与其他存储类型的对比
| 特性 | 块存储(RBD) | 文件存储(CephFS) | 对象存储(RGW) |
|---|---|---|---|
| 数据模型 | 固定大小块 | 目录树 + 文件 | 扁平桶 + 对象 |
| 元数据管理 | 无(文件系统格式由客户端负责) | MDS 管理 | RGW 管理(用户/桶/对象键) |
| 访问协议 | Linux 块设备(rbd) | POSIX (NFS/FUSE/Kernel) | HTTP (S3/Swift) |
| 典型场景 | 虚拟机磁盘、数据库 | 共享文件存储、HPC、容器持久化 | 海量非结构化数据、备份 |
1.2 核心组件:MDS(元数据服务器)
CephFS 依赖MDS(Metadata Server)来管理目录结构和文件元数据(文件名、权限、大小、时间戳、扩展属性等)。
- Active MDS:处理来自客户端的元数据请求(lookup、open、readdir、setattr 等)。
- Standby MDS:热备,当 Active MDS 故障时自动接管,保证高可用。
- 多活 MDS:从 Luminous 版本开始支持多个 Active MDS,将元数据负载分散,提升性能。
MDS 将元数据存储为 RADOS 对象,保存在专用的元数据池(metadata pool)中;文件数据则保存在数据池(data pool)中。
1.3 客户端访问 CephFS 的流程
- 客户端向 MON 认证并获取集群映射(cluster map)。
- 客户端查询集群映射获取 Active MDS 列表。
- 客户端向 Active MDS 发送元数据请求(如 lookup
/home/user/file.txt)。 - MDS 返回该文件对应的 inode 及数据所在 OSD 位置信息。
- 客户端直接与 OSD 通信读写数据(数据路径不经过 MDS)。
2. 部署 CephFS
2.1 准备工作
- 已有一个正常运行的 Ceph 集群(至少一个 MON、MGR、若干 OSD)。
- 需要至少两个存储池:一个用于元数据(metadata),一个用于数据(data)。元数据池建议使用较高副本级别(如 3 副本)以保证可靠性。
- 可以创建多个数据池,通过文件布局或目录布局将不同数据放置在不同池中(如热数据放 SSD 池、冷数据放 HDD 池)。
CephFS 支持两种部署方式:
- 手动部署:完全控制每个步骤,适合精细调整。
- 卷(volume)部署:使用
ceph fs volume命令一键创建,简单快速,但灵活性较低。
2.2 手动部署 CephFS
2.2.1 创建存储池
bash
# 创建元数据池,建议设置较高的副本数(此处设为3) ceph osd pool create cephfs.meta 32 32 ceph osd pool set cephfs.meta size 3 # 创建数据池(默认副本数为 osd_pool_default_size,通常为3) ceph osd pool create cephfs.data 32 322.2.2 创建文件系统
bash
ceph fs new cephfs1 cephfs.meta cephfs.data其中cephfs1是文件系统名称,cephfs.meta是元数据池,cephfs.data是默认数据池。
2.2.3 添加额外的数据池(可选)
bash
ceph osd pool create cephfs.data.2 32 32 ceph fs add_data_pool cephfs1 cephfs.data.2添加后,可以通过设置布局(layout)或目录的ceph.dir.layout.pool扩展属性将特定目录的数据写入不同池。
2.2.4 部署 MDS 服务(使用 cephadm)
bash
# 在三个节点上各部署一个 MDS 实例,其中只有一个会成为 Active,其他为 Standby ceph orch apply mds cephfs1 --placement="3 ceph1.whisky.cloud ceph2.whisky.cloud ceph3.whisky.cloud"2.2.5 验证部署
bash
# 查看文件系统列表 ceph fs ls # 查看 MDS 状态 ceph mds stat # 查看 MDS 服务进程 ceph orch ps --daemon-type mds2.3 卷部署 CephFS(推荐新手或快速环境)
bash
# 创建一个名为 cephfs2 的文件系统,自动创建元数据池和数据池,并部署 3 个 MDS 实例 ceph fs volume create cephfs2 --placement="3 ceph1.whisky.cloud ceph2.whisky.cloud ceph3.whisky.cloud"该命令会自动完成池创建、文件系统创建、MDS 部署等所有步骤。
2.4 删除 CephFS
删除前请务必备份所有数据!删除操作不可逆。
bash
# 1. 先停止 MDS 服务(可选,但建议先删除服务) ceph orch rm mds.cephfs1 # 2. 将文件系统标记为 down ceph fs set cephfs1 down true # 3. 删除文件系统 ceph fs rm cephfs1 --yes-i-really-mean-it # 4. 删除池(需先开启池删除允许) ceph config set mon mon_allow_pool_delete true ceph osd pool rm cephfs.meta cephfs.meta --yes-i-really-really-mean-it ceph osd pool rm cephfs.data cephfs.data --yes-i-really-really-mean-it卷部署的文件系统同样可以使用
ceph fs volume rm cephfs2 --yes-i-really-mean-it删除。
3. 管理 MDS
3.1 查看 MDS 状态
bash
ceph mds stat # 输出示例:cephfs1:1 {0=cephfs1.ceph1.hazpoq=up:active} 2 up:standby3.2 设置多活 MDS
默认每个文件系统只有一个 Active MDS。通过修改max_mds参数可以增加 Active 数量,从而分摊元数据负载。
bash
# 设置最大活动 MDS 数量为 2 ceph fs set cephfs1 max_mds 2 # 查看当前活动 MDS ceph fs status cephfs1注意:增加
max_mds后,新的 Active MDS 会自动从 Standby 中选取。如果没有足够 Standby,需要先部署更多 MDS 实例。
3.3 减少 Active MDS
bash
ceph fs set cephfs1 max_mds 1多余的 Active MDS 会降级为 Standby。
3.4 MDS 缓存调优
bash
# 设置 MDS 内存缓存上限(字节),默认 4GB ceph config set mds mds_cache_memory_limit 8589934592 # 8GB # 设置 inode 缓存数量上限 ceph config set mds mds_cache_size 5000004. 挂载 CephFS
CephFS 支持两种客户端挂载方式:
- Kernel 客户端(推荐):性能好,但暂不支持配额(Quota)功能。
- FUSE 客户端:功能更全(支持配额、ACL),但性能稍低于内核模块。
两种方式都需要客户端安装ceph-common包(FUSE 还需要ceph-fuse)。
4.1 准备客户端环境
bash
# 在客户端节点(例如 client.whisky.cloud)安装 dnf install -y ceph-common # 从 ceph1 复制配置文件和密钥环(以 admin 用户为例) scp root@ceph1:/etc/ceph/ceph.conf /etc/ceph/ scp root@ceph1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/4.2 创建受限用户(推荐)
为特定目录授予细粒度权限,避免使用 admin 挂载。
bash
# 在 ceph1 上执行 # 授权 client.cephfs_user 对整个文件系统拥有读写权限(整个根目录) ceph fs authorize cephfs1 client.cephfs_user / rwps # 授权 client.cephfs_restricted 只能读根目录,并读写 /dir2 子目录 ceph fs authorize cephfs1 client.cephfs_restricted / r /dir2 rw # 导出的密钥环会自动保存到 /etc/ceph/ceph.client.cephfs_restricted.keyring4.3 使用 Kernel 客户端挂载
挂载整个文件系统
bash
mkdir /mnt/cephfs1 mount.ceph ceph1.whisky.cloud:/ /mnt/cephfs1 -o name=cephfs_user,fs=cephfs1ceph1.whisky.cloud为任意一个 MON 地址(可多个用逗号分隔)。name指定 Cephx 用户。fs指定文件系统名称(若有多个文件系统时必须指定)。
挂载特定子目录
bash
mkdir /mnt/cephfs_sub mount.ceph ceph1.whisky.cloud:/dir2 /mnt/cephfs_sub -o name=cephfs_restricted,fs=cephfs1开机自动挂载(/etc/fstab)
bash
ceph1.whisky.cloud:/ /mnt/cephfs1 ceph name=cephfs_user,fs=cephfs1,_netdev 0 0
_netdev选项告知 systemd 网络准备好后再挂载。
4.4 使用 FUSE 客户端挂载
首先安装ceph-fuse:
bash
dnf install -y ceph-fuse挂载整个文件系统
bash
ceph-fuse -n client.cephfs_user /mnt/cephfs1挂载特定子目录(使用-r选项)
bash
ceph-fuse -n client.cephfs_restricted -r /dir2 /mnt/cephfs_sub指定文件系统名称(当存在多个文件系统时)
bash
ceph-fuse -n client.cephfs_user --client_fs cephfs1 /mnt/cephfs1开机自动挂载(/etc/fstab)
bash
ceph1.whisky.cloud /mnt/cephfs1 fuse.ceph ceph.id=cephfs_user,_netdev 0 0注意:FUSE 方式持久化时不支持挂载子目录,只能挂载根目录。
4.5 验证挂载
bash
df -h /mnt/cephfs1 # 应显示类似 192.168.108.11:/ 57G 0 57G 0% /mnt/cephfs1 # 写入测试文件 echo "Hello CephFS" > /mnt/cephfs1/hello.txt5. 管理 CephFS 快照
CephFS 支持目录级别的快照,快照存储在目录下的.snap隐藏目录中。快照功能默认启用。
5.1 启用/禁用快照功能
bash
# 禁用快照(禁止创建新快照) ceph fs set cephfs1 allow_new_snaps false # 启用快照 ceph fs set cephfs1 allow_new_snaps true5.2 创建快照
在需要快照的目录下创建一个子目录在.snap中即可:
bash
# 假设挂载点为 /mnt/cephfs1 mkdir /mnt/cephfs1/.snap/snapshot1该操作会立即创建该目录及其所有子内容的只读快照。
注意:普通用户默认没有权限创建快照,需要 MDS 权限中包含
s。使用ceph fs authorize时加上s即可。
5.3 恢复文件
从快照目录中复制文件到原位置或其他位置:
bash
cp /mnt/cephfs1/.snap/snapshot1/deleted_file.txt /mnt/cephfs1/5.4 删除快照
删除.snap下的子目录即可删除快照(即使快照目录不为空也使用rmdir而非rm -rf):
bash
rmdir /mnt/cephfs1/.snap/snapshot15.5 快照的限制
- 快照是只读的,无法修改。
- 大量快照会消耗额外的存储空间,因为 COW 会保留变更前的对象。
- 建议定期清理无用快照。
6. CephFS Mirror(跨集群异步复制)
CephFS Mirror 是 Ceph Pacific(v16.2.0)引入的功能,用于在两个 Ceph 集群之间异步镜像文件系统的数据,主要用于灾难恢复。
前提:
- 源集群和目标集群均运行 Ceph Pacific 或更高版本。
- 两个集群中均已创建 CephFS 文件系统(名称可以不同,但配置时需要指定)。
- 网络互通。
6.1 在源集群和目标集群分别创建 CephFS
bash
# 源集群(ceph1) ceph fs volume create cephfs --placement="1 ceph1.whisky.cloud" # 目标集群(ceph4) ceph fs volume create cephfs --placement="1 ceph4.whisky.cloud"6.2 配置 CephFS Mirror
步骤1:在源集群部署 cephfs-mirror 守护进程
bash
ceph orch apply cephfs-mirror ceph1.whisky.cloud该操作会创建一个名为client.cephfs-mirror.<unique>的用户,具有必要的权限。
步骤2:在目标集群创建专门用于同步的 Cephx 用户
bash
ceph fs authorize cephfs client.cephfs-mirror / rwps记录该用户的密钥。
步骤3:在两个集群上启用 mirroring 模块
bash
# 源和目标分别执行 ceph mgr module enable mirroring步骤4:在源集群文件系统上启用 mirroring
bash
ceph fs snapshot mirror enable cephfs步骤5:在目标集群生成引导 token(bootstrap token)
bash
ceph fs snapshot mirror peer_bootstrap create cephfs client.cephfs-mirror backup-site该命令输出一个 JSON 格式的 token,内容较长。
步骤6:在源集群导入 token
bash
ceph fs snapshot mirror peer_bootstrap import cephfs '<token-string>'步骤7:指定需要镜像的目录(可选,若不指定则整个文件系统镜像)
bash
ceph fs snapshot mirror add cephfs /important_dir步骤8:验证同步状态
bash
# 在源集群查看对等关系 ceph fs snapshot mirror peer_list cephfs # 在目标集群查看同步状态 radosgw-admin sync status # 此命令也适用于 RGW,CephFS 专用命令尚未统一,可使用 ceph fs status6.3 测试同步
在源集群挂载 CephFS,写入数据:
bash
# 源集群 mount.ceph ceph1.whisky.cloud:/ /mnt/cephfs_src -o name=admin mkdir /mnt/cephfs_src/important_dir echo "Hello mirror" > /mnt/cephfs_src/important_dir/hello.txt # 等待片刻后,在目标集群挂载查看 mount.ceph ceph4.whisky.cloud:/ /mnt/cephfs_dst -o name=admin ls /mnt/cephfs_dst/important_dir/6.4 清理 CephFS Mirror
bash
# 移除镜像目录 ceph fs snapshot mirror remove cephfs /important_dir # 禁用文件系统上的 mirror ceph fs snapshot mirror disable cephfs # 删除对等关系(需获取 peer uuid) ceph fs snapshot mirror peer_list cephfs ceph fs snapshot mirror peer_remove cephfs <uuid> # 删除 cephfs-mirror 服务 ceph orch rm cephfs-mirror7. 第六期归纳总结(一览表)
7.1 关键命令速查
| 操作 | 命令 |
|---|---|
| 手动创建元数据池 | ceph osd pool create <pool_name> <pg_num> |
| 手动创建数据池 | ceph osd pool create <pool_name> <pg_num> |
| 创建文件系统 | ceph fs new <fs_name> <meta_pool> <data_pool> |
| 卷方式创建文件系统 | ceph fs volume create <fs_name> --placement="<count> <hosts>" |
| 添加数据池 | ceph fs add_data_pool <fs_name> <pool_name> |
| 部署 MDS | ceph orch apply mds <fs_name> --placement="..." |
| 查看文件系统列表 | ceph fs ls |
| 查看 MDS 状态 | ceph mds stat/ceph fs status <fs_name> |
| 设置多活 MDS 数量 | ceph fs set <fs_name> max_mds <num> |
| 删除文件系统 | ceph fs rm <fs_name> --yes-i-really-mean-it |
| Kernel 挂载 | mount.ceph <mon_ip>:/ <mountpoint> -o name=<user>,fs=<fs_name> |
| FUSE 挂载 | ceph-fuse -n client.<user> <mountpoint> |
| 挂载子目录(Kernel) | mount.ceph <mon_ip>:/<subdir> <mountpoint> ... |
| 挂载子目录(FUSE) | ceph-fuse -n client.<user> -r <subdir> <mountpoint> |
| 授权用户 | ceph fs authorize <fs_name> client.<user> <path> <perms> |
| 创建快照 | mkdir <mountpoint>/.snap/<snapname> |
| 删除快照 | rmdir <mountpoint>/.snap/<snapname> |
| 启用 mirror | ceph fs snapshot mirror enable <fs_name> |
| 导入 mirror token | ceph fs snapshot mirror peer_bootstrap import <fs_name> <token> |
7.2 MDS 权限字符串含义
| 权限字符 | 含义 |
|---|---|
r | 读取文件和目录元数据(列出、查看属性) |
w | 写入(创建、删除、重命名、修改属性) |
p | 允许设置布局(layout)和配额(quota) |
s | 允许创建快照(.snap目录) |
组合示例:rwps表示完全读写+布局+快照权限。
7.3 Kernel 客户端 vs FUSE 客户端对比
| 特性 | Kernel 客户端 | FUSE 客户端 |
|---|---|---|
| 性能 | 高(内核态) | 中等(用户态) |
| 配额支持 | 否 | 是 |
| ACL 支持 | 部分 | 是(需显式启用) |
| 子目录挂载 | 支持 | 支持(-r选项) |
| 依赖软件 | ceph-common | ceph-common+ceph-fuse |
| 生产推荐 | 通用场景,性能优先 | 需要配额/ACL 场景 |
7.4 常见故障与处理
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 挂载超时 | MON 地址错误或防火墙 | 检查网络和端口(3300/6789) |
| 权限拒绝 | Cephx 用户未授权对应路径 | 使用ceph fs authorize重新授权 |
MDS 为up:standby但不活跃 | max_mds不足 | 增加max_mds或检查是否有活跃 MDS |
| 快照创建失败 | 用户缺少s权限 | 修改 caps 添加s |
| CephFS Mirror 不同步 | 网络不通或 token 过期 | 检查网络,重新生成 token |
8. 本期小结
- CephFS 提供 POSIX 兼容的分布式文件系统,通过 MDS 管理元数据,数据直接存储在 RADOS。
- 部署方式分为手动(精细控制)和卷部署(快速),推荐生产环境手动部署以优化池配置。
- MDS 支持多活和热备,可通过
max_mds提高元数据性能。 - 客户端支持 Kernel 和 FUSE 两种挂载方式,各有优缺点,可根据需求选择。
- 快照功能基于
.snap目录,可轻松实现文件级恢复。 - CephFS Mirror 实现跨集群异步复制,是灾备的有效手段(Pacific 版本及以上)。
至此,Ceph 三大存储接口(RBD、RGW、CephFS)均已完整覆盖。后续可根据实际业务场景,结合前三期的配置管理、认证授权、监控告警等内容,构建完整的企业级存储解决方案。