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