共计 1996 个字符,预计需要花费 5 分钟才能阅读完成。
一,元数据池中的数据结构
1,Dir
Cephfs 的元数据池中次要寄存着目录 dir 或目录决裂后的分片对象,数据池中寄存着文件的对象(依据偏移能够划分多个)。
查看名为 vdb.1_1.dir(目录下有 100 万个文件)的目录的 inode 号为 1099511627788,转换为 16 进制为 1000000000C
通过 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,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
以文件 vdb_f0033 为例,在其所在的分片 1000000000c.09640000 中,key 是以文件名_head 的模式存在,value 外面寄存着对应文件的元数据 inode 信息(蕴含 inode 号,如上图红框所示为 1000000002D,小端模式须要倒着看。
从数据池中能找到这个对象,对象的名称为文件的 inode 号. 编号(总大小 / 对象大小 object_size 个),对象存的数据多了就依据偏移拆成多个)
咱们目前的目录 vdb.1_1.dir 的上级文件的元数据信息就全副找到了,依照元数据的组织构造,不论是文件或者目录,其 inode 信息和 dentry 都寄存在其下级目录 dir(或者对应分片)的 items map 之内。
以 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
因为 testSetattr 目录下级目录就是文件系统根目录,所以其 inode 信息寄存在根目录的 dir 对象中(根目录的 inode 号为 1),通过以下命令查到
[root@node3 cephfs]# rados -p cephfs-metadata listomapvals 1.00000000
而针对于根目录的 inode 信息,寄存在 1.00000000.inode 对象当中。
二,内存对象中的构造
大体的内存组织构造借用上图示意,上面具体介绍:
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
简要地说,dentry 的内存构造次要蕴含对应文件或目录的名字 mempool::mds_co::string name,其归属的目录或者分片 CDir *dir,以及链接的 inode 信息 linkage_t linkage,链接 linkage 蕴含 inode 或 remote inode(跟硬链接无关)索引。
3,Inode
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 等等具体的属性信息。