Ceph 分布式存储 文件系统存储管理
摘要
本文全面介绍了 Ceph 分布式存储系统中的文件系统存储管理(CephFS)。主要内容包括:
1. CephFS 基础概念
- CephFS 简介:基于 Ceph 存储构建的 POSIX 兼容文件系统,支持多活动 MDS 和高可用配置。
- 存储方式对比:详细对比了基于文件、基于块和基于对象三种存储方式的特性与适用场景。
- 元数据服务器(MDS):负责管理目录层次结构和文件元数据,支持活动/备用运行模式,提供缓存一致性管理。
- 客户端访问流程:从 MON 认证到 MDS 获取元数据,最终直接与 OSD 通信的完整访问路径。
2. CephFS 部署与管理
- 部署方式:支持手动部署(精细控制)和卷部署(快速简便)两种方式。
- 文件系统创建与删除:详细步骤包括池创建、MDS 服务部署、文件系统创建及安全删除流程。
- 挂载方式:支持 Kernel 挂载(高性能)和 FUSE 挂载(支持配额和 ACL),包含用户权限管理、客户端准备和具体挂载示例。
- 快照管理:快照功能的启用/禁用、创建、使用和删除,以及权限配置方法。
3. 高级功能:CephFS Mirror
- 镜像功能:从 Ceph Pacific (v16.2.0) 开始支持,用于集群间异步复制,实现灾难恢复和数据备份。
- 实施前提:要求源集群和目标集群均为 Pacific 或更高版本,并建立可靠网络连接。
- 同步原理:基于快照实现,首次全量同步后仅同步增量变化,减少带宽和存储开销。
- 配置步骤:从部署镜像守护进程到建立对等关系、配置同步目录的完整操作流程。
4. 核心价值
- 企业级特性:支持多文件系统、精细权限控制、快照备份、跨集群镜像等高可用功能。
- 灵活部署:提供多种部署和挂载方式,适应不同场景需求。
- 生产就绪:包含详细的命令行操作示例和最佳实践,可直接应用于生产环境。
本文通过理论讲解与实战操作相结合的方式,为读者提供了从 CephFS 基础概念到高级镜像功能的完整知识体系,是掌握 Ceph 文件系统存储管理的实用指南。
介绍 CephFS
介绍 CephFS
-
Ceph 文件系统 (CephFS) ,构建在 Ceph 存储之上,是一种兼容 POSIX 的文件系统。
-
与 RBD 和 RGW 类似,CephFS 也会作为 librados 的原生接口来实施。
-
Ceph 支持在一个集群中运行多个活动 MDS,以提高元数据性能。为保持高可用性,还可配置备用 MDS,以便在任何活动 MDS 出现故障时,接管其任务。
-
Ceph 支持在一个集群中部署多个活动的 CephFS 文件系统。部署多个 CephFS 文件系统需要运行 多个 MDS 守护进程。
不同存储方式对比
-
基于文件的存储:可以像传统文件系统一样整理用户的数据,并带有目录树层次结构。数据会保存 在文件中,文件会有一个名称并包含相关元数据,如修改时间戳、所有者和访问权限。
-
基于块的存储:提供像磁盘一样运作的存储卷,整理到大小相等的区块中。通常而言,基于块的存 储卷要么通过文件系统进行格式化,要么是像数据库一样可直接读写的应用。
-
基于对象的存储:支持将任意数据和元数据作为一个标有唯一标识符的单元存储在扁平存储池中。 用户会使用 API 来存储和检索数据,而不会作为块或在文件系统层次结构中访问数据。
元数据服务器
元数据服务器 (MDS) 负责:
-
管理目录层次结构和文件元数据(如所有者、时间戳和权限模式等),提供 CephFS 客户端访问 RADOS 对象所需的信息。
-
访问客户端缓存,并维护客户端缓存一致性。
MDS 以两种运行模式:
-
活动 MDS, 负责管理 CephFS 文件系统上的元数据。
-
备用 MDS, 充当备份,并会在活动 MDS 无响应时切换到活动模式。
CephFS 文件系统至少需要一个活跃的 MDS 服务,最好再部署一个备用 MDS 以确保可用性。
MDS 配置选项:
-
MDS 等级,设置集群中活动 MDS 守护进程的最大数量,由 max_mds 定义。MDS 守护进程在启 动时没有等级,MON 守护进程负责为它们分配1个等级,也就是集群中只有一个活动 MDS。
-
卷、子卷和子卷组:
-
CephFS 卷,对应一个 CephFS 文件系统。
-
CephFS 子卷,对应 CephFS 文件系统子目录。在创建子卷时,用户可指定更细致的权限管 理,如子卷的 UID、GID、文件模式、大小和子卷组。
-
CephFS 子卷组,对应一组子卷。
-
-
文件系统关联性,将用户的 CephFS 文件系统配置为首选某一个 MDS。例如,用户可配置为首选 在速度更快的服务器上运行的 MDS。文件系统关联性通过 mds_join_fs 选项进行配置。
-
MDS 缓存大小限制,通过 mds_cache_memory_limit 选项限制最大内存,mds_cache_size 选 项定义最大索引节点数,以限制 MDS 缓存的大小。
-
配额,配置用户的 CephFS 文件系统,以限制使用配额存储的字节数或文件数。FUSE 和Kernel 客 户端都支持在挂载 CephFS 文件系统时检查配额。这些客户端还负责在用户达到配额限值时,停止 向 CephFS 文件系统写入数据。使用 setfattr 命令的 ceph.quota.max_bytes 和 ceph.quota.max_files 选项可设置限值。
客户端访问 CephFS 过程
-
CephFS 客户端首先会联系 MON 进行身份验证并检索集群映射。
-
完成上一步后,客户端从集群映射中获取到活动 MDS信息。
-
客户端向活动 MDS 索取文件元数据。
-
然后客户端直接与 OSD 通信,使用元数据来访问文件或目录。
部署 CephFS
部署 CephFS 方法:
-
手动部署,步骤多,可以控制每个步骤。
-
卷部署,步骤少,简单方便,无法控制每个步骤。
手动部署 CephFS
部署 CephFS 流程:
-
创建所需池
-
创建 CephFS 文件系统
-
部署 MDS 守护进程
创建 CephFS
要创建 CephFS 文件系统,首先至少要创建两个池,一个用于存储 CephFS 数据,另一个用于存储 CephFS 元数据。这两个池的默认名称分别为 cephfs_data 和 cephfs_meta。
bash
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.data.1
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.meta
元数据池用于存储文件的位置信息,所以为此池设置更高的复本级别,以避免出现数据错误,导致数据 无法访问。CephFS 默认使用复制数据池,也支持使用纠删代码数据池。
bash
[root@ceph1 ~]# ceph osd pool set cephfs.cephfs1.meta size 3
使用 ceph fs new 命令来创建文件系统:
bash
[root@ceph1 ~]# ceph fs new cephfs1 cephfs.cephfs1.meta cephfs.cephfs1.data.1
要将现有池添加为 CephFS 文件系统中的数据池,请使用 ceph fs add_data_pool。
bash
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.data.2
[root@ceph1 ~]# ceph fs add_data_pool cephfs1 cephfs.cephfs1.data.2
部署 MDS 服务
bash
[root@ceph1 ~]# ceph orch apply mds cephfs1 --placement="3 ceph1.laogao.cloud ceph2.laogao.cloud ceph3.laogao.cloud"
验证 MDS 服务部署
bash
# 查看Ceph文件系统清单
[root@ceph1 ~]# ceph fs ls
name: cephfs1, metadata pool: cephfs.cephfs1.meta, data pools: [cephfs.cephfs1.data.1 cephfs.cephfs1.data.2 ]
# 查看文件系统详细状态
[root@ceph1 ~]# ceph fs status cephfs1
cephfs1 - 0 clients
=======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active cephfs1.ceph1.hazpoq Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs.cephfs1.meta metadata 96.0k 56.1G
cephfs.cephfs1.data.1 data 0 56.1G
cephfs.cephfs1.data.2 data 0 56.1G
STANDBY MDS
cephfs1.ceph3.kjpzae
cephfs1.ceph2.fdudvc
MDS version: ceph version 16.2.15 (618f440892089921c3e944a991122ddc44e60516) pacific (stable)
# 查看集群存储与存储池占用情况
[root@ceph1 ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 180 GiB 177 GiB 2.6 GiB 2.6 GiB 1.42
TOTAL 180 GiB 177 GiB 2.6 GiB 2.6 GiB 1.42
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
1 1 0 B 0 0 B 0 56 GiB device_health_metrics
3 32 0 B 0 0 B 0 56 GiB cephfs.cephfs1.data.1
4 32 2.3 KiB 22 96 KiB 0 56 GiB cephfs.cephfs1.meta
5 32 0 B 0 0 B 0 56 GiB cephfs.cephfs1.data.2
# 快速查看MDS运行拓扑
[root@ceph1 ~]# ceph mds stat
cephfs1:1 {0=cephfs1.ceph1.hazpoq=up:active} 2 up:standby
# 查看Orchestrator管理的MDS服务实例
[root@ceph1 ~]# ceph orch ls mds
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mds.cephfs1 3/3 6m ago 6m ceph1.laogao.cloud;ceph2.laogao.cloud;ceph3.laogao.cloud;count:3
删除 CephFS
删除流程如下:
-
删除服务
-
删除文件系统
-
删除池
删除过程如下:
bash
# 删除MDS编排服务
[root@ceph1 ~]# ceph orch rm mds.cephfs1
Removed service mds.cephfs1
# 重要警告
# 如果需要删除 CephFS,请先备份所有数据,
# 删除 CephFS 文件系统会销毁该文件系统内全部数据!
# 1. 将文件系统标记为 down
[root@ceph1 ~]# ceph fs set cephfs1 down true
cephfs1 marked down.
# 2. 删除CephFS文件系统
[root@ceph1 ~]# ceph fs rm cephfs1 --yes-i-really-mean-it
# 3. 开启监视器允许删除存储池
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
# 4. 依次删除CephFS对应的元数据池、数据池
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.meta cephfs.cephfs1.meta --yes-i-really-really-mean-it
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.data.1 cephfs.cephfs1.data.1 --yes-i-really-really-mean-it
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.data.2 cephfs.cephfs1.data.2 --yes-i-really-really-mean-it
bash
#执行顺序不可颠倒
ceph orch rm mds服务 → ceph fs set down true → ceph fs rm → 删除pool
卷部署 CephFS
创建 CephFS
bash
# 创建CephFS文件系统,部署3个MDS实例
[root@ceph1 ~]# ceph fs volume create cephfs2 --placement="3 ceph1.laogao.cloud ceph2.laogao.cloud ceph3.laogao.cloud"
# 查看集群内文件系统列表
[root@ceph1 ~]# ceph fs ls
name: cephfs2, metadata pool: cephfs.cephfs2.meta, data pools: [cephfs.cephfs2.data ]
# 查看MDS运行状态
[root@ceph1 ~]# ceph mds stat
cephfs2:1 {0=cephfs2.ceph3.irxxar=up:active} 2 up:standby
# 查看Orchestrator编排的MDS服务
[root@ceph1 ~]# ceph orch ls mds
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mds.cephfs2 3/3 58s ago 62s ceph1.laogao.cloud;ceph2.laogao.cloud;ceph3.laogao.cloud;count:3:3
删除 CephFS
bash
[root@ceph1 ~]# ceph fs volume ls
[
{
"name": "cephfs2"
}
]
[root@ceph1 ~]# ceph fs volume rm cephfs2 --yes-i-really-mean-it
metadata pool: cephfs.cephfs2.meta data pool: ['cephfs.cephfs2.data'] removed
[root@ceph1 ~]# ceph fs ls No filesystems enabled
挂载 CephFS 文件系统
环境准备
创建 cephfs1 和 cephfs2。
bash
[root@ceph1 ~]# ceph fs volume create cephfs1 --placement="3 ceph1.laogao.cloud ceph2.laogao.cloud ceph3.laogao.cloud"
[root@ceph1 ~]# ceph fs volume create cephfs2 --placement="3 ceph1.laogao.cloud ceph2.laogao.cloud ceph3.laogao.cloud"
CephFS 挂载方式
用户可使用以下方式挂载 CephFS 文件系统:
-
Kernel 挂载,要求 Linux 内核版本达到 4 或以上,从 RHEL 8 开始可用。对于之前的内核版本,请 改用FUSE 客户端。
-
FUSE 挂载。
这两个挂载方式各有优势和劣势:
-
Kernel 挂载,不支持配额,但速度可能较快。
-
FUSE 挂载,支持配额和 ACL。 ACL 功能需要在挂载时明确指定该功能以启用。
CephFS 挂载用户
通过 ceph fs authorize 命令,可为 CephFS 文件系统中的不同用户和文件夹提供精细的访问控制。
CephFS 文件系统支持不同访问选项:
-
r:对指定文件夹的读取权限。如果未指定其他限制,则会向子文件夹授予读取权限。
-
w:对指定文件夹的写入权限。如果未指定其他限制,则会向子文件夹授予写入权限。
-
p:除了 r 和 w 功能外,客户端还需要 p 选项才能使用布局或配额。
-
s:除了 r 和 w 功能外,客户端还需要 s 选项才能创建快照。
示例1:允许用户对 / 文件夹具备读取、写入、配额和快照权限,并保存用户凭据。
bash
[root@ceph1 ~]# ceph fs authorize cephfs1 client.cephfs1-all-user / rwps > /etc/ceph/ceph.client.cephfs1-all-user.keyring
示例2:允许用户读取 / 文件夹,并提供对 /dir2 文件夹的读取、写入,并保存用户凭据。
bash
[root@ceph1 ~]# ceph fs authorize cephfs1 client.cephfs1-restrict-user / r /dir2 rw > /etc/ceph/ceph.client.cephfs1-restrict-user.keyring
CephFS 客户端挂载准备
要挂载基于 CephFS 的文件系统,请验证客户端主机是否满足以下条件:
- 安装 ceph-common 软件包。对于 FUSE 客户端,还要安装 ceph-fuse 软件包。
bash
[root@client ~]# dnf install -y ceph-common
- 复制 Ceph 配置文件到客户端。
bash
[root@ceph1 ~]# scp /etc/ceph/ceph.conf root@client:/etc/ceph/ceph.conf
- 将用户keyring复制到客户端主机上的 /etc/ceph 文件夹。
bash
[root@ceph1 ~]# scp /etc/ceph/ceph.client.{cephfs1-all-user,cephfs1-restrict- user}.keyring root@client:/etc/ceph/
为了方便管理集群,我们将admin凭据复制到client。
bash
[root@ceph1 ~]# scp /etc/ceph/ceph.client.admin.keyring root@client:/etc/ceph/
使用 Kernel 挂载 CephFS
挂载 CephFS
使用 mount.ceph 命令挂载文件系统:
bash
# mount.ceph [src] [mount-point] [-n] [-v] [-o ceph-options]
# 或者
# mount -t ceph [src] [mount-point] [-n] [-v] [-o ceph-options]
用户可以指定逗号分隔的多个 MON 来挂载设备。标准端口 (6789) 为默认值,用户也可在各个MON 名 称的后面添加冒号和非标准端口号。建议指定多个 MON,以防文件系统挂载时有些 MON 处于脱机状 态。
bash
[root@client ~]# mount.ceph
usage: mount.ceph [src] [mount-point] [-n] [-v] [-o ceph-options]
options:
-h: Print this help
-n: Do not update /etc/mtab
-v: Verbose
ceph-options: refer to mount.ceph(8)
使用 CephFS Kernel 客户端时,可用选项有:
-
fs=fs-name,指定要挂载的 CephFS 文件系统名称。未提供值时,它会使用默认文件系统。
-
name=name,指定Cephx 客户端 ID。默认为 guest。
-
secret=secret_value,指定客户端的机密密钥的值。
-
secretfile=secret_key_file,指定包含此客户端机密密钥的文件的路径。
-
rsize=bytes,指定最大读取大小,以字节为单位。
-
wsize=bytes,指定最大写入大小,以字节为单位。默认为不写入。
示例1:使用不受限账户挂载 cephfs 文件系统。
bash
# 创建挂载目录
[root@client ~]# mkdir /mnt/cephfs1
# 内核方式挂载CephFS,指定用户名与文件系统名称
[root@client ~]# mount.ceph ceph1.laogao.cloud:/ /mnt/cephfs1 -o name=cephfs1-all-user,fs=cephfs1
# 查看挂载容量信息
[root@client ~]# df -h /mnt/cephfs1
Filesystem Size Used Avail Use% Mounted on
192.168.108.11:/ 57G 0 57G 0% /mnt/cephfs1
# 创建测试目录、测试文件
[root@client ~]# mkdir /mnt/cephfs1/{dir1,dir2}
[root@client ~]# echo Hello World > /mnt/cephfs1/dir1/welcome.txt
[root@client ~]# dd if=/dev/zero of=/mnt/cephfs1/dir1/file-100M bs=1M count=100
# 树形查看目录结构
[root@client ~]# tree /mnt/cephfs1
/mnt/cephfs1
├── dir1
│ ├── file-100M
│ └── welcome.txt
└── dir2
2 directories, 2 files
# 再次查看挂载点占用
[root@client ~]# df -h /mnt/cephfs1
Filesystem Size Used Avail Use% Mounted on
192.168.108.11:/ 57G 100M 56G 1% /mnt/cephfs1
# 查看CephFS后端存储池占用
[root@client ~]# ceph fs status
cephfs1 - 1 clients
=======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active cephfs1.ceph1.hpwqgm Reqs: 0 /s 14 17 14 5
POOL TYPE USED AVAIL
cephfs.cephfs1.meta metadata 192k 55.9G
cephfs.cephfs1.data data 300M 55.9G
cephfs2 - 0 clients
=======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active cephfs2.ceph3.nwbhbl Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs.cephfs2.meta metadata 96.0k 55.9G
cephfs.cephfs2.data data 0 55.9G
STANDBY MDS
cephfs1.ceph2.notedt
cephfs1.ceph3.qxjqfe
cephfs2.ceph2.hjrvmu
cephfs2.ceph1.yursdd
MDS version: ceph version 16.2.15 (618f440892089921c3e944a991122ddc44e60516) pacific (stable)
# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1
示例2:使用受限账户挂载 cephfs 文件系统。
bash
# 使用受限用户挂载CephFS
[root@client ~]# mount.ceph ceph1.laogao.cloud:/ /mnt/cephfs1 -o name=cephfs1-restrict-user,fs=cephfs1
# 权限验证
# 尝试在dir1创建文件,权限拒绝
[root@client ~]# touch /mnt/cephfs1/dir1/cephfs1-restrict-user-file1
touch: cannot touch '/mnt/cephfs1/dir1/cephfs1-restrict-user-file1': Permission denied
# 在dir2创建文件正常
[root@client ~]# touch /mnt/cephfs1/dir2/cephfs1-restrict-user-file1
# 查看目录结构
[root@client ~]# tree /mnt/cephfs1/
/mnt/cephfs1/
├── dir1
│ ├── file-100M
│ └── welcome.txt
└── dir2
└── cephfs1-restrict-user-file1
2 directories, 3 files
# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1
挂载特定子目录
通过 CephFS Kernel 客户端,用户可从 CephFS 文件系统挂载特定子目录。
本例从 CephFS 文件系统的 root 中挂载了名为 /dir2 的目录:
bash
# 直接挂载CephFS子目录 /dir2 至本地挂载点
[root@client ~]# mount -t ceph ceph1.laogao.cloud:/dir2 /mnt/cephfs1 -o name=cephfs1-restrict-user,fs=cephfs1
# 在挂载目录创建文件
[root@client ~]# touch /mnt/cephfs1/cephfs1-restrict-user-file2
# 查看挂载点内文件
[root@client ~]# tree /mnt/cephfs1/
/mnt/cephfs1/
├── cephfs1-restrict-user-file1
└── cephfs1-restrict-user-file2
0 directories, 2 files
# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1
永久挂载文件系统
要使用Kernel 客户端永久挂载 CephFS 文件系统,可以将以下格式条目添加到 /etc/fstab 文件中:
示例:
bash
ceph1.laogao.cloud:/dir2 /mnt/cephfs1 ceph name=cephfs1-restrict- user,fs=cephfs1,_netdev 0 0
使用 FUSE 挂载 CephFS
卸载之前挂载的:
bash
[root@client ~]# umount /mnt/cephfs1
以非 root 用户身份使用 FUSE 客户端时,需在 /etc/fuse.conf 配置文件中添加 user_allow_other。
使用 FUSE 挂载 CephFS,需要额外安装ceph-fuse软件:
bash
[root@client ~]# dnf install -y ceph-fuse
挂载 CephFS
使用 FUSE 客户端挂载 CephFS 文件系统语法:
bash
[root@client ~]# ceph-fuse --help
usage: ceph-fuse [-n client.username] [-m mon-ip-addr:mon-port] <mount point> [OPTIONS]
--client_mountpoint/-r <sub_directory>
use sub_directory as the mounted root, rather than the full Ceph tree.
usage: ceph-fuse [options] <mountpoint>
FUSE options:
-h --help print help
-V --version print version
-d -o debug enable debug output (implies -f)
-f foreground operation
-s disable multi-threaded operation
-o clone_fd use separate fuse device fd for each thread (may improve performance)
-o max_idle_threads the maximum number of idle worker threads allowed (default: 10)
-o allow_other allow access by all users
-o allow_root allow access by root
-o auto_unmount auto unmount on process termination
--conf/-c FILE read configuration from the given configuration file
--id ID set ID portion of my name
--name/-n TYPE.ID set name
--cluster NAME set cluster name (default: ceph)
--setuser USER set uid to user or uid (and gid to user's gid)
--setgroup GROUP set gid to group or gid
--version show version and quit
示例:
bash
# FUSE方式挂载CephFS,指定受限客户端账号
[root@client ~]# ceph-fuse -n client.cephfs1-restrict-user /mnt/cephfs1
2025-08-26T10:13:17.021+0800 7f33347023c0 -1 init, newargv = 0x560cab629680 newargc=13
2025-08-26T10:13:17.021+0800 7f33347023c0 -1 init, args.argv = 0x560cab629830 args.argc=4
ceph-fuse[14462]: starting ceph client
ceph-fuse[14462]: starting fuse
# 查看挂载目录结构
[root@client ~]# tree /mnt/cephfs1
/mnt/cephfs1
├── dir1
│ ├── file-100M
│ └── welcome.txt
└── dir2
├── cephfs1-restrict-user-file1
└── cephfs1-restrict-user-file2
2 directories, 4 files
# 卸载挂载点
[root@client ~]# umount /mnt/cephfs1
挂载特定子目录
CephFS FUSE 客户端默认会挂载所访问文件系统的 root 目录 (/)。用户可使用 ceph-fuse -r directory 命 令挂载特定目录。如果 CephFS 卷中不存在该目录,此操作会失效。
bash
# ceph-fuse 指定子目录 /dir2 进行挂载
[root@client ~]# ceph-fuse -n client.cephfs1-restrict-user -r /dir2 /mnt/cephfs1/
2025-08-26T10:17:20.933+0800 7f46882233c0 -1 init, newargv = 0x562a8edc7c50 newargc=13
2025-08-26T10:17:20.933+0800 7f46882233c0 -1 init, args.argv = 0x562a8edc7e00 args.argc=4
ceph-fuse[16731]: starting ceph client
ceph-fuse[16731]: starting fuse
# 查看挂载目录内容
[root@client ~]# tree /mnt/cephfs1/
/mnt/cephfs1/
├── cephfs1-restrict-user-file1
└── cephfs1-restrict-user-file2
0 directories, 2 files
# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1
用户在配置多个 CephFS 文件系统时,CephFS FUSE 客户端会挂载默认的 CephFS 文件系统。要挂载特 定文件系统,使用 --client_fs 选项。
ceph-fuse -n client.cephfs1-restrict-user -r /dir2 --client_fs cephfs1 /mnt/cephfs1
永久挂载文件系统
要使用 FUSE 客户端永久挂载 CephFS 文件系统,可以将以下条目添加到 /etc/fstab 文件中:
bash
ceph1.laogao.cloud /mnt/cephfs1 fuse.ceph ceph.id=cephfs1-restrict-user,_netdev 0
注意:ceph-fuse方式持久化挂载,不支持挂载特定子目录。
管理 CephFS
实验环境准备
使用受限账户挂载 cephfs。
bash
[root@client ~]# mount.ceph ceph1.laogao.cloud:/dir2 /mnt/cephfs1 -o name=cephfs1-restrict-user,fs=cephfs1
管理快照
CephFS 默认会启用快照功能,这些快照存储在名为 .snap 的隐藏目录中。
启停快照功能
使用 ceph fs set 命令停用特定 CephFS 文件系统快照功能。
bash
[root@ceph1 ~]# ceph fs set cephfs1 allow_new_snaps false
disabled new snapshots
使用 ceph fs set 命令启用特定 CephFS 文件系统快照功能。
bash
[root@ceph1 ~]# ceph fs set cephfs1 allow_new_snaps true
enabled new snapshots
创建快照
若要创建快照,在 .snap 目录中创建一个子目录。快照名称就是新子目录名称。此快照包含 CephFS 文 件系统中所有当前文件的副本。
普通用户是没有创建快照权限的。
bash
# 尝试手动创建快照目录,权限拒绝
[root@client ~]# mkdir /mnt/cephfs1/.snap/snap
mkdir: cannot create directory '/mnt/cephfs1/.snap/snap': Permission denied
# 查看受限用户权限详情
[root@client ~]# ceph auth get client.cephfs1-restrict-user
[client.cephfs1-restrict-user]
key = AQAWEK1owPSzMhAACJqg9ZF8FBv28UdwTdEu4Q==
caps mds = "allow r fsname=cephfs1, allow rw fsname=cephfs1 path=/dir2"
caps mon = "allow r fsname=cephfs1"
caps osd = "allow rw tag cephfs data=cephfs1"
exported keyring for client.cephfs1-restrict-user
授权客户端s权限为 CephFS 文件系统制作快照。
bash
[root@client ~]# ceph auth caps client.cephfs1-restrict-user \
mds "allow r fsname=cephfs1, allow rws fsname=cephfs1 path=/dir2" \
mon "allow r fsname=cephfs1" \
osd "allow rw tag cephfs data=cephfs1"
重新挂载,再次创建快照
bash
[root@client ~]# umount /mnt/cephfs1
[root@client ~]# mount.ceph ceph1.laogao.cloud:/dir2 /mnt/cephfs1 -o name=cephfs1-restrict-user
[root@client ~]# mkdir /mnt/cephfs1/.snap/snap
[root@client ~]# ls /mnt/cephfs1/.snap/snap/
cephfs1-restrict-user-file1 cephfs1-restrict-user-file2
使用快照恢复文件
要恢复文件,可将其从快照目录复制到另一常规目录中。
bash
[root@client ~]# mkdir /restore
[root@client ~]# cp /mnt/cephfs1/.snap/snap/cephfs1-restrict-user-file1 /restore/
若要从 .snap 目录树中完整恢复快照,可将普通条目替换为所选快照中的副本。
bash
[root@client ~]# rsync -a /mnt/cephfs1/.snap/snap/ /restore/
删除快照
若要丢弃快照,可在 .snap 中删除对应的目录。即使快照目录不为空,rmdir 命令也会成功,无 需使用递归 rm 命令。
bash
[root@client ~]# rmdir /mnt/cephfs1/.snap/snap/
#管理 CephFS Mirror
CephFS Mirror 是 CephFS 的一个关键功能,用于在两个或多个 Ceph 集群之间实现文件系统的异步复 制(镜像),主要用于灾难恢复和数据备份。
CephFS Mirror 功能是从 Ceph Pacific (v16.2.0) 版本开始支持的。
参考: 社区 CephFS Mirror 红帽 CephFS Mirror
CephFS Mirror 主要特点
-
异步复制:CephFS Mirror 是异步的,数据会定期从源集群复制到目标集群。
-
基于快照:CephFS Mirror 依赖于 CephFS 的快照功能,通过快照来捕获文件系统的变化并复制到 目标集群。
-
多集群支持:支持将数据从一个 CephFS 集群复制到多个目标集群。
-
增量复制:仅复制文件系统中发生变化的部分,减少带宽和存储开销。
实施 CephFS Mirror 前提
源集群和目标集群都必须运行 Ceph Pacific (v16.2.0) 或更高版本。
需要在源集群和目标集群上配置 CephFS 文件系统。
需要在源集群和目标集群之间建立可靠的网络连接。
同步原理

源集群守护进程ceph-mirror使用自己的ceph账户,读取自己集群中cephfs数据,然后使用目标集群的 账户凭据将自己集群中cephfs变更数据写入目标集群。
CephFS 镜像功能基于快照实现:
-
第一次快照同步,需要将数据从源集群批量传输到远程集群。
-
然后,镜像守护进程识别本地快照之间修改的文件,并将这些修改的文件同步到远程集群。
对于目录中给定的快照,cephfs-mirror守护进程将依赖 readdir diff 来识别目录树中的更改。差异 应用于远程文件系统中的目录,从而仅同步两个快照之间已更改的文件。
环境准备
bash
# 源集群创建Cephfs
[root@ceph1 ~]# ceph fs volume create cephfs --placement="1 ceph1.laogao.cloud"
# 目标群创建Cephfs
[root@ceph4 ~]# ceph fs volume create cephfs --placement="1 ceph4.laogao.cloud"
具体操作步骤如下:
- 在源集群上部署 CephFS 镜像守护进程。
bash
# 部署cephfs-mirror镜像同步服务
[root@ceph1 ~]# ceph orch apply cephfs-mirror ceph1.laogao.cloud
Scheduled cephfs-mirror update...
# 查看cephfs-mirror运行状态
[root@ceph1 ~]# ceph orch ls cephfs-mirror
NAME RUNNING REFRESHED AGE PLACEMENT
cephfs-mirror 1/1 11s ago 18s ceph1.laogao.cloud
# 部署说明:部署CephFS镜像守护进程,自动创建 cephfs-mirror 同步用户
[root@ceph1 ~]# ceph auth ls | grep cephfs-mirror
installed auth entries:
client.cephfs-mirror.ceph1.yuxcon
caps: [mon] profile cephfs-mirror
# 查看镜像同步用户密钥与权限
[root@ceph1 ~]# ceph auth get client.cephfs-mirror.ceph1.yuxcon
[client.cephfs-mirror.ceph1.yuxcon]
key = AQChjK1oOu2WNRAAX7ZFmilo3IMq+/X+K1TWrA==
caps mds = "allow r"
caps mgr = "allow r"
caps mon = "profile cephfs-mirror"
caps osd = "allow rw tag cephfs metadata=*, allow r tag cephfs data=*"
exported keyring for client.cephfs-mirror.ceph1.yuxcon
- 在目标集群上创建Ceph用户。
bash
# 创建/授权 cephfs-mirror 跨集群同步账号
[root@ceph4 ~]# ceph fs authorize cephfs client.cephfs-mirror / rwps
[client.cephfs-mirror]
key = AQDpjq1ohezRExAA/x2+xHvjgFQm4SJOllbShw==
# 查看该账号完整权限
[root@ceph4 ~]# ceph auth get client.cephfs-mirror
[client.cephfs-mirror]
key = AQDpjq1ohezRExAA/x2+xHvjgFQm4SJOllbShw==
caps mds = "allow rwps fsname=cephfs"
caps mon = "allow r fsname=cephfs"
caps osd = "allow rw tag cephfs data=cephfs"
exported keyring for client.cephfs-mirror
- 在源集群上启用 mirroring 模块。
bash
[root@ceph1 ~]# ceph mgr module enable mirroring
- 在源集群特定文件系统上启用 mirroring 功能。
bash
[root@ceph1 ~]# ceph fs snapshot mirror enable cephfs
- 在目标集群上启用 mirroring 模块。
bash
[root@ceph4 ~]# ceph mgr module enable mirroring
- 在目标集群节点上创建对等引导。
语法: $ ceph fs snapshot mirror peer_bootstrap create fs_name client_entity site-name
说明:
-
fs_name ,是目标 cephfs 文件系统名称。
-
client_entity ,是目标集群Ceph账户,用来同步远端的CephFS。
-
site_name ,是用户自定义的目标集群名称。
示例:
bash
[root@ceph4 ~]# ceph fs snapshot mirror peer_bootstrap create cephfs client.cephfs-mirror backup
{"token":
"eyJmc2lkIjogImFhMDUyNzY0LTdmNGUtMTFmMC1hYTM5LTAwMGMyOTZiNGY4ZSIsICJmaWxlc3lz dGVtIjogImNlcGhmcyIsICJ1c2VyIjogImNsaWVudC5jZXBoZnMtbWlycm9yIiwgInNpdGVfbmFtZ SI6ICJiYWNrdXAiLCAia2V5IjogIkFRRHBqcTFvaGV6UkV4QUEveDIreEh2amdGUW00U0pPbGxiU2 h3PT0iLCAibW9uX2hvc3QiOiAiW3YyOjE5Mi4xNjguMTA4LjE0OjMzMDAvMCx2MToxOTIuMTY4LjE wOC4xNDo2Nzg5LzBdIFt2MjoxOTIuMTY4LjEwOC4xNTozMzAwLzAsdjE6MTkyLjE2OC4xMDguMTU6 Njc4OS8wXSBbdjI6MTkyLjE2OC4xMDguMTY6MzMwMC8wLHYxOjE5Mi4xNjguMTA4LjE2OjY3ODkvM F0ifQ=="}
- 在源集群上导入目标集群创建的引导令牌。
语法: ceph fs snapshot mirror peer_bootstrap import source_fs_name token
说明:
-
source_fs_name,是源 cephfs 文件系统名称。 -
token,是目标 cephfs 创建的 token 字符串。
示例:
bash
# 导入对端集群bootstrap配置建立镜像对等关系
[root@ceph1 ~]# ceph fs snapshot mirror peer_bootstrap import cephfs eyJmc2lkIjogImFhMDUyNzY0LTdmNGUtMTFmMC1hYTM5LTAwMGMyOTZiNGY4ZSIsICJmaWxlc3lzdGVtIjogImNlcGhmcyIsICJ1c2VyIjogImNsaWVudC5jZXBoZnMtbWlycm9yIiwgInNpdGVfbmFtZSI6ICJiYWNrdXAiLCAia2V5IjogIkFRRHBqcTFvaGV6UkV4QUEveDIreEh2amdGUW00U0pPbGxiU2h3PT0iLCAibW9uX2hvc3QiOiAiW3YyOjE5Mi4xNjguMTA4LjE0OjMzMDAvMCx2MToxOTIuMTY4LjEwOC4xNDo2Nzg5LzBdIFt2MjoxOTIuMTY4LjEwOC4xNTozMzAwLzAsdjE6MTkyLjE2OC4xMDguMTU6Njc4OS8wXSBbdjI6MTkyLjE2OC4xMDguMTY6MzMwMC8wLHYxOjE5Mi4xNjguMTA4LjE2OjY3ODkvMF0ifQ==
{}
# 查看文件系统镜像对等集群清单
[root@ceph1 ~]# ceph fs snapshot mirror peer_list cephfs
{
"89e201c4-b3f8-48d4-a647-66e5f4d0948b": {
"client_name": "client.cephfs-mirror",
"site_name": "backup",
"fs_name": "cephfs",
"mon_host": "[v2:192.168.108.14:3300/0,v1:192.168.108.14:6789/0] [v2:192.168.108.15:3300/0,v1:192.168.108.15:6789/0] [v2:192.168.108.16:3300/0,v1:192.168.108.16:6789/0]"
}
}
- 在源集群上指定需要快照镜像的目录。
bash
# 语法
[root@ceph1 ~]# ceph fs snapshot mirror add FILE_SYSTEM_NAME PATH
# 示例
[root@ceph1 ~]# ceph fs snapshot mirror add cephfs /webapp {}
- 客户端挂载验证
bash
# 源集群
[root@ceph1 ~]# mkdir /mnt/cephfs1
[root@ceph1 ~]# mount.ceph ceph1.laogao.cloud:/ /mnt/cephfs1 -o name=admin
[root@ceph1 ~]# mkdir /mnt/cephfs1/webapp
[root@ceph1 ~]# echo hello world > /mnt/cephfs1/webapp/index.html
# 目标集群
[root@ceph4 ~]# mkdir /mnt/cephfs1
[root@ceph4 ~]# mount.ceph ceph4.laogao.cloud:/ /mnt/cephfs1 -o name=admin
[root@ceph4 ~]# ls /mnt/cephfs1/
webapp