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

一,元数据池中的数据结构

1,Dir

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

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

通过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
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第1张图片

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
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第2张图片

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

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

以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
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第4张图片

由于testSetattr目录上级目录就是文件系统根目录,所以其inode信息存放在根目录的dir对象中(根目录的inode号为1),通过以下命令查到
[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 1.00000000
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第5张图片

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

二,内存对象中的结构

Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第6张图片

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

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

Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第7张图片
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第8张图片

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

3,Inode

Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第9张图片
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第10张图片
Cephfs的MDS侧元数据池和mdcache存储数据结构分析_第11张图片

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等等具体的属性信息。

你可能感兴趣的