Ceph系列第六期:Ceph 文件系统(CephFS)精讲

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

相关推荐
我爱C编程1 小时前
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
网络·matlab·ecc·密钥管理·无线传感器网络·簇内分组
萤萤七悬1 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
Land03291 小时前
RPA网页自动化:元素定位失效的7种根因与XPath鲁棒性改造方案
运维·selenium·自动化·rpa
Starry-sky(jing)1 小时前
# Linux 下 Qt 应用无障碍自动化:记一次wx无人值守系统的架构演进
linux·qt·自动化
荒--2 小时前
apt dpkg 命令详解
linux·服务器
zh_yt2 小时前
auto-connect remote ssh server
运维·ssh
Lumbrologist2 小时前
【零基础部署】Docker 部署 AutoGen 多 Agent 对话框架保姆级教程
运维·docker·容器
Sagittarius_A*2 小时前
H3CSE 高性能园区网:园区网安全体系详解
网络·计算机网络·安全·h3cse
嵌入式小能手2 小时前
飞凌嵌入式ElfBoard-进程间的通信之信号的发送alarm
linux