Cephfs的MDS侧元数据池和mdcache存储数据结构分析

原文地址:https://segmentfault.com/a/1190000041824048

元数据池中的数据结构

1,Dir

Cephfs 的元数据池中主要存放着目录dir或目录分裂后的分片对象,数据池中存放着文件的对象(根据偏移可以划分多个)。

查看名为vdb.1_1.dir(目录下有100万个文件)的目录的inode号为1099511627788,转换为16进制为1000000000C
1

通过inode号在metapool里搜到513个对象,去掉原目录1000000000c.00000000,可以看到该目录存在512个目录分片,每个分片由inode号1000000000c和分片号frag_t(32位)组成,前8位表示有效位数,后面24位为value值,这里前8位为09表示value前9位有效。每一个目录分片在元数据池中作为一个dir对象存在。

[root@node2 cephfs]# rados -p cephfs-metadata ls
2

2,Dentry和Inode组织结构

通过查看元数据池中目录分片的内容,我们可以看到对应dir对象中存在的文件的dentry和inode信息,以1000000000c.09640000分片为例,如下可见dir对象中存放的items map记录管理的目录项dentry, 每一个目录或文件的dentry信息以key-value键值对的形式存在dir中。

[root@node2 testSetattr]# rados -p cephfs-metadata listomapvals 1000000000c.09640000
3

以文件vdb_f0033为例,在其所在的分片1000000000c.09640000中,key是以文件名_head的形式存在,value里面存放着对应文件的元数据inode信息(包含inode号,如上图红框所示为1000000002D,小端模式需要倒着看。
从数据池中能找到这个对象,对象的名称为文件的inode号.编号(总大小/对象大小object_size个),对象存的数据多了就根据偏移拆成多个)
4

我们目前的目录vdb.1_1.dir的下级文件的元数据信息就全部找到了,按照元数据的组织结构,不管是文件或者目录,其inode信息和dentry都存放在其上级目录dir(或者对应分片)的items map之内。
5

以vdb.1_1.dir为例,其父目录为testSetattr,inode号为109951163887,转成16进制为10000002B59。查看10000002b59.00000000对象可以找到vdb.1_1.dir的元数据信息。

[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 10000002b59.00000000
6

由于testSetattr目录上级目录就是文件系统根目录,所以其inode信息存放在根目录的dir对象中(根目录的inode号为1),通过以下命令查到
[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 1.00000000
7

而针对于根目录的inode信息,存放在1.00000000.inode对象当中。

内存对象中的结构

8

大体的内存组织结构借用上图表示,下面详细介绍:

1,Dir

CInode          *inode;  // my inode
frag_t           frag;   // my frag
...
dentry_key_map   items;

Dir内存结构主要是其自身的inode索引和当前的分片号,以及存在其中的dentry 列表items,具体参数见Dir.h。
通过CDir::fetch()读取metapool中的数据,填充自己的CDir::items,从而在内存初中创建相应的dentry和inode结构。

2,Dentry

9

10

简要地说,dentry的内存结构主要包含对应文件或目录的名字mempool::mds_co::string name,其归属的目录或者分片CDir *dir,以及链接的inode信息linkage_t linkage,链接linkage包含inode或remote inode(跟硬链接有关)索引。

3,Inode

11

12

13

Inode的数据结构较为复杂,主要变量CDentry *parent(正常链接的primary dentry)和remote_parents(硬链接使用),指向其所链接的dentry,dirfragtree是当前inode为dir的情况下指向对应目录分片。
主要信息存在其继承的InodeStoreBase类中,其包含了具体inode信息所在的inode_t(即mempool_inode结构),和对应文件或目录的扩展属性xattr,inode_t则包含了传统inode的元数据信息,包括ctime、mtime、mode、uid、gid等等具体的属性信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值