date: 2021-02-24title: ceph集群之cephFS文件存储 #标题
tags: ceph #标签
categories: 存储 # 分类

每个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

为了高可用性,我们部署三个MDS。

  1. # 在 pod4-core-20-10 节点上执行
  2. $ cd ~/my-cluster/
  3. # 安装
  4. $ ceph-deploy mds create pod4-core-20-10 pod4-core-20-5 pod4-core-20-6
  5. # 查询集群状态
  6. $ ceph -s
  7. cluster:
  8. id: 634fc0a4-d2bd-4f14-af6b-421ecbb89ba6
  9. health: HEALTH_WARN
  10. too many PGs per OSD (277 > max 250)
  11. services:
  12. mon: 3 daemons, quorum pod4-core-20-10,pod4-core-20-5,pod4-core-20-6 (age 34m)
  13. mgr: pod4-core-20-5(active, since 34m), standbys: pod4-core-20-6, pod4-core-20-10
  14. mds: 3 up:standby # 因为当前还没有文件系统,所以三个都是standby状态
  15. osd: 3 osds: 3 up (since 34m), 3 in (since 2d)
  16. rgw: 1 daemon active (pod4-core-20-10)
  17. task status:
  18. data:
  19. pools: 7 pools, 320 pgs
  20. objects: 2.68k objects, 2.0 GiB
  21. usage: 7.5 GiB used, 53 GiB / 60 GiB avail
  22. pgs: 320 active+clean

创建cephfs文件系统

  • 一个Ceph文件系统至少需要两个RADOS池,一个用于数据,另一个用于元数据。注意元数据池中的任何数据丢失都可能导致整个文件系统无法访问。
  • 对元数据池使用较低延迟的存储(例如SSD),因为这将直接影响在客户端上观察到的文件系统操作的延迟。

创建pool

  1. $ ceph osd pool create cephfs_metadata 16 16
  2. $ ceph osd pool create cephfs_data 16 16
  3. # 确认pools已创建
  4. $ ceph osd lspools
  5. 1 ceph-demo
  6. 2 .rgw.root
  7. 3 default.rgw.control
  8. 4 default.rgw.meta
  9. 5 default.rgw.log
  10. 6 default.rgw.buckets.index
  11. 7 default.rgw.buckets.data
  12. 8 cephfs_metadata
  13. 9 cephfs_data

创建文件系统

  1. # 创建文件系统的格式为:ceph fs new <fs_name> <metadata> <data>,如下:
  2. $ ceph fs new cephfs-demo cephfs_metadata cephfs_data
  3. $ ceph fs ls # 查看cephfs相关信息
  4. name: cephfs-demo, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

确认mds进入active状态

  1. $ ceph -s
  2. cluster:
  3. id: 634fc0a4-d2bd-4f14-af6b-421ecbb89ba6
  4. health: HEALTH_WARN
  5. too many PGs per OSD (309 > max 250)
  6. services:
  7. mon: 3 daemons, quorum pod4-core-20-10,pod4-core-20-5,pod4-core-20-6 (age 15m)
  8. mgr: pod4-core-20-5(active, since 80m), standbys: pod4-core-20-6, pod4-core-20-10
  9. mds: cephfs-demo:1 {0=pod4-core-20-6=up:active} 2 up:standby
  10. # 当前活跃状态的是pod4-core-20-6,还有2个备用节点
  11. osd: 3 osds: 3 up (since 80m), 3 in (since 2d)
  12. rgw: 1 daemon active (pod4-core-20-10)
  13. task status:
  14. scrub status:
  15. mds.pod4-core-20-6: idle
  16. data:
  17. pools: 9 pools, 352 pgs
  18. objects: 2.70k objects, 2.0 GiB
  19. usage: 7.5 GiB used, 53 GiB / 60 GiB avail
  20. pgs: 352 active+clean

cephfs内核级别挂载

直接内核级别使用,性能最好。

参考:官方文档

  1. $ mkdir /ceph_fs
  2. # 挂载需要指定ceph集群中monitor地址及用户名
  3. # monitor地址可以指定一个或多个
  4. $ mount -t ceph 192.168.20.5:6789,192.168.20.6:6789,192.168.20.10:6789:/ /ceph_fs/ -o name=admin

挂载后,即可自行写入数据进行测试。

用户空间挂载使用

# 安装客户端
$ yum -y install ceph-fuse

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

# monitor地址可以写多个
$ ceph-fuse -n client.admin -m 192.168.20.5:6789,192.168.20.6:6789,192.168.20.10:6789 /ceph-fuse
2021-02-24 09:18:02.831 7faac3d81f80 -1 init, newargv = 0x558639bea720 newargc=9ceph-fuse[7871]: starting ceph client

ceph-fuse[7871]: starting fuse

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

不同用户挂载不同目录

1、添加新的pool到cephfs

# cephfs中增加新的pool
$ ceph osd pool create cephfs_data1 20 20   # 创建pool
$ ceph fs add_data_pool cephfs-demo cephfs_data1    #加到cephfs中

2、创建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'

3、客户端挂载

$ mount -t ceph 192.168.20.5:6789,192.168.20.6:6789,192.168.20.10:6789:/ /data1/ \
  -o name=bruce,secret=AQBwszVgdwtZGBAAzqGKmA3gHNRKAsSrfaH0Hg==

cephfs权限与访问控制

添加用户

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

$ ceph auth get-or-create client.jerry mon 'allow r' \
  mds 'allow rw,allow rw path=/jerry' osd 'allow rw pool=cephfs_data2'
[client.jerry]
        key = AQBCwjVgaoMWFRAAFb5omsIo8yRBNWnf+hhaRg==

# 使用jerry用户挂载
$ mount -t ceph 192.168.20.10:6789:/jerry  /data \
  -o name=jerry,secret=AQCXuTVgBJOELxAAAKMCMRY3p7OR7hMIGTYn0w==

获取权限列表

$ ceph auth list

删除用户

$ ceph auth del client.jerry

获取某个用户的key

$ ceph auth get-key client.bruce

修改用户权限

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

注意事项

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