简介:
什么是GridFS
GridFS 是基于MongoDB的分布式文件存储系统。 它是Mongo的一个子模块, 使用GridFS可以基于MongoDB来持久存储文件并且支持分布式应用(文件分布存储和读取)。
GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持的驱动均实现了GridFS规范。GridFS制定大文件在数据库中如何处理,通过开发语言驱动来完成、通过API接口来存储检索大文件。
为什么要使用GridFS
作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这些文件。
具体总结起来有四个原因:
1, 存储用户产生的内容。
大型网站允许用户盛传文件,使用关系数据库时,这些用户产生的内容通过存储在文件系统,然后关系数据库存储了对应文件路径。这样做会导致很多问题,例如如何在其他机器上复制这些文件, 如何删除有副本, 如何恢复等等。 GridFS通过将这些文件和数据库存储在一起解决这个问题。使用MongoDB的副本机制时,文件也会在所有副本上拷贝,删除时也会在所有副本上删除。
2,访问部分文件内容
当文件上传到GridFS上,文件会被分割为256K大小的chunk,单独存储。当只需要读取一部分文件内容时,只有对应chunk的数据会加载到内存中,当选择读取或者编辑多媒体内容时,这一点非常有用
3, 存储大于16M的文件
默认,MongoDB的文档大小限制在16MB以内。因此如果文档大于16M,你可以使用GridFS存储。
4, 克服文件系统的限制
存储大量文件时,我们需要考虑文件系统的限制,例如最大的文件或者目录数等等。 有了GridFS,就不用担心文件系统的限制了,使用GridFS和MongoDB的sharding模式,我们可以将文件分布到不同的服务器上,基本不会增加运维复杂性。
具体使用
<使用shell命令>
mongoDB提供mingofiles工具,可以使用命令行来操作GridFS。其实有四个主要命令,分别为:
put —存储命令
get —获取命令
list —列表命令
delete —删除命令
这些命令都是按照filename操作GridFS中存储的文件的。
上传文件
删除文件
释放空间
GridFs不会自动处理md5值相同的文件,也就是说,同一个文件进行两次put命令,将会在GridFS中对应两个不同的存储,对于存储来说,这是一种浪费。对于md5相同的文件,如果想要在GridFS中只有一个存储,需要通过API进行扩展处理。
MongoDB 不会释放已经占用的硬盘空间。即使删除db中的集合 MongoDB也不会释放磁盘空间。同样,如果使用GridFS存储文件,从GridFS存储中删除无用的垃圾文件,MongoDB依然不会释放磁盘空间的。这会造成磁盘一直在消耗,而无法回收利用的问题。
如何回收删除文件释放的磁盘空间?
可以通过修复数据库来回收磁盘空间,即在mongo shell中运行db.repairDatabase()命令或者db.runCommand({ repairDatabase: 1 })命令。(此命令执行比较慢)。修复时最好先备份mongoDB的存储目录。尤其注意该·操作会独占write lock。
引用:
1, https://docs.mongodb.com/manual/core/gridfs/
2, https://scalegrid.io/blog/when-to-use-gridfs/
3, https://docs.mongodb.com/manual/reference/program/mongofiles/#bin.mongofiles
4, https://docs.mongodb.com/v4.0/reference/command/repairDatabase/#dbcmd.repairDatabase
5, https://dzone.com/articles/reclaiming-disk-space-from-mongodb