元数据子系统
元数据子系统是一个以内存为中心的分布式数据结构,是由一个或多个元数据分片组成。
元数据子系统数据使用 Multi-Raft 来充分使用服务器资源和保障数据高可用及强一致性,可以很方便的迁移资源,并通过分裂实现横向扩展。
元数据内部设计
每个元数据可以包含成百上千的元数据分片,每个分片由 InodeTree(BTree)
和 DentryTree(BTree)
组成。
每个 inode
代表文件系统中的一个文件或目录, 每个 dentry
代表一个目录项,dentry
由 parentId
和 name
组成。
- 在
DentryTree
中,以ParentId
和name
组成索引,进行存储和检索 - 在
InodeTree
中,则以inode id
进行索引。 - 使用 multiRaft 协议保障高可用性和数据一致性复制,且每个节点集合会包含大量的分片组,每个分片组对应一个
raft group
。 - 每个分片组隶属于某个 volume,分片组都是某个 volume 的一段元数据范围(
inode id
范围[100-20000)
) - 元数据子系统通过分裂来完成动态扩容
- 当一分片组的性能(包含如下指标:内存)紧接临近值时,资源管理器服务会预估一个结束点,并通知此组节点设备,只服务到此点之前的数据,同时也会新选出一组节点,并动态加入到当前业务系统中,新节点组起始点刚好是上个节点组的结束点位置。
复制
元数据更新的复制是以元数据分片为单位的。复制强一致性是通过 Raft 算法的改良版本 MultiRaft 来实现的。MultiRaft 可以减少心跳通信的负担。
故障恢复
内存元数据分片通过快照的方式持久化到磁盘以作备份和恢复使用,日志压缩技术被用来减小日志文件大小和恢复时间。
值得一提的是,元数据操作有可能会导致孤儿 inode,即只有 inode 但是没有对应的 dentry。为了减少这种情况的发生,
- 首先,元数据节点通过 Raft 保证高可用,单点故障后可以迅速恢复
- 其次,客户端保证在一定时间内进行重试
更多详情
更多详情请查看 CubeFS 存储技术揭秘|元数据设计
在github上编辑