当前位置: 首页 > news >正文

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
# 创建 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.data1Pool '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.2Pool '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   CAPS0    active  cephfs1.ceph1.zbefts  Reqs:    0 /s    10     13     12      0POOL            TYPE     USED  AVAILcephfs.cephfs1.meta   metadata  96.0k  56.1Gcephfs.cephfs1.data1    data       0   56.1G
cephfs.cephfs1.data.2    data       0   56.1GSTANDBY 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. 删除池
# 删除服务
[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
# 环境准备,先部署三个实例
[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
[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。

[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 挂载
# Kernel 挂载:不支持配额,但速度可能较快。
# FUSE 挂载:支持配额和 ACL。 ACL 功能需要在挂载时明确指定该功能以启用。
CephFS 挂载用户

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

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

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

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

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

[root@ceph1 ~]# ceph fs authorize cephfs1 client.cephfs1-restrict-user / r /dir2 rw > /etc/ceph/ceph.client.cephfs1-restrict-user.keyring
CephFS 客户端挂载准备
[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
# 挂载文件系统
[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: Verboseceph-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: Verboseceph-options: refer to mount.ceph(8)

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

[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   CAPS0    active  cephfs1.ceph1.troedj  Reqs:    0 /s    14     17     14      5POOL           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   CAPS0    active  cephfs2.ceph3.ovaprz  Reqs:    0 /s    10     13     12      0POOL           TYPE     USED  AVAIL
cephfs.cephfs2.meta  metadata  96.0k  56.0G
cephfs.cephfs2.data    data       0   56.0GSTANDBY 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 文件系统。

# 挂载
[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-file12 directories, 3 files# 卸载文件系统
[root@client ~]# umount /mnt/cephfs1
挂载特定子目录

通过 CephFS Kernel 客户端,用户可从 CephFS 文件系统挂载特定子目录。

# 从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-file20 directories, 2 files[root@client ~]# umount /mnt/cephfs1
使用 FUSE 挂载 CephFS

安装ceph-fuse软件

[root@client ~]# dnf install -y ceph-fuse
挂载 CephFS
# 使用 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=132025-10-13T10:37:38.040+0800 7f813c6993c0 -1 init, args.argv = 0x5601916bac40 args.argc=4ceph-fuse[2433]: starting fuse[root@client ~]# tree /mnt/cephfs1
/mnt/cephfs1
├── dir1
│   ├── file-100M
│   └── welcome.txt
└── dir2├── cephfs1-restrict-user-file1└── cephfs1-restrict-user-file22 directories, 4 files[root@client ~]# umount /mnt/cephfs1
挂载特定子目录
[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=132025-10-13T10:38:19.998+0800 7f33e92ab3c0 -1 init, args.argv = 0x560ba1c14ef0 args.argc=4ceph-fuse[2512]: starting fuse[root@client ~]# tree /mnt/cephfs1/
/mnt/cephfs1/
├── cephfs1-restrict-user-file1
└── cephfs1-restrict-user-file20 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=132025-10-13T10:38:53.726+0800 7f59905223c0 -1 init, args.argv = 0x55f3dfa7e980 args.argc=4ceph-fuse[2567]: starting fuse

管理 CephFS

环境准备

使用受限账户挂载 cephfs

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

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

启停快照功能
# 使用 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
创建快照
# 普通用户没有创建快照的权限
[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
使用快照恢复文件
# 恢复文件,可将其从快照目录复制到另一常规树中
[root@client ~]# mkdir /restore
[root@client ~]# cp /mnt/cephfs1/cephfs1-restrict-user-file1 /restore/# 若要从 .snap 目录树中完整**恢复快照**,可将普通条目替换为所选快照中的副本。
[root@client ~]# rsync -a /mnt/cephfs1/.snap/snap/ /restore/
删除快照
# 若要丢弃快照,可在 .snap 中删除对应的目录。即使快照目录不为空,rmdir 命令也会成功,无需使用递归 rm 命令。
[root@client ~]# rmdir /mnt/cephfs1/.snap/snap/
http://www.dtcms.com/a/477437.html

相关文章:

  • ceph设置标志位
  • 系统升级丨让VR全景制作更全面、更简单
  • PyTorch 实现 MNIST 手写数字识别全流程
  • PyTorch实现MNIST手写数字识别:从数据到模型全解析
  • PostgreSQL 测试磁盘性能
  • 北京网站开发科技企业网站
  • 干货|腾讯 Linux C/C++ 后端开发岗面试
  • 【深度学习新浪潮】如何入门分布式大模型推理?
  • 基于单片机的螺旋藻生长大棚PH智能控制设计
  • 分布式专题——42 MQ常见问题梳理
  • mapbox基础,使用矢量切片服务(pbf)加载symbol符号图层
  • Linux中setup_arch和setup_memory相关函数的实现
  • 智能合约在分布式密钥管理系统中的应用
  • Spark大数据分析与实战笔记(第六章 Kafka分布式发布订阅消息系统-01)
  • 做网络竞拍的网站需要什么厦门网站设计哪家公司好
  • React Native:从react的解构看编程众多语言中的解构
  • C++ 手写 List 容器实战:从双向链表原理到完整功能落地,附源码与测试验证
  • 化工课设代做网站网络宣传网站建设价格
  • 【第1篇】2025年羊城工匠杯nl2sql比赛介绍
  • 2025年ASP.NETMVC面试题库全解析
  • 机器学习:支持向量机
  • C 标准库 - `<locale.h>`
  • YOLO系列——Ubuntu20.04下通过conda虚拟环境安装Labelme
  • 流量安全优化:基于 Sentinel 实现网站流量控制和熔断
  • Ansible 自动化部署K8S1.34.1
  • 1. 使用VSCode开发uni-app环境搭建
  • Docker监控:cAdvisor+Prometheus+Grafana实战指南
  • Redis-持久化之AOF
  • Python Redis 教程
  • R语言绘制热图