下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MongoDB分布式存储——GridFS

作者:课课家教育     来源: http://www.kokojia.com点击数:1639发布时间: 2017-08-29 08:00:14

标签: MongoDBGridFS存储文件

  mongodb除了保存各种文档(JOSN结构)外还能够保存文件。MongoDB的文档以BSON格式存储,支持二进制数据类型,所以,可以把文件的二进制格式的数据直接保存到MongoDB的文档中,但是每个文档的长度是有限制的,而我们一般上传的图片、视频等文件又比较大。针对这种情况,mongoDB提供了一种处理大文件的规范——GridFS。GridFS规范提供了一种透明机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。

  一、实现原理:

  将要存储的文件分成若干块儿,每一块作为一个单独的文档来存储,每块默认大小为256k。用两个集合来存储一个文件:fs.files与fs.chunks。

  fs.files存放文件信息

一、实现原理:    将要存储的文件分成若干块儿,每一块作为一个单独的文档来存储,每块默认大小为256k。用两个集合来存储一个文件:fs.files与fs.chunks。    fs.files存放文件信息

  文件的元数据放在这个集合里面,默认fs.files。这个里面的每个文档表示GridFS中的一个文件,与文件相关的自定义元数据也保存在其中,除了用户自定义的键,GridFS还有默认的一些键:

  1._id:唯一标识

  2.length:文件总长度

  3.chunksize:没块儿的大小,默认为256k

  4.uploadDate:时间戳

  5.md5:文件内容的md5校验和,值由服务器端生成,用于计算上传块的md5校验和,用户可以校验md5的值确保文件正确上传。contentType:文件类型还可以添加其他键来标识这个文件,例如,可以是上传者的信息。

  fs.chunks:存放文件的数据

      GridFS的块有个单独的集合。默认情况下,块将使用fs.chunks集合,如果有需要可以覆盖。这个块集合里面文档的结构非常简单:

 fs.chunks:存放文件的数据        GridFS的块有个单独的集合。默认情况下,块将使用fs.chunks集合,如果有需要可以覆盖。这个块集合里面文档的结构非常简单:

  1._id:标志唯一

  2.n:表示块的编号,也就是这个块在原文件中的顺序号

  3.data:包含组成文件块的二进制数据

  4.files_id:包含这个块元数据的文件文档的"_id"

  二、保存文件的流程

  如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。

  三、读取文件的流程:

  先据查询的条件,在fs.files中找到对应的文档,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。

  四、什么情况下使用?

  在MongoDB文档集合,你应该总是使用GridFS存储文件大于16MB。在某些情况下,在MongoDB数据库比系统级文件系统存储大文件可能更有效。

  (1)如果你的文件系统限制一个目录中的文件的数量,你可以根据需要使用GridFS文件系统存储尽可能多的文件。

  (2)当你想让你的文件和元数据自动同步和部署多个系统和设施。当使用分布式副本集MongoDB可以分发文件和元数据自动生成mongod实例和设施。

  (3)当您想要访问的信息来自部分大文件,而无需全部文件加载到内存中,您可以使用GridFS召回部分文件不用读取整个文件到内存中。

  如果需要自动更新整个文件的内容,不要使用GridFS。作为替代,你可以将每个文件存储多个版本,每个文件并指定元数据文件的当前版本。

  当上传新版本的文件之后,您可以更新元数据字段,在原子钟标明最新状态。之后删除以前的版本。

  五、注意:

  GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。

  小编结语:

  更多内容尽在课课家教育!

赞(10)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程