服务热线:400-610-9901

知名的灾备软件开发商和设备制造商

数据安全国产解决方案提供商

主页 > 新闻资讯 > 火星课堂 > 详情

火星课堂:CephFS架构解读与测试分析(上)

  本文转自“日知录技术社区”,作者:杨冠军
 

  CephFS架构解读
 

  1、CephFS简介

  CephFS是Ceph提供的兼容Posix协议的文件系统,对比RBD和RGW,它是最晚满足Production ready的一个功能。CephFS的底层还是使用rados存储数据,用MDS管理filesystem的元数据。

  在Jewel版本里,CephFS的基本功能已经ready,但是很多feature还是experimental的,并不建议在生成环境打开这些feature。
 

  1.1 CephFS特性

  1.可扩展性

  CephFS的client端是直接读写OSDs的,所以OSDs的扩展性也体现在CephFS中
 

  2.共享文件系统

  CephFS是一个共享的文件系统,支持多个clients同时读写文件系统的一个file
 

  3.高可用性

  CephFS支持配置元数据服务器集群,也可以配置为Active-Standby的主从服务器,提高可用性
 

  4.文件/目录Layout配置

  CephFS支持配置任一文件/目录的Layout,文件/目录若不单独配置,默认继承父目录的Layout属性
 

  5.POSIX ACLs支持

  CephFS支持POSIX的ACLs,在CephFS支持的两个client中,kernel client默认支持,FUSE client需要修改配置来支持
 

  6.Quotas支持

  CephFS在后端没有实现Quota的功能,它的Quota是在CephFS FUSE client端实现的,而kernel client里还没有添加
 

  1.2 CephFS架构

  如下图所示:

  最底层还是基础的OSDs和Monitors,添加了MDSs,上层是支持客户端的CephFSkernel object,CephFSFUSE,CephFSLibrary等。

 

  1.3 CephFS组件间通信

  如上图所示,CephFS各个组件间通信如下:

  1.Client <--> MDS

  元数据操作和capalities
 

  2.Client <--> OSD

  数据IO
 

  3.Client <--> Monitor

  认证,集群map信息等
 

  4.MDS <--> Monitor

  心跳,集群map信息等
 

  5.MDS <--> OSD

  元数据IO
 

  6.Monitor <--> OSD

  心跳,集群map信息等
 

  1.4 CephFS MDS组件

  Ceph MDS设计的比较强大,作为一个能存储PB级数据的文件系统,它充分考虑了对元数据服务器的要求,设计了MDS集群。另外也引入了MDS的动态子树迁移,MDS的热度负载均衡。

 

  但也正是这么超前的设计,使得MDS集群很难做到稳定,所以目前Jewel版本里默认还是单MDS实例,用户可配置主从MDS实例,提高可用性。但在未来,MDS集群的这些属性都将稳定下来,为我们提供超强的元数据管理性能。

  如上图所示,CephFS各个组件间通信如下:

  1.Client <--> MDS

  元数据操作和capalities
 

  2.Client <--> OSD

  数据IO
 

  3.Client <--> Monitor

  认证,集群map信息等
 

  4.MDS <--> Monitor

  心跳,集群map信息等
 

  5.MDS <--> OSD

  元数据IO
 

  6.Monitor <--> OSD

  心跳,集群map信息等
 

  1.4 CephFS MDS组件

  Ceph MDS设计的比较强大,作为一个能存储PB级数据的文件系统,它充分考虑了对元数据服务器的要求,设计了MDS集群。另外也引入了MDS的动态子树迁移,MDS的热度负载均衡。

 

  但也正是这么超前的设计,使得MDS集群很难做到稳定,所以目前Jewel版本里默认还是单MDS实例,用户可配置主从MDS实例,提高可用性。但在未来,MDS集群的这些属性都将稳定下来,为我们提供超强的元数据管理性能。

  Client端访问CepFS的步骤如下:
 

  1.client端与MDS节点通讯,获取metadata信息(metadata也存在osd上)
 

  2.client直接写数据到OSD

  2.1 Client端访问CephFS示例

  1.Client发送open file请求给MDS

  2.MDS返回file inode,file size,capability和stripe信息

  3.Client直接Read/Write数据到OSDs

  4.MDS管理file的capability

  5.Client发送close file请求给MDS,释放file的capability,更新file详细信息

  这里cephfs并没有像其他分布式文件系统设计的那样,有分布式文件锁来保障数据一致性。它是通过文件的capability来保证的
 

  2.2 CephFS相关命令

  创建MDSDaemon

  # ceph-deploy mds create <…>

  创建CephFSData Pool

  # ceph osd pool create <…>

  创建CephFSMetadata Pool

  # ceph osd pool create <…>

  创建CephFS

  # ceph fs new <…>

  查看CephFS

  # ceph fs ls

  name: tstfs, metadatapool: cephfs_metadata, data pools: [cephfs_data ]

  删除CephFS

  # ceph fs rm--yes-i-really-mean-it

  查看MDS状态

  # ceph mds stat

  e8: tstfs-1/1/1 uptstfs2-0/0/1 up {[tstfs:0]=mds-daemon-1=up:active}

  e8

  e表示epoch

  8是epoch号

  tstfs-1/1/1 up

  tstfs是cephfs名字

  三个1分别是 mds_map.in/mds_map.up/mds_map.max_mds

  up是cephfs状态

  {[tstfs:0]=mds-daemon-1=up:active}

  [tstfs:0]指tstfs的rank 0

  mds-daemon-1是服务tstfs的mds daemon name

  up:active是cephfs的状态为 up & active
 

  2.3 mount使用CephFS

  1.CephFS kernel client

  # mount -t ceph:6789 /mntdir

  # umount /mntdir
 

  2. CephFS FUSE

  安装ceph-fusepkg

  # yum install -y ceph-fuse

  # ceph-fuse -m:6789 /mntdir

  # fusermount -u /mntdir

  centos7里没有fusermount命令,可以用umount替代

 

  FUSE的IO Path较长,会先从用户态调用到内核态,再返回到用户态使用CephFSFUSE模块访问Ceph集群,如下图所示:

  对比

  性能:Kernel client > ceph-fuse

  Quota支持:只有ceph-fuse(client-side quotas)

  Quota不是在CephFS后端实现的,而是在client-side实现的。若某些应用中要求使用Quota,这时就必须考虑使用CephFSFUSE了
 

  3、CephFSLayout

  Cephfs支持配置目录、文件的layout和stripe,这些元数据信息保存在目录和文件的xattr中。

  目录的layout xattrs为:ceph.dir.layout

  文件的layout xattrs为:ceph.file.layout

  CephFS支持的layout配置项有:

  pool

  数据存储到指定pool

  namespace

  数据存储到指定namespace,比pool更细的粒度(rbd/rgw/cephfs都还不支持)

  stripe_unit

  条带大小,单位Byte

  stripe_count

  条带个数

  默认文件/目录继承父目录的layout和striping

  示例:配置一个目录的Layout

  # setfattr -n ceph.dir.layout -v "stripe_unit=524288stripe_count=8 object_size=4194304 pool=cephfs_data2" /mnt/mike512K/

 

  目录中一个9MB的文件的layout分布图为:

  4、CephFS认证

  有时候可能应用有这样的需求,不同的用户访问不同的CephFS目录,这时候就需要开启CephFS的认证。

  不过首先需要开启的是Ceph集群的认证,然后就可以创建CephFS认证的client端了,指定client对mon,mds,osd的访问权限。
 

  4.1 开启Ceph集群认证

  配置ceph.conf

  # vim /etc/ceph/ceph.conf

  auth_cluster_required = cephx

  auth_service_required = cephx

  auth_client_required = cephx
 

  4.2 创建CephFS认证的client

  # ceph auth get-or-create client.*client_name* \

  mon 'allow r' \

  mds 'allow r, allowrw path=/*specified_directory*' \

  osd 'allow rwpool=’

  示例与解释:

  # ceph auth get-or-create client.tst1 mon ‘allow r’ mds ‘allow r,allow rw path=/tst1’ osd ‘allow rw pool=cephfs_data'

  mon ‘allow r’

  允许client从monitor读取数据;必须配置

  mds ‘allow r, allow rw path=/tst1’

  允许client从MDS读取数据,允许client对目录/tst1读写;

  其中‘ allow r’必须配置,不然client不能从mds读取数据,mount会报permission error;

  osd ‘allow rw pool=cephfs_data

  允许client从osd pool=cephfs_data上读写数据;

  若不配置,client只能从mds上获取FS的元数据信息,没法查看各个文件的数据

  对osd的权限也是必须配置的,不然client只能从mds上获取fs的元数据信息,没法查看文件的数据
 

  4.3 检查ceph auth

  # ceph auth get client.tst1

  exported keyring for client.tst1

  [client.tst]

  key =AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==

  caps mds = allow r, allow rwpath=/tst1"

  caps mon = "allow r"

  caps osd = "allowrw pool=cephfs_data"
 

  4.4 mount测试

#mount-t ceph:6789:/tst1/mnt -oname=tst1,secret=AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==
 

  4.5 认证机制不完善

CephFS的认证机制还不完善,上述client.tst1可以mount整个CephFS目录,能看到并读取整个CephFS的文件

#mount-t ceph:6789://mnt -oname=tst1,secret=AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==

  另外没找到能支持readonly访问某一目录的方法。

  只验证了cephfs kernel client,没试过ceph-fuse的认证
 

  5、CephFS的 FSCK & Repair

  FS的fsck和repair对一个文件系统是非常重要的,如果这个没搞定,一个文件系统是不会有人敢用的。

  Ceph在Jewel版本里提供了Ready的CephFS的scrub和repair工具,它哪能处理大部分的元数据损坏。

  但在使用中请记住两点:

  1.修复命令慎重执行,需要专业人士操作

  2.若命令支持,修复前请先备份元数据
 

  5.1 Cephfsjournal工具

  cephfs-journal-tool,用来修复损坏的MDS journal,它支持的命令有下面几类,详细的介绍看下help就明白了。

  cephfs-journal-tool:

  -inspect/import/export/reset

  - header get/set

  - eventget/apply/recover_dentries/splice
 

  5.2 Cephfsonline check/scrub

  ceph tell mds.damage ls

  ceph tell mds.damage rm

  # scrub an inode and output results

  ceph mds mds.scrub_path{force|recursive|repair [force|recursive|repair...]}
 

  5.3 Cephfsoffline repair

  cephfs-data-scan init [--force-init]

  cephfs-data-scan scan_extents [--force-pool]

  cephfs-data-scan scan_inodes [--force-pool] [--force-corrupt]

  cephfs-data-scan scan_frags [--force-corrupt]

 

  cephfs-data-scan tmap_upgrade