Ceph 分布式存储学习笔记(四):文件系统存储管理

ceph分布式存储

Ceph 分布式存储 文件系统存储管理

介绍 CephFS

  • 定义:构建于 Ceph 存储之上,兼容 POSIX 的文件系统,与 RBD、RGW 类似,通过 librados 原生接口实现。

  • 关键特性

  1. 支持单集群多活动 MDS(元数据服务器),提升元数据性能;可配备用 MDS,保障高可用。

  2. 支持单集群部署多活动 CephFS,需运行多个 MDS 守护进程。

二、三种存储方式对比

存储类型 核心特点
基于文件的存储 按目录树整理数据,文件含名称 + 元数据(修改时间、所有者、权限等),类似传统文件系统。
基于块的存储 提供磁盘式存储卷,划分为等大区块;需格式化(文件系统)或供数据库等应用直接读写。
基于对象的存储 数据 + 元数据组成唯一标识单元,存于扁平存储池;通过 API 访问,不依赖块 / 文件系统层级。

三、元数据服务器(MDS)

核心职责​

  • 管理目录层次与文件元数据(所有者、时间戳、权限等),提供客户端访问 RADOS 对象的必要信息。

  • 管理客户端缓存,维护缓存一致性。

运行模式

  • 活动 MDS:负责管理 CephFS 元数据。

  • 备用 MDS:作为备份,活动 MDS 故障时切换为活动模式。

  • 要求:至少 1 个活动 MDS,建议配 1 个备用 MDS 保障可用性。

关键配置选项

  • MDS 等级:由max_mds定义活动 MDS 最大数量,MON 守护进程为 MDS 分配等级(默认 1 个活动 MDS)。

  • 卷 / 子卷 / 子卷组

    • 卷:对应 1 个 CephFS 文件系统;

    • 子卷:对应文件系统子目录,可指定 UID、GID、大小等细粒度权限;

    • 子卷组:一组子卷的集合。

  • 文件系统关联性:通过mds_join_fs配置,指定文件系统优先使用某 MDS(如高性能服务器上的 MDS)。

  • 缓存大小限制:mds_cache_memory_limit限制最大内存,mds_cache_size定义最大索引节点数。

  • 配额:用setfattr命令的ceph.quota.max_bytes(字节数)、ceph.quota.max_files(文件数)设置限制;FUSE/Kernel 客户端挂载时检查配额,达限后停止写入。

四、客户端访问 CephFS 流程

  • 客户端联系 MON,完成身份验证并获取集群映射;

  • 从集群映射中提取活动 MDS 信息;

  • 向活动 MDS 请求文件元数据;

  • 基于元数据直接与 OSD 通信,访问文件 / 目录。

部署 CephFS

部署 CephFS 方法:

  1. 手动部署,步骤多,可以控制每个步骤。
  2. 卷部署,步骤少,简单方便,无法控制每个步骤。
手动部署 CephFS

部署 CephFS 流程:

  1. 创建所需池
  2. 创建 CephFS 文件系统
  3. 部署 MDS 守护进程
创建 CephFS
bash 复制代码
# 创建 CephFS 文件系统,首先至少要创建两个池,一个用于存储 CephFS 数据,另一个用于存储 CephFS 元数据。这两个池的默认名称分别为 cephfs_data 和 cephfs_meta。
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.data1
pool 'cephfs.cephfs1.data1' created
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.meta
pool 'cephfs.cephfs1.meta' created


[root@ceph1 ~]# ceph osd pool set cephfs.cephfs1.meta size 3
set pool 3 size to 3

# 创建文件系统
[root@ceph1 ~]# ceph fs new cephfs1 cephfs.cephfs1.meta cephfs.cephfs1.data1
  Pool 'cephfs.cephfs1.data1' (id '2') has pg autoscale mode 'on' but is not marked as bulk.
  Consider setting the flag by running
    # ceph osd pool set cephfs.cephfs1.data1 bulk true
new fs with metadata pool 3 and data pool 2

# 将现有池添加为 CephFS 文件系统中的数据池
[root@ceph1 ~]# ceph osd pool create cephfs.cephfs1.data.2
pool 'cephfs.cephfs1.data.2' created
[root@ceph1 ~]# ceph fs add_data_pool cephfs1 cephfs.cephfs1.data.2
  Pool 'cephfs.cephfs1.data.2' (id '4') has pg autoscale mode 'on' but is not marked as bulk.
  Consider setting the flag by running
    # ceph osd pool set cephfs.cephfs1.data.2 bulk true
added data pool 4 to fsmap


# 部署 MDS 服务
[root@ceph1 ~]# ceph orch apply mds cephfs1 --placement="3 ceph1.yuxb.cloud ceph2.yuxb.cloud ceph3.yuxb.cloud"
Scheduled mds.cephfs1 update...


# 验证 MDS 服务部署
## 查看文件系统清单
[root@ceph1 ~]# ceph fs ls
name: cephfs1, metadata pool: cephfs.cephfs1.meta, data pools: [cephfs.cephfs1.data1 cephfs.cephfs1.data.2 ]

## 查看文件系统状态
[root@ceph1 ~]# ceph fs status
cephfs1 - 0 clients
=======
RANK  STATE           MDS              ACTIVITY     DNS    INOS   DIRS   CAPS
 0    active  cephfs1.ceph1.zbefts  Reqs:    0 /s    10     13     12      0
         POOL            TYPE     USED  AVAIL
 cephfs.cephfs1.meta   metadata  96.0k  56.1G
 cephfs.cephfs1.data1    data       0   56.1G
cephfs.cephfs1.data.2    data       0   56.1G
    STANDBY MDS
cephfs1.ceph3.jrjgqq
cephfs1.ceph2.pvfrxi
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
device_health_metrics   1    1      0 B        3     0 B      0     56 GiB
cephfs.cephfs1.data1    2   32      0 B        0     0 B      0     56 GiB
cephfs.cephfs1.meta     3   32  2.3 KiB       22  96 KiB      0     56 GiB
cephfs.cephfs1.data.2   4   32      0 B        0     0 B      0     56 GiB


## 查看mds服务状态
[root@ceph1 ~]# ceph mds stat
cephfs1:1 {0=cephfs1.ceph1.zbefts=up:active} 2 up:standby


## 查看mds服务守护进程
[root@ceph1 ~]# ceph orch ls mds
NAME         PORTS  RUNNING  REFRESHED  AGE  PLACEMENT                                            
mds.cephfs1             3/3  47s ago    55s  ceph1.yuxb.cloud;ceph2.yuxb.cloud;ceph3.yuxb.cloud;count:3
删除 CephFS

删除流程如下:

  1. 删除服务
  2. 删除文件系统
  3. 删除池
bash 复制代码
# 删除服务
[root@ceph1 ~]# ceph orch rm mds.cephfs1
Removed service mds.cephfs1

# 如果需要删除 CephFS,请先备份所有数据,
# 因为删除 CephFS 文件系统会破坏该文件系统上存储的所有数据。

# 要删除 CephFS,首先要将其标记为 down
# 然后删除 CephFS
[root@ceph1 ~]# ceph fs set cephfs1 down true
cephfs1 marked down.
[root@ceph1 ~]# ceph fs rm cephfs1 --yes-i-really-mean-it

# 删除池
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.meta cephfs.cephfs1.meta --yes-i-really-really-mean-it
pool 'cephfs.cephfs1.meta' removed
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.data1 cephfs.cephfs1.data1 --yes-i-really-really-mean-it
pool 'cephfs.cephfs1.data1' removed
[root@ceph1 ~]# ceph osd pool rm cephfs.cephfs1.data.2 cephfs.cephfs1.data.2 --yes-i-really-really-mean-it
pool 'cephfs.cephfs1.data.2' removed
卷部署 CephFS
创建 CephFS
bash 复制代码
# 环境准备,先部署三个实例
[root@ceph1 ~]# ceph fs volume create cephfs2 --placement="3 ceph1.yuxb.cloud ceph2.yuxb.cloud ceph3.yuxb.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.todbir=up:active} 2 up:standby

# 查看mds服务守护进程
[root@ceph1 ~]# ceph orch ls mds
NAME         PORTS  RUNNING  REFRESHED  AGE  PLACEMENT                                            
mds.cephfs2             3/3  38s ago    45s  ceph1.yuxb.cloud;ceph2.yuxb.cloud;ceph3.yuxb.cloud;count: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.yuxb.cloud ceph2.yuxb.cloud ceph3.yuxb.cloud"
[root@ceph1 ~]# ceph fs volume create cephfs2 --placement="3 ceph1.yuxb.cloud ceph2.yuxb.cloud ceph3.yuxb.cloud"
CephFS 挂载方式

用户可使用以下方式挂载 CephFS 文件系统:

  • Kernel 挂载,要求 Linux 内核版本达到 4 或以上,从 RHEL 8 开始可用。对于之前的内核版本,请改用FUSE 客户端。
  • FUSE 挂载
bash 复制代码
# Kernel 挂载:不支持配额,但速度可能较快。
# FUSE 挂载:支持配额和 ACL。 ACL 功能需要在挂载时明确指定该功能以启用。
CephFS 挂载用户

ceph fs authorize 命令可为 CephFS 挂载用户提供精细访问控制,支持以下权限选项:

  • r:读取指定文件夹,默认对子文件夹生效
  • w:写入指定文件夹,默认对子文件夹生效
  • p:在 r/w 基础上,允许使用布局或配额
  • s:在 r/w 基础上,允许创建快照

示例1:允许用户对 / 文件夹具备读取、写入、配额和快照权限,并保存用户凭据。

bash 复制代码
[root@ceph1 ~]# ceph fs authorize cephfs1 client.cephfs1-all-user / rwps > /etc/ceph/ceph.client.cephfs1-all-user.keyring

示例2:允许用户读取 root 文件夹,并提供对 /dir2 文件夹的读取、写入和快照权限,并保存用户凭据。

bash 复制代码
[root@ceph1 ~]# ceph fs authorize cephfs1 client.cephfs1-restrict-user / r /dir2 rw > /etc/ceph/ceph.client.cephfs1-restrict-user.keyring
CephFS 客户端挂载准备
bash 复制代码
[root@client ~]# dnf install -y ceph-common

[root@ceph1 ~]# scp /etc/ceph/ceph.conf root@client:/etc/ceph/ceph.conf
The authenticity of host 'client (192.168.108.10)' can't be established.
ECDSA key fingerprint is SHA256:FPYe2LYas2LxQYQs/Uy7j6s8oD02rVjtJYf/BS/95Go.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'client,192.168.108.10' (ECDSA) to the list of known hosts.

[root@ceph1 ~]# scp /etc/ceph/ceph.client.{cephfs1-all-user,cephfs1-restrict-user}.keyring root@client:/etc/ceph/
root@client's password:
ceph.client.cephfs1-all-user.keyring                                 100%   74    87.5KB/s   00:00
/etc/ceph/ceph.client.cephfs1-restrict-user.keyring: No such file or directory


[root@ceph1 ~]# scp /etc/ceph/ceph.client.admin.keyring root@client:/etc/ceph/
root@client's password:
ceph.client.admin.keyring                                            100%  151   142.3KB/s   00:00
使用 Kernel 挂载 CephFS
挂载 CephFS
bash 复制代码
# 挂载文件系统
[root@client ~]# mount.ceph [src] [mount-point] [-n] [-v] [-o ceph-options]
Can't understand option: '[-n]'

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)



[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)

示例1:使用不受限账户挂载 cephfs 文件系统。

bash 复制代码
[root@client ~]# mkdir /mnt/cephfs1
[root@client ~]# mount.ceph ceph1.yuxb.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
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.094928 s, 1.1 GB/s
[root@client ~]# tree /mnt/cephfs1
/mnt/cephfs1
├── dir1
│   ├── file-100M
│   └── welcome.txt
└── dir2

# 3副本池,创建100M文件,文件系统空间减少100M
[root@client ~]# df -h /mnt/cephfs1
Filesystem        Size  Used Avail Use% Mounted on
192.168.108.11:/   57G  100M   57G   1% /mnt/cephfs1

# 3副本池,创建100M文件,cephfs.cephfs_data 池系统空间使用300M
[root@client ~]# ceph fs status
cephfs1 - 1 clients
=======
RANK  STATE           MDS              ACTIVITY     DNS    INOS   DIRS   CAPS
 0    active  cephfs1.ceph1.troedj  Reqs:    0 /s    14     17     14      5
        POOL           TYPE     USED  AVAIL
cephfs.cephfs1.meta  metadata   192k  56.0G
cephfs.cephfs1.data    data     300M  56.0G
cephfs2 - 0 clients
=======
RANK  STATE           MDS              ACTIVITY     DNS    INOS   DIRS   CAPS
 0    active  cephfs2.ceph3.ovaprz  Reqs:    0 /s    10     13     12      0
        POOL           TYPE     USED  AVAIL
cephfs.cephfs2.meta  metadata  96.0k  56.0G
cephfs.cephfs2.data    data       0   56.0G
    STANDBY MDS
cephfs1.ceph3.cnnvoq
cephfs2.ceph2.mjhvad
cephfs1.ceph2.nldbpd
cephfs2.ceph1.yhdhms
MDS version: ceph version 16.2.15 (618f440892089921c3e944a991122ddc44e60516) pacific (stable)

# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1

示例2:使用受限账户挂载 cephfs 文件系统。

bash 复制代码
# 挂载
[root@client ~]# mount.ceph ceph1.yuxb.cloud:/ /mnt/cephfs1 -o name=cephfs1-restrict-user,fs=cephfs1


# 验证权限
[root@client ~]# touch /mnt/cephfs1/dir1/cephfs1-restrict-user-file1
touch: cannot touch '/mnt/cephfs1/dir1/cephfs1-restrict-user-file1': Permission denied
[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 文件系统挂载特定子目录。

bash 复制代码
# 从CephFS文件系统的root中挂载/dir2的目录
[root@client ~]#  mount -t ceph ceph1.yuxb.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
使用 FUSE 挂载 CephFS

安装ceph-fuse软件

bash 复制代码
[root@client ~]# dnf install -y ceph-fuse
挂载 CephFS
bash 复制代码
# 使用 FUSE 客户端挂载 CephFS 文件系统语法
[root@client ~]# ceph-fuse -n client.cephfs1-restrict-user /mnt/cephfs1
ceph-fuse[2433]: starting ceph client
2025-10-13T10:37:38.040+0800 7f813c6993c0 -1 init, newargv = 0x5601916baa90 newargc=13

2025-10-13T10:37:38.040+0800 7f813c6993c0 -1 init, args.argv = 0x5601916bac40 args.argc=4

ceph-fuse[2433]: 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
挂载特定子目录
bash 复制代码
[root@client ~]# ceph-fuse -n client.cephfs1-restrict-user -r /dir2 /mnt/cephfs1/
ceph-fuse[2512]: starting ceph client
2025-10-13T10:38:19.998+0800 7f33e92ab3c0 -1 init, newargv = 0x560ba1c14d90 newargc=13

2025-10-13T10:38:19.998+0800 7f33e92ab3c0 -1 init, args.argv = 0x560ba1c14ef0 args.argc=4

ceph-fuse[2512]: 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** 选项
[root@client ~]# ceph-fuse -n client.cephfs1-restrict-user -r /dir2 --client_fs cephfs1 /mnt/cephfs1
ceph-fuse[2567]: starting ceph client
2025-10-13T10:38:53.726+0800 7f59905223c0 -1 init, newargv = 0x55f3dfa7e7d0 newargc=13

2025-10-13T10:38:53.726+0800 7f59905223c0 -1 init, args.argv = 0x55f3dfa7e980 args.argc=4

ceph-fuse[2567]: starting fuse

管理 CephFS

环境准备

使用受限账户挂载 cephfs

bash 复制代码
[root@client ~]# mount.ceph ceph1.yuxb.cloud:/dir2 /mnt/cephfs1 -o name=cephfs1-restrict-user,fs=cephfs1
管理快照

CephFS 默认会启用快照功能,这些快照存储在名为 .snap 的隐藏目录中

启停快照功能
bash 复制代码
# 使用 ceph fs set 命令停用特定 CephFS 文件系统快照功能
[root@client ~]# ceph fs set cephfs1 allow_new_snaps false
disabled new snapshots

# 使用 **ceph fs set** 命令启用特定 CephFS 文件系统快照功能。
[root@client ~]# ceph fs set cephfs1 allow_new_snaps true
enabled new snapshots
创建快照
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 = AQCnX+xoVqgIMBAAdDZpW8Pf0r9oLhicO9fgkA==
        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 文件系统制作快照。
[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"
updated caps for client.cephfs1-restrict-user

# 重新挂载,再次创建快照
[root@client ~]# umount /mnt/cephfs1
[root@client ~]# mount.ceph ceph1.yuxb.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/cephfs1-restrict-user-file1 /restore/

# 若要从 .snap 目录树中完整**恢复快照**,可将普通条目替换为所选快照中的副本。
[root@client ~]# rsync -a /mnt/cephfs1/.snap/snap/ /restore/
删除快照
bash 复制代码
# 若要丢弃快照,可在 .snap 中删除对应的目录。即使快照目录不为空,rmdir 命令也会成功,无需使用递归 rm 命令。
[root@client ~]# rmdir /mnt/cephfs1/.snap/snap/
相关推荐
ouliten4 小时前
cuda编程笔记(29)-- CUDA Graph
笔记·深度学习·cuda
Larry_Yanan4 小时前
QML学习笔记(四十一)QML的ColorDialog和FontDialog
笔记·学习
润 下4 小时前
C语言——深入解析C语言指针:从基础到实践从入门到精通(四)
c语言·开发语言·人工智能·经验分享·笔记·程序人生·其他
koo3644 小时前
李宏毅机器学习笔记25
人工智能·笔记·机器学习
m0_678693334 小时前
深度学习笔记39-CGAN|生成手势图像 | 可控制生成(Pytorch)
深度学习·学习·生成对抗网络
小年糕是糕手4 小时前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车2444 小时前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
日更嵌入式的打工仔4 小时前
存储同步管理器SyncManager 归纳
笔记·单片机·嵌入式硬件
Larry_Yanan4 小时前
QML学习笔记(四十)QML的FileDialog和FolderDialog
笔记·qt·学习