首页> 中国专利> 一种面向MongoDB的用户空间文件系统实现方法

一种面向MongoDB的用户空间文件系统实现方法

摘要

本发明公开了一种面向MongoDB的用户空间文件系统实现方法,包括以下步骤:构建用于储存文件目录结构信息以及节点元数据信息的fs.nodes集合,再创建MongoDB GridFS存储文件,同时在创建MongoDB GridFS存储文件的过程中自动生成用于存储文件元数据信息的fs.files集合及用于存储文件数据信息的fs.chunks集合,Linux文件系统与MongoDB数据库实现节点的创建及删除过程中通过fs.nodes集合、fs.files集合及fs.chunks集合关联,具体的,目录节点与fs.nodes集合相互关联,文件节点与fs.nodes集合、fs.files集合以及fs.chunks集合元素相互关联,节点与节点之间的父子关系由fs.nodes的链接结构所决定,本发明支持目录操作,并且具有占用存储空间少,读写效率高等优点。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-09-22

    未缴年费专利权终止 IPC(主分类):G06F17/30 专利号:ZL2014104692872 申请日:20140915 授权公告日:20160330

    专利权的终止

  • 2016-03-30

    授权

    授权

  • 2015-01-14

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20140915

    实质审查的生效

  • 2014-12-24

    公开

    公开

说明书

技术领域

本发明属于云存储领域,涉及一种用户空间文件系统实现方法,具 体涉及一种面向MongoDB的用户空间文件系统实现方法。

背景技术

在大数据的时代背景下,存储问题重新成为学术界和产业界的焦点, 传统的技术和方法已经很难应对由数据量的剧增而带来的新的挑战。云 存储正是在这一背景下在云计算概念上延伸和发展出来的一个新的概 念,指通过集群应用、网格技术或分布式文件系统等功能,将网络中大 量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外 提供数据存储和业务访问功能的一个系统。在云端,各种存储设备通过 应用软件集成管理起来(以MongoDB集群服务器为例),用户使用终 端(PC、手机等)通过互联网访问云端提供的存储服务。

用户空间文件系统(Filesystem in Userspace,简称FUSE)指完全在 用户态实现的文件系统。它方便开发人员在不触及内核的前提下轻松定 制新的文件系统。

在产业界,基于FUSE实现的用户空间文件系统已有很多,比较知 名的有ExpanDrive、GlusterFS、SSHFS等。

ExpanDrive:是一款很实用的网盘和云服务储存文件管理软件,可 以让用户本地化管理网盘或云存储中的文件,让文件修改、下载和删除 等操作变得非常简单。

GlusterFS:是一个大尺度文件系统。它是各种不同的存储服务器之 上的组合,这些服务器由以太网或无限带宽技术Infiniband以及远程直 接内存访问RDMA互相融汇,最终所形成的一个大的并行文件系统网 络。

SSHFS:可以把SSH连接到的主机资源,映射到本机的文件系统当 中,然后用户可以像操作本地文件一样进行操作,而实际的文件改动将 通过SSH传输到远程主机当中。

在学术界,相关文献有文献1及文献2,其中,文献1为邓宏涛在 江汉大学学报,Vol.38 No.2,Jun.2010发表的关系数据库中树型结构 信息的处理方法研究;文献2为汪建,方洪鹰,陈昌川在重庆师范大学 学报,Vol.24 No.4,Oct.2007发表的一种改进的基于数据库的树存储 策略。文献1介绍了树型结构的概念与特点,讨论了数据库中树形结构 信息的关系表结构设计方案,比较了关系数据库中树型结构信息的多种 处理方法,给出了采用自关联映射的表结构设计,并结合递归CTE技术 探讨了关系数据库中树型结构信息的具体实现方法。文献2讨论了如何 在关系数据库管理系统中存放压缩的一般树,并在维护海量数据的同时, 降低数据冗余。本发明方法针对上述文献对支持非关系型数据库的不足 之处,提出了在非关系型数据库MongoDB中存储树的方法。

GridFS-Fuse是将云端MongoDB GridFS数据库实例挂载至本地的一 个用户态文件系统。2009年Paul Rosania对其进行尝试的开发,在所公 布的发布版说明中指出GridFS-Fuse当前的未解决问题为:不支持目录 操作以及读写效率待验证。

发明内容

本发明的目的在于克服上述现有技术的缺点,提供了一种面向 MongoDB的用户空间文件系统实现方法,该实现方法支持目录操作,并 且具有占用空间少,读写效率高等优点。

为达到上述目的,本发明所述的面向MongoDB的用户空间文件系 统实现方法面向MongoDB的用户空间文件系统实现方法,其特征在于, 包括以下步骤:构建用于储存文件目录结构信息以及节点元数据信息的 fs.nodes集合,再利用MongoDB GridFS存储文件,同时在利用MongoDB  GridFS存储文件的过程中自动生成用于存储文件元数据信息的fs.files 集合及用于存储文件数据信息的fs.chunks集合,Linux文件系统与 MongoDB数据库实现节点的创建及删除过程中通过fs.nodes集合、 fs.files集合及fs.chunks集合关联,具体的,目录节点与fs.nodes集合相 互关联,文件节点与fs.nodes集合、fs.files集合以及fs.chunks集合相互 关联,节点与节点之间的父子关系由fs.nodes集合的链接结构所决定。

所述fs.nodes集合中的各个字段的含义如下:

_id字段:用于记录节点的全局唯一标识ID,类型为Object_id,由 mongoDB默认自动赋值;

name字段:用于记录节点的名称,类型为字符串;

type字段:用于记录节点的类型,类型为整型;

depth字段:用于记录节点所在树结构的深度,类型为整型;

abs_path字段:用于记录节点的绝对路径名称,即为根节点到当前 节点的路径,类型为字符串;

parent_id:用于记录节点的父节点ID,类型为Object_id;

meta_data:用于记录节点的元数据信息,类型为BSON;

其中,meta_data各个字段含义如下:

file_id字段:用于记录文件ID,类型为Object_id,其中,当节点是 文件,则file_id字段有效;当节点为目录时,则file_id字段无效;

mode字段:用于记录节点访问模式,类型为整型;

uid字段:用于记录用户id,类型为整型;

gid字段:用于记录组id,类型为整型;

nlink字段:用于记录节点连接数,类型为整型,当节点为文件时, 则nlink字段为该节点的连接数;当节点为目录时,则nlink字段为该目 录下所包含的子目录数;

atime字段:用于记录节点上一次存取时间;

mtime字段:用于记录节点上一次修改时间;

ctime字段:用于记录上一次状态修改时间。

所述节点的创建包括文件节点的创建及目录节点的创建。

所述文件节点的创建包括以下步骤:

检查所需创建的文件节点是否为空文件节点,当所述文件节点为空 文件节点时,则关闭MongoDB数据库,当所述文件节点不为空文件节 点时,则将Linux文件系统连接MongoDB数据库,并根据所需创建的 文件节点的绝对路径名称在MongoDB数据库中查找是否已存在该文件 节点,当在MongoDB数据库中已存在该文件节点时,则关闭MongoDB 数据库,当在MongoDB数据库中不存在该文件节点时,则创建MongoDB  GridFS对象,通过所述MongoDB GridFS对象将文件节点的内容写入 MongoDB数据库中,并获取文件ID,当没有成功获取文件ID,则直接 关闭MongoDB数据库,当成功获取文件ID,则根据当前绝对路径名称 计算父节点的绝对路径名,并通过父节点的绝对路径名查询获取父节点 ID,当不能通过父节点的绝对路径名查询获取父节点ID,则直接关闭 MongoDB数据库,当成功通过父节点的绝对路径名查询获取父节点ID, 则填充fs.nodes集合中各字段的值,并将该节点插入MongoDB数据库 中,当成功将该节点插入MongoDB数据库中时,则完成文件节点的创 建,当不能将该节点插入MongoDB数据库中时,则直接关闭MongoDB 数据库。

所述目录节点的创建包括以下步骤:

根据所需创建的目录节点的绝对路径名称查找是否已存在该目录节 点,当存在该目录节点时,则关闭MongoDB数据库,当不存在该目录 节点时,则根据当前绝对路径名称计算父节点的绝对路径名,当父节点 为根目录时,则将当前目录节点的父节点ID设置为NULL,然后填充当 前节点fs.nodes集合中各字段的值,再将将该目录节点插入MongoDB 数据库中;

当父节点不为根目录时,则通过父节点的绝对路径名查询获取父节 点ID,并修改父节点中连接数字段的值,当不能修改父节点中连接数字 段的值时,则关闭MongoDB数据库,当成功修改父节点中连接数字段 的值时,则将当前目录节点的父节点ID设置为NULL,然后填充当前节 点fs.nodes集合中各字段的值,再将将该目录节点插入MongoDB数据 库中。

所述节点的删除包括文件节点的删除及目录节点的删除。

所述文件节点的删除包括以下步骤:

将Linux文件系统连接MongoDB数据库,根据所需删除的文件节 点的绝对路径名称查找是否已存在该文件节点,当不存在该文件节点时, 则关闭MongoDB数据库,当存在该文件节点时,则从fs.nodes集合中 删除该文件节点,当不能从fs.nodes集合中删除该文件节点时,则直接 关闭MongoDB数据库,当成功从fs.nodes集合中删除该文件节点时, 则创建MongoDB GridFS对象,通过该MongoDB GridFS对象从 MongoDB数据库中删除该文件节点所对应的文件信息。

所述目录节点的删除包括以下步骤:

将Linux文件系统连接MongoDB数据库,根据所需删除的目录节 点的绝对路径名称查找是否已存在该目录节点。当不存在该目录节点, 则关闭MongoDB数据库,当存在该目录节点时,则计算该目录节点的 父节点绝对路径名称,当该目录节点的父节点绝对路径名称为根目录时, 则关闭MongoDB数据库,当目录节点的父节点绝对路径名称不为根目 录时,则修改父节点中连接数字段的值,当不能修改父节点中连接数字 段的值时,则关闭MongoDB数据库,当成功修改父节点中连接数字段 的值时,则针对当前节点的所有子节点,依据子节点类型,递归调用删 除文件节点中的Step 1-Step 5或递归调用删除目录节点中的Step 1-Step 6。

本发明具有以下有益效果:

本发明所述的面向MongoDB的用户空间文件系统实现方法通过目 录节点与fs.nodes集合相互关联,文件节点与fs.nodes集合、fs.files集 合以及fs.chunks集合元素相互关联,节点与节点之间的父子关系由 fs.nodes的链接结构所决定,从而实现节点的删除及创建,并且占用存 储空间少,查询效率高,通过fs.nodes集合不仅记录了节点间的关联关 系,同时也记录了节点自身的元数据信息,与分别对节点间关联关系和 对节点元数据设计表相比,节省了连接字段所占用的存储空间,针对文 件系统特有的按路径逐级查找文件或目录的特点,该结构又能很好地节 省读取查询中间节点元数据信息的时间,从而提高查询效率。

附图说明

图1为本发明中创建及删除节点的过程中的对应关系图;

图2为本发明中创建文件节点的流程图;

图3为本发明创建目录节点的流程图;

图4为本发明删除文件节点的流程图;

图5为本发明删除目录节点的流程图。

具体实施方式

下面结合附图对本发明做进一步详细描述:

参考图1,本发明所述的面向MongoDB的用户空间文件系统实现方 法包括以下步骤:构建用于储存文件目录结构信息以及节点元数据信息 的fs.nodes集合,再利用MongoDB GridFS存储文件,同时在利用 MongoDB GridFS存储文件的过程中自动生成用于存储文件元数据信息 的fs.files集合及用于存储文件数据信息的fs.chunks集合,Linux文件 系统与MongoDB数据库实现节点的创建及删除过程中通过fs.nodes集 合、fs.files集合及fs.chunks集合关联,具体的,目录节点与fs.nodes集 合相互关联,文件节点与fs.nodes集合、fs.files集合以及fs.chunks集合 元素相互关联,节点与节点之间的父子关系由fs.nodes集合内元素的链 接结构所决定。

树型文件目录结构在MongoDB数据库中的映射,MongoDB GridFS 存储文件时生成fs.files集合及fs.chunks集合,分别用于存储文件元数据 信息和文件数据信息,其中fs.files集合及fs.chunks集合内各字段的定义 分别如表1及表2所述:

表1

表2

字段名称 值类型 长度(字节) 说明 文件 文件夹 _id Object_id 12 块id × files_id Object_id 12 文件id × n int 4 块号 × data BinData 256*1024 数据 ×

所述fs.nodes集合中的各个字段的含义如下:

_id字段:用于记录节点的全局唯一标识ID,类型为Object_id,由 mongoDB默认自动赋值;

name字段:用于记录节点的名称,类型为字符串;

type字段:用于记录节点的类型,类型为整型;

depth字段:用于记录节点所在树结构的深度,类型为整型;

abs_path字段:用于记录节点的绝对路径名称,即为根节点到当前 节点的路径,类型为字符串;

parent_id:用于记录节点的父节点ID,类型为Object_id;

meta_data:用于记录节点的元数据信息,类型为BSON;

其中,meta_data各个字段含义如下:

file_id字段:用于记录文件ID,类型为Object_id,其中,当节点是 文件,则file_id字段有效;当节点为目录时,则file_id字段无效;

mode字段:用于记录节点访问模式,类型为整型;

uid字段:用于记录用户id,类型为整型;

gid字段:用于记录组id,类型为整型;

nlink字段:用于记录节点连接数,类型为整型,当节点为文件时, 则nlink字段为该节点的连接数;当节点为目录时,则nlink字段为该目 录下所包含的子目录数;

atime字段:用于记录节点上一次存取时间;

mtime字段:用于记录节点上一次修改时间;

ctime字段:用于记录上一次状态修改时间。

所述节点的创建包括文件节点的创建及目录节点的创建。

参考图2,所述文件节点的创建包括以下步骤:

检查所需创建的文件节点是否为空文件节点,当所述文件节点为空 文件节点时,则关闭MongoDB数据库,当所述文件节点不为空文件节 点时,则将Linux文件系统连接MongoDB数据库,并根据所需创建的 文件节点的绝对路径名称在MongoDB数据库中查找是否已存在该文件 节点,当在MongoDB数据库中已存在该文件节点时,则关闭MongoDB 数据库,当在MongoDB数据库中不存在该文件节点时,则创建MongoDB  GridFS对象,通过所述MongoDB GridFS对象将文件节点的内容写入 MongoDB数据库中,并获取文件ID,当没有成功获取文件ID,则直接 关闭MongoDB数据库,当成功获取文件ID,则根据当前绝对路径名称 计算父节点的绝对路径名,并通过父节点的绝对路径名查询获取父节点 ID,当不能通过父节点的绝对路径名查询获取父节点ID,则直接关闭 MongoDB数据库,当成功通过父节点的绝对路径名查询获取父节点ID, 则填充fs.nodes集合中各字段的值,并将该节点插入MongoDB数据库 中,当成功将该节点插入MongoDB数据库中时,则完成文件节点的创 建,当不能将该节点插入MongoDB数据库中时,则直接关闭MongoDB 数据库。

参考图3,所述目录节点的创建包括以下步骤:

根据所需创建的目录节点的绝对路径名称查找是否已存在该目录节 点,当存在该目录节点时,则关闭MongoDB数据库,当不存在该目录 节点时,则根据当前绝对路径名称计算父节点的绝对路径名,当父节点 为根目录时,则将当前目录节点的父节点ID设置为NULL,然后填充当 前节点fs.nodes集合中各字段的值,再将将该目录节点插入MongoDB 数据库中;

当父节点不为根目录时,则通过父节点的绝对路径名查询获取父节 点ID,并修改父节点中连接数字段的值,当不能修改父节点中连接数字 段的值时,则关闭MongoDB数据库,当成功修改父节点中连接数字段 的值时,则将当前目录节点的父节点ID设置为NULL,然后填充当前节 点fs.nodes集合中各字段的值,再将将该目录节点插入MongoDB数据 库中。

所述节点的删除包括文件节点的删除及目录节点的删除。

参考图4,所述文件节点的删除包括以下步骤:

将Linux文件系统连接MongoDB数据库,根据所需删除的文件节 点的绝对路径名称查找是否已存在该文件节点,当不存在该文件节点时, 则关闭MongoDB数据库,当存在该文件节点时,则从fs.nodes集合中 删除该文件节点,当不能从fs.nodes集合中删除该文件节点时,则直接 关闭MongoDB数据库,当成功从fs.nodes集合中删除该文件节点时, 则创建MongoDB GridFS对象,通过该MongoDB GridFS对象从 MongoDB数据库中删除该文件节点所对应的文件信息。

参考图5,所述目录节点的删除包括以下步骤:

将Linux文件系统连接MongoDB数据库,根据所需删除的目录节 点的绝对路径名称查找是否已存在该目录节点。当不存在该目录节点, 则关闭MongoDB数据库,当存在该目录节点时,则计算该目录节点的 父节点绝对路径名称,当该目录节点的父节点绝对路径名称为根目录时, 则关闭MongoDB数据库,当目录节点的父节点绝对路径名称不为根目 录时,则修改父节点中连接数字段的值,当不能修改父节点中连接数字 段的值时,则关闭MongoDB数据库,当成功修改父节点中连接数字段 的值时,则针对当前节点的所有子节点,依据子节点类型,递归调用删 除文件节点中的Step 1-Step 5或递归调用删除目录节点中的Step 1-Step 6。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号