20260602 Ceph 文件系统

📅 2026/7/3 3:51:08 👁️ 阅读次数 📝 编程学习
20260602 Ceph 文件系统

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 的流程

  1. 客户端向 MON 认证并获取集群映射(cluster map)。
  2. 客户端查询集群映射获取 Active MDS 列表。
  3. 客户端向 Active MDS 发送元数据请求(如 lookup/home/user/file.txt)。
  4. MDS 返回该文件对应的 inode 及数据所在 OSD 位置信息。
  5. 客户端直接与 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 32
2.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 mds

2.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:standby

3.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 500000

4. 挂载 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.keyring

4.3 使用 Kernel 客户端挂载

挂载整个文件系统

bash

mkdir /mnt/cephfs1 mount.ceph ceph1.whisky.cloud:/ /mnt/cephfs1 -o name=cephfs_user,fs=cephfs1
  • ceph1.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.txt

5. 管理 CephFS 快照

CephFS 支持目录级别的快照,快照存储在目录下的.snap隐藏目录中。快照功能默认启用。

5.1 启用/禁用快照功能

bash

# 禁用快照(禁止创建新快照) ceph fs set cephfs1 allow_new_snaps false # 启用快照 ceph fs set cephfs1 allow_new_snaps true

5.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/snapshot1

5.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 status

6.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-mirror

7. 第六期归纳总结(一览表)

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>
部署 MDSceph 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>
启用 mirrorceph fs snapshot mirror enable <fs_name>
导入 mirror tokenceph 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-commonceph-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)均已完整覆盖。后续可根据实际业务场景,结合前三期的配置管理、认证授权、监控告警等内容,构建完整的企业级存储解决方案。