cephfs搭建及权限管理(本文单节点测试)

拖布图

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_3e7fad3ed82c19ee8bc03e153c89c81f.png

架构

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_c33ff0f84010148834f8b19aae653197.png

cephFS简介

每个CephFS文件系统至少需要一个MDS(metadata server),一般是三个。CephFS 是个与 POSIX 标准兼容的文件系统,文件目录和其他元数据存储在RADOS中,MDS缓存元信息和文件目录信息。

cephfs的核心组件有:MDS、Clients、RADOS。

参考:CephFS 介绍及使用经验分享

各个组件之间的依赖关系如下:

  • client 《==》 MDS:元数据操作和capalities。
  • Client 《==》 OSD: 数据IO。
  • MDS 《==》 OSD:元数据IO。

cephfs支持用户级别和内核级别的挂载使用,可扩展性高,并且可以共享文件系统,多个clients可以同时读写。MDS支持高可用性,默认采用的是主备模式(也可以通过配置改为多主),并且cephfs支持文件系统的配额限制。

cephfs中MDS多主的优势及特点如下:

  • 当元数据默认的单个 MDS 成为瓶颈时,配置多个活跃的 MDS 守护进程,提升集群性能。
  • 多个活跃的 MDS 有利于性能提升。
  • 多个活跃的MDS 可以实现MDS负载均衡。
  • 多个活跃的MDS 可以实现多租户资源隔离。
  • 它能够将文件系统树分割成子树,每个子树可以交给特定的MDS进行权威管理,从而达到了随着元数据服务器数量的增加,集群性能线性地扩展。
  • 每个子树都是基于元数据在给定目录树中的热动态创建的。
  • 一旦创建了子树,它的元数据就被迁移到一个未加载的MDS。
  • 后续客户端对先前授权的MDS的请求被转发。

一. 创建mds

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 首先开启mds组件,cephfs:文件系统名称;–placement:指定集群内需要几个mds,后面跟主机名(等待一分钟完成创建)
ceph orch apply mds cephfs --placement="2 ceph1 ceph2"
# 返回
Scheduled mds.cephfs update...
# 创建cephfs,ceph q版不指定pg的话,默认自动调整 不能使用 rbd init 初始化
ceph osd pool create cephfs_data 8 8
ceph osd pool create cephfs_metadata 8 8
# 返回
pool 'cephfs_metadata' created
# 将两个pool关联起来
ceph fs new cephfsdemo cephfs_metadata cephfs_data
# 返回
new fs with metadata pool 3 and data pool 2
# 查看各节点是否已启动mds容器;还可以使用ceph orch ps 查看某一节点运行的容器
ceph orch ps --daemon-type mds

查看mds信息

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看cephfs信息
ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

# 查看mds状态
ceph mds stat
cephfs:1 {0=cephfs.ceph-1.uuemyr=up:active} 1 up:standby

# 查看mds详细信息
ceph fs status

RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active cephfs.ceph-2.iuvxfu Reqs: 0 /s 16 19 13 1

删除cephfs

1
ceph fs rm <fs-name> --yes-i-really-mean-it 

二. 挂载cephfs

临时挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 使用内核级别挂载:
mkdir -p /mnt/cephfs/
mount -t ceph 10.0.0.124:6789:/ /mnt/cephfs/ -o name=admin (自动识别admin key)

mount -t ceph 10.0.0.124:6789:/ /mnt/cephfs -o name=admin,secret=AQCeoO1j+e+lMhAAP2izu6rTQSGz0oyJkLw9UQ==

# 文件密钥挂载:
echo AQDqOnNf7tGvHhAAZoXbhXRbETxRLBTl5DT1MQ== >> admin.key
mount -t ceph 192.168.229.114:6789:/ /cephfs/ -o name=admin,secretfile=admin.key
# 扩展查看key:
ceph auth ls
指定用户挂载 需要先建立cephx认证用户内核级别配置永久挂载

用户态挂载(例子)

1
2
3
4
5
6
7
8
9
10
11
$ yum -y install ceph-fuse     # 安装客户端
$ apt -y install ceph-fuse

$ mkdir /ceph-fuse # 创建挂载点并挂载使用

$ ceph-fuse -n client.admin -m 192.168.99.11:6789,192.168.99.12:6789,192.168.99.13:6789 /ceph-fuse
# monitor地址可以可以指定一个或多个(如果其中一个宕机不影响使用)

$ df -hT /ceph-fuse # 查看确认
文件系统 类型 容量 已用 可用 已用% 挂载点
ceph-fuse fuse.ceph-fuse 94G 0 94G 0% /ceph-fuse

永久挂载

1
2
3
4
5
6
7
# 写入配置文件:/etc/fstab 
# 密钥文件
10.0.0.124:6789:/ /mnt/cephfs ceph name=admin,secretfile=/root/adminkey,noatime 0 0
# 直接指定密钥
10.0.0.124:6789:/ /mnt/cephfs ceph name=admin,secret=AQCeoO1j+e+lMhAAP2izu6rTQSGz0oyJkLw9UQ==,noatime,_netdev 0 0

关机验证:正常挂载 / monut -a 即可验证

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_7a032c8de07240c963b4846f8b971faf.png

三. ceph权限控制

3.6 不同用户挂载不同目录

3.6.1 添加新的pool到cephfs
1
2
3
4
# cephfs中增加新的pool
ceph osd pool create cephfs_data1 4 4 # 创建pool
ceph fs add_data_pool cephfsdemo cephfs_data1 # 加到cephfs中

3.6.2 创建bruce的用户,这个用户只能访问目录/bruce,数据存储在 pool cephfs_data1
1
2
3
4
5
# 创建bruce的用户,这个用户只能访问目录/bruce,数据存储在 `pool cephfs_data1` 中
ceph auth get-or-create client.bruce mon 'allow r' mds 'allow r, allow rw path=/bruce' osd 'allow rw pool=cephfs_data1' -o ceph.client.bruce.keyring
// 返回
[client.bruce]
key = AQCtFc9g/CmyERAAzi7ORpEWIxlMiiFC1GK7nA==

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_85fe5cb0da273b96eb63b2ca004dc93c.png

3.6.3 客户端挂载
1
2
3
# 客户端挂载
mkdir /data1
mount -t ceph 192.168.99.11:6789,192.168.99.12:6789,192.168.99.13:6789:/ /data1/ -o name=bruce,secret=AQCtFc9g/CmyERAAzi7ORpEWIxlMiiFC1GK7nA==

四、cephfs权限与访问控制

4.1 添加用户

添加用户jerry,jerry只有对/jerry路径下的文件具有读写权限,对其他路径下的文件只有读的权限

1
2
3
4
# 创建权限密钥
ceph auth get-or-create client.jerry mon 'allow r' mds 'allow rw,allow rw path=/jerry' osd 'allow rw pool=cephfs_data2' -o ceph.client.jerry.keyring
# 使用jerry用户挂载
mount -t ceph 10.0.0.10:6789:/ /data -o name=jerry,secret=AQAo0/9lI2g7KRAA8AqwdIUhGQcS4tJgltSlzw==

4.2 获取权限列表

1
$ ceph auth list

4.3 删除用户

1
$ ceph auth del client.jerry

4.4 获取某个用户的key

1
$ ceph auth get-key client.bruce

4.5 修改用户权限

1
$ ceph auth caps client.jerry mon 'allow r' mds 'allow r, allow rw path=/jerry, allow rw path=/test' osd 'allow rw'

4.6 注意事项

  • 当用java api操作cephfs时,api无法指定新建文件or目录的所属用户or所属组,这两个属性取决于运行java程序时的当前用户(uid)及其所属的用户组(gid)
  • 经过测试发现,cephfs文件or目录的权限是linux本身用户权限和cephfs用户权限的交集
  • 修改用户权限后,在本地需要重新挂载才可生效
  • 建目录,设置权限无需前后顺序

本文参考:

官网:
https://docs.ceph.com/en/quincy/cephfs/#ceph-file-system
挂载:
https://docs.ceph.com/en/quincy/cephfs/mount-using-kernel-driver/
cephfs介绍+各种测试:
http://www.yangguanjun.com/2017/07/16/cephfs-test-method-lite/