MDrive: 在S3上实现POSIX文件系统
结合对象存储的可扩展性和POSIX的便利性,MDrive的设计哲学和技术决策
问题意识
基于表格的文件管理系统虽然提供了卓越的稳定性,但其文件夹结构表达复杂,权限管理困难,难以实现灵活的操作。
MDrive通过重新诠释Linux的Inode结构构建文件系统,实施POSIX文件系统接口,不仅对Linux用户友好,还可以让普通用户实现灵活操作。
核心设计1:索引节点系统
系统设计时最大的问题是“如何提供灵活且高效的文件系统”。
随着表格变得复杂和关系增多,查询效率可能下降或管理复杂化,并且系统的核心逻辑中变更点增多,结构可能遭到破坏。
此时,我们从Linux的inode结构中获得了灵感。Inode是Linux和UNIX系统中包含文件核心信息的数据结构。文件夹和符号链接等也被表示为文件,从而保持数据存储的一致性。
如果将其引入服务中,无需使用连接操作即可一次性获取数据,这样可以保持一致的数据存储。这不仅带来了性能上的提升,还能构建不变的核心逻辑,从而提高稳定性。
字段名 | 类型 | 说明 | 限制/属性 |
|---|---|---|---|
id | uuid.UUID | 基本标识符(UUID) | 唯一,不可变 |
type | enum | 节点类型 | 默认值:file |
size | int64 | 大小(如果是对象,则为外部存储数据大小) | 默认值:0 |
nlink | uint32 | 硬链接数量 | 默认值:1 |
content | []byte | 内联内容 | 最大4KiB |
atime | time.Time | 节点访问时间 | |
mtime | time.Time | 节点修改时间 | |
ctime | time.Time | 节点变更时间 | |
crtime | time.Time | 节点创建时间 | |
flags | uint32 | 标志位掩码 | 默认值:0 |
revision | string | 世代标识符(ULID) | 最多26个字符 |
与其完全仿效节点系统,不如如上所述,为MDrive系统量身设计表格。
去掉权限及块数据存储等被认为是外部系统角色或当前系统过多的部分,简化节点并编写表格。
i_block[EXT4_N_BLOCKS=15] 还考虑到数据存储在外部存储中,[]byte 形式将content字段中定义的按类型的json数据序列化并存储。
核心设计2:基于POSIX的文件管理
MDrive的主要特点之一是灵活而精准的驱动操作功能。从网页到将来新增的CLI工具,能够在多种环境下灵活操作文件,提供与一般存储不同的用户界面。此外,结合Inode系统,认为这种与操作系统的文件系统交互的结构对用户更为友好。
因此,将POSIX文件接口引入MDrive系统。可以通过诸如rm、ln、cp等用户熟悉的命令和功能操作文件,提供多种功能,所以在驱动系统中可以适当使用。