元数据子系统

元数据子系统是一个以内存为中心的分布式数据结构,是由一个或多个元数据分片组成。

元数据子系统数据使用 Multi-Raft 来充分使用服务器资源和保障数据高可用及强一致性,可以很方便的迁移资源,并通过分裂实现横向扩展。

元数据内部设计

每个元数据可以包含成百上千的元数据分片,每个分片由 InodeTree(BTree)DentryTree(BTree) 组成。

每个 inode 代表文件系统中的一个文件或目录, 每个 dentry 代表一个目录项,dentryparentIdname 组成。

  • DentryTree 中,以 ParentIdname 组成索引,进行存储和检索
  • InodeTree 中,则以 inode id 进行索引。
  • 使用 multiRaft 协议保障高可用性和数据一致性复制,且每个节点集合会包含大量的分片组,每个分片组对应一个raft group
  • 每个分片组隶属于某个 volume,分片组都是某个 volume 的一段元数据范围(inode id范围[100-20000)
  • 元数据子系统通过分裂来完成动态扩容
  • 当一分片组的性能(包含如下指标:内存)紧接临近值时,资源管理器服务会预估一个结束点,并通知此组节点设备,只服务到此点之前的数据,同时也会新选出一组节点,并动态加入到当前业务系统中,新节点组起始点刚好是上个节点组的结束点位置。

复制

元数据更新的复制是以元数据分片为单位的。复制强一致性是通过 Raft 算法的改良版本 MultiRaft 来实现的。MultiRaft 可以减少心跳通信的负担。

故障恢复

内存元数据分片通过快照的方式持久化到磁盘以作备份和恢复使用,日志压缩技术被用来减小日志文件大小和恢复时间。

值得一提的是,元数据操作有可能会导致孤儿 inode,即只有 inode 但是没有对应的 dentry。为了减少这种情况的发生,

  • 首先,元数据节点通过 Raft 保证高可用,单点故障后可以迅速恢复
  • 其次,客户端保证在一定时间内进行重试

更多详情

更多详情请查看 CubeFS 存储技术揭秘|元数据设计

在github上编辑