2.3.?MRC - 元数据目录服务

2.3.1. 体系结构
2.3.2. 处理阶段(Processing Stage)
2.3.3. 元数据缓存
2.3.4. 卷的元数据管理
2.3.5. 文件和目录的元数据管理

元数据目录服务(MRC)负责管理UXFS中的所有元数据。 MRC的核心任务是卷和目录树的管理,以及文件、目录元数据的存储和访问控制。

2.3.1.?体系结构

除了监听客户端的RPC请求之外,MRC架构还包括两个核心组件:处理阶段(Processing Stage)和元数据缓存。每一个被RPC服务端接收到的请求都会被解析并转发到处理阶段,处理阶段执行相应的文件系统处理逻辑。在文件系统逻辑执行期间,需要检索或修改的数据都会存储在元数据缓存中。

2.3.2.?处理阶段(Processing Stage)

MRC接口包含多个操作(operation)。每个operation都被用来响应某个请求并执行对应的操作逻辑,例如打开文件、读取目录内容,创建卷等。操作的命名和参数设置类似于对应的POSIX调用。为了避免底层数据库中的锁相关的问题,澳门游戏平台注册网站在每个卷上对操作进行序列化,即在同一卷上最多可以同时执行一个操作。所有操作都具有相似的结构。首先,执行授权检查,以确定发送请求的用户是否具有足够的权限来执行该操作。如果结果是肯定的,则执行后面的操作逻辑。执行这些操作可能涉及对元数据缓存的多次访问。一个readdir操作不但需要在元数据缓存中查找这个目录中所包含的内容,还会通过setxattr请求将文件的扩展属性添加至元数据缓存。澳门游戏平台注册网站在第二节中详细介绍了所有MRC的接口和操作。

2.3.3.?元数据缓存

元数据缓存将数据按照键值对的形式进行存储,这些数据会被高频访问。如新文件的创建可能需要进行多次数据修改,因为需要在缓存中插入文件元数据对象、建立父目录的链接、更新父目录的时间戳等等。多个这样的修改会被整合为一个操作,这使得澳门游戏平台注册网站可以原子地进行这一组更新。

元数据缓存通过接口实现与其他的MRC代码分离,这为开发人员提供了实现自己的缓存机制的机会。目前使用的实现基于Redis。

UXFS元数据如何与Redis的键值对相互映射将在下面描述。

2.3.4.?卷的元数据管理

卷的元数据信息以文件夹的形式存储在redis数据库中,存储格式参阅第?2.3.5?节

另,卷名称以“volume-name”为key存储在redis数据库中,如下:

表?2.1.?卷名称

名称描述
volumeName以”volume-name”为key的list结构,列表中存储的是所有卷的名称。

卷的属性信息存储在Xattr索引中(格式参阅Xattr索引介绍)所有属性如下:

表?2.2.?卷属性

名称描述
fileAccPolID卷的文件访问策略ID
osdPolID卷的OSD选择策略ID
offsVolName'volName'元素的偏移位置,相对于缓冲区第一个字节的偏移量
offsPolArgs'osdPolArgs'元素的偏移位置,相对于缓冲区第一个字节的偏移量
volID卷的UUID字符串
volName卷的名称字符串
osdPolArgs卷的OSD选择策略参数字符串

2.3.5.?文件和目录的元数据管理

卷下的文件和文件夹元数据也存储在Redis数据库中,其名称等于卷的UUID。各种用于管理文件和目录元数据的索引,将在下表中进行描述。澳门游戏平台注册网站在设计时已经考虑到如下目标:

  • 频繁调用的操作所执行的查询应该尽可能快,例如给定路径的元数据查找。

  • 经常更新的数据应尽可能少的包含低频修改的数据。

  • 经常执行的数据库更新应该是快速的,所以尽可能少的插入索引。

  • 索引应包含尽可能少的冗余,以便数据库大小和内存占用最小化。

考虑到上述目标,澳门游戏平台注册网站决定为文件的主要元数据建立一个主索引,该索引将由父目录ID和文件名哈希值组成。这样,父目录ID的Redis前缀查找可用于有效地检索目录的内容,从而用于检索单个文件的元数据。由于POSIX需要支持硬链接,即指向相同元数据的目录条数可能不同,而且某些操作需要通过文件ID检索文件元数据,因此澳门游戏平台注册网站决定通过以下方式检索元数据的二级索引文件ID,其他索引用于存储其他扩展属性和权限控制列表。

表?2.3.?文件和目录元数据的索引

名称描述
文件索引存储目录条目的主要元数据。索引中的值可能有不同的类型:
  • 很少更改元数据 - 封装所有不经常更改的元数据,例如文件名,访问模式或文件所有权,和副本位置元数据(封装文件的x-Location列表);

  • 硬链接目标 - 如果一个文件存在额外的硬链接,则该值是硬链接目标,即文件ID索引中的键。然后将分两步执行文件元数据查找:首先,将执行文件索引中的查找,以便检索硬链接目标;然后,将在文件ID索引中查找元数据。

Xattr索引包含文件和目录的任何扩展属性。这包括Softlink目标和默认切片策略,因为它们映射到扩展属性。
ACL索引包含所有文件的访问控制列表条数。
文件ID索引文件ID索引用于通过其ID检索文件元数据。 如果没有为文件创建硬链接,则文件ID将映射到文件索引中的键,必须通过第二次查找检索元数据。 这种映射是必需的,对于基于文件ID而不是路径名的某些操作。 如果已创建硬链接,则文件ID将直接映射到三种不同类型的主文件元数据(即,很少和频繁更改的元数据,以及副本位置)。在这种情况下,文件索引中的文件条数指向文件ID索引中的相应前缀键。
卷信息索引卷信息。包括文件夹数量,文件数量和卷的大小。
volumeName+path文件相关的经常更改的元数据 - 封装经常修改的所有元数据,例如时间戳或文件大小。

  1. 文件索引

    • key

      表?2.4.?文件索引-key

      名称Bytes描述
      parentID8父目录的文件ID
      fileNameBytesfileNameBytes.length文件名字符串的byte数组值
      Type1元数据类型(0 =经常更改的元数据,1 =很少更改的元数据,3 =硬链接目标)

    • value, type = 0

      表?2.5.?文件索引-value, type = 0

      名称Bytes描述
      fcMetadata12目录中频繁更改的与目录关联的元数据(请参阅fcMetadata定义中directories部分),12个字节用于目录

    • value, type = 1

      表?2.6.?文件索引-value, type = 1

      名称Bytes描述
      rcMetadatavar很少更改与文件关联的元数据(请参阅rcMetadata定义)

  2. Xattr索引

    • key

      表?2.7.?Xattr索引-key

      名称Bytes描述
      fileID8已分配扩展属性的文件的ID
      ownerHash4属性owner的哈希值
      attrNameHash4属性名称的哈希值
      collCount2计数器随着(ownerHash,attrNameHash)对的每次碰撞而递增 - 将被省略,除非将不同的属性散列到相同的对

    • value

      表?2.8.?Xattr索引-value

      名称Bytes描述
      keyOffset2属性键值对中key的偏移量
      valOffset2属性键值对中value的偏移量
      ownerBytesownerBytes.length所属用户字符串的bytes值
      keyByteskeyBytes.length属性键值对中key的bytes值
      valueBytesvalueBytes.length属性键值对中key对应的value值

  3. ACL索引

    • key

      表?2.9.?ACL索引-key

      名称Bytes描述
      fileID8已分配扩展属性的文件的ID
      entityBytesentityBytes.length与ACL条目关联的实体的名称

    • value

      表?2.10.?ACL索引-value

      名称Bytes描述
      rights2实体的访问权限

  4. 文件ID索引

    • key

      表?2.11.?文件ID索引-key

      名称Bytes描述
      fileID8文件的ID
      type1元数据类型(0 =经常更改的元数据,1 =很少更改的元数据,3 =硬链接目标)

    • value, type = 0

      表?2.12.?文件ID索引-value, type = 0

      名称Bytes描述
      fcMetadata12频繁更改与文件关联的元数据(请参阅fcMetadata定义中directories部分),12个用于目录

    • value, type = 1

      表?2.13.?文件ID索引-value, type = 1

      名称Bytes描述
      rcMetadatavar很少更改与文件关联的元数据(请参阅rcMetadata定义)

    • value, type = 3

      表?2.14.?文件ID索引-value, type = 3

      名称Bytes描述
      parentID8存储文件元数据的父目录的ID
      fileNamevar父目录中的文件名

  5. 卷信息索引

    • key

      表?2.15.?卷信息索引-key

      名称Bytes描述
      NUM_*_KEY1表中的key,NUM_DIRS_KEY,NUM_FILES_KEY,VOL_SIZE_KEY

    • 卷信息索引-value, key=NUM_DIRS_KEY

      表?2.16.?卷信息索引-value, key=NUM_DIRS_KEY

      名称Bytes描述
      count8当前卷中文件夹的总数

    • 卷信息索引-value, key=NUM_FILES_KEY

      表?2.17.?卷信息索引-value, key=NUM_FILES_KEY

      名称Bytes描述
      count8当前卷中文件的总数

    • 卷信息索引-value, key=VOL_SIZE_KEY

      表?2.18.?卷信息索引-value, key=VOL_SIZE_KEY

      名称Bytes描述
      size8当前卷的总长度,由所有文件的长度相加所得

  6. volumeName+path

    • key

      表?2.19.?volumeName+path-key

      名称Bytes描述
      parentID8父目录的文件ID
      fileNameBytesfileNameBytes.length文件名字符串的byte数组值
      Type1元数据类型(0 =经常更改的元数据)

    • volumeName+path-value, key=NUM_DIRS_KEY

      表?2.20.?卷信息索引-value, key=NUM_DIRS_KEY

      名称Bytes描述
      fcMetadata20频繁更改与文件关联的元数据(请参阅fcMetadata定义中files部分),20个字节用于文件和符号链接

上面的索引描述中引用的数据类型如下所示:

  1. 经常更改元数据(fcMetadata)

    • files

      表?2.21.?经常更改元数据(fcMetadata)-files

      名称Bytes描述
      epoch4当前的截断时期
      ctime4自1970年以来以秒为单位的文件元数据更改时间戳
      mtime4自1970年以来以秒为单位的文件内容修改时间戳
      size8文件大小(字节)

    • directories

      表?2.22.?经常更改元数据(fcMetadata)-directories

      名称Bytes描述
      atime4自1970年以来以秒为单位的文件访问时间戳
      ctime4自1970年以来以秒为单位的文件元数据更改时间戳
      mtime4自1970年以来以秒为单位的文件内容修改时间戳

  2. 很少更改元数据(rcMetadata)

    • files

      表?2.23.?很少更改元数据(rcMetadata)-files

      名称Bytes描述
      type1条目的类型(0 =文件,1 =目录)
      fileId8文件ID
      mode4POSIX访问模式
      linkCount2文件的硬链接数
      w32attrs8特定于Win32的属性
      atime4自1970年以来以秒为单位的文件访问时间戳
      issEpoch4最后截断已发布的时期
      readOnly1指示文件是否适合只读复制的标志
      groupOffset2'group'元素的偏移位置,相对于缓冲区第一个字节的偏移量
      xLocOffset2文件保存在哪些osd上的信息的偏移量
      ownerBytesownerBytes.length文件所有者的用户标识
      groupBytesgroupBytes.length文件所有者的组ID
      xLocListxLocList.getLength()记录文件保存在哪些osd上的信息

    • directories

      表?2.24.?很少更改元数据(rcMetadata)-directories

      名称Bytes描述
      type1条目的类型(0 =文件,1 =目录)
      fileId8文件ID
      mode4POSIX访问模式
      linkCount2文件的硬链接数
      w32attrs8特定于Win32的属性
      groupOffset2'group'元素的偏移位置,相对于缓冲区第一个字节的偏移量
      ownerBytesownerBytes.length文件所有者的用户标识
      groupBytesgroupBytes.length文件所有者的组ID

  3. xLocList

    • xLocList

      表?2.25.?xLocList

      名称Bytes描述
      version4X-Locations列表的版本
      replCount4列表中的副本数量
      offsUpdPol4'updPol'元素的偏移位置,相对于缓冲区第一个字节的偏移量
      offs1...offsN4...4相对于缓冲区第一个字节的偏移量,所有副本的偏移位置
      xLoc1...xLocNvar...varX-Locations列表中的副本
      updPolvar更新策略字符串,描述如何传播副本更新

    • xLoc

      表?2.26.?xLoc

      名称Bytes描述
      offsOsdList2'osdList'元素的偏移位置,相对于缓冲区第一个字节的偏移量
      strPolvar与副本关联的切片策略
      osdListvar副本的所有OSD列表

    • strPol

      表?2.27.?strPol

      名称Bytes描述
      stripeSize4以kB为单位的单个条带(=对象)的大小
      width4切片的OSD数量
      patternvar包含条纹图案的字符串

    • osdList

      表?2.28.?osdList

      名称Bytes描述
      osdCount2列表中的OSD数量
      offsOSD1...offsOSDn2...2所有OSD UUID的偏移位置,相对于缓冲区第一个字节的偏移量
      osdUUID1...osdUUIDnvar...var列表中所有OSD的UUID

XML 地图 | Sitemap 地图