首页 > 数据库 >MongoDB GridFS最佳应用概述

MongoDB GridFS最佳应用概述

时间:2023-03-28 11:07:30浏览次数:33  
标签:files 文件 fs MongoDB 文件系统 概述 GridFS


《MongoDB GridFS最佳应用概述》

作者:chszs,转载需注明。

GridFS是MongoDB数据库之上的一个简单文件系统抽象。如果你熟悉Amazon S3的话,那么GridFS与之相似。为什么像MongoDB这样的NoSQL数据库会提供这样的一个文件层抽象呢?


一、使用GridFS的理由

理由如下:

1)存储用户产生的文件内容
大多数Web应用都允许用户上传文件。当用户使用关系数据库时,这些用户产生的文件会存储在文件系统中,与数据库相隔离,而不是放在数据库内。这就带来了一些问题。如何将文件复制到所有需要文件的服务器上?当文件删除后,怎样删除所有的拷贝?怎样保障文件的安全以及做灾备呢?GridFS很好地解决了这些问题,你可以利用你的数据库备份来备份你的文件。而且由于MongoDB自身的复制技术,在MongoDB集群中的每一个副本处都有你的文件拷贝。删除文件跟删除数据库中的对象一样简单。

2)访问文件内容的分区
当把文件上传到GridFS后,文件会被分割成大小为256KB的块,并单独存放。因此当你需要读文件中的某个范围的字节时,只需把相应的文件块载入内存,而无需把整个文件加载到内存。这一点对于选择读或编辑尺寸很大的媒体内容文件时非常有用。

3)在MongoDB中存储16MB以上的文件
MongoDB默认的文件大小上限为16MB。所以,如果你的文件超过了16MB,那么你就应该使用GridFS。

4)克服文件系统的限制
如果你需要存储大量的文件,你就需要考虑文件系统自身的限制,因为文件系统对目录下的文件数量是有要求的。而使用GridFS后,你无需再担心这个问题。GridFS和MongoDB的分片使得你的文件可以分布到多个服务器上,而且没有增加操作的复杂性。


二、深入GridFS

GridFS使用了两种集合Collection来存储数据

> show collections;
fs.chunks
fs.files
system.indexes
>

fs.files集合包含了文件的元数据,而fs.chunks集合则存储实际的以256KB尺寸进行分割的文件块。如果你有分片的集合,那么文件块会分布到多台服务器上,或许能获得比文件系统更好的性能。


> db.fs.files.findOne();
{
"_id" : ObjectId("530cf1bf96038f5cb6df5f39"),
"filename" : "./conn.log",
"chunkSize" : 262144,
"uploadDate" : ISODate("2014-02-25T19:40:47.321Z"),
"md5" : "6515e95f8bb161f6435b130a0e587ccd",
"length" : 1644981
}
>

MongoDB还在files_id和文件块数中创建了复合索引,以帮助快速访问这些文件块


> db.fs.chunks.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "files.fs.chunks",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"files_id" : 1,
"n" : 1
},
"ns" : "files.fs.chunks",
"name" : "files_id_1_n_1"
}
]
>


三、GridFS实例

MongoDB有一个内建的工具mongofiles,可以帮助练习实际使用GridFS的场景。请参阅相关的Driver文档,查看如何使用GridFS。

Put
#mongofiles -h  -u  -p  --db files put /conn.log
connected to: 127.0.0.1
added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 }
done!

Get
#mongofiles -h  -u  -p  --db files get /conn.log
connected to: 127.0.0.1
done write to: ./conn.log

List
# mongofiles -h  -u  -p  list
connected to: 127.0.0.1
/conn.log 1644981

Delete
[root@ip-10-198-25-43 tmp]# mongofiles -h  -u  -p  --db files delete /conn.log
connected to: 127.0.0.1
done!


四、GridFS的模块

如果你想把存储在MongoDB的GridFS的文件直接服务于Web服务器或文件系统,那么你可以使用下面的GridFS插件:
1)GridFS-Fuse:让GridFS的文件直接服务于文件系统
2)GridFS-Nginx:让GridFS的文件直接服务于Nginx


五、GridFS的局限性

GridFS也并非十全十美的,它也有一些局限性:
1)工作集
伴随数据库内容的GridFS文件会显著地搅动MongoDB的内存工作集。如果你不想让GridFS的文件影响到你的内存工作集,那么可以把GridFS的文件存储到不同的MongoDB服务器上。
2)性能
文件服务性能会慢于从Web服务器或文件系统中提供本地文件服务的性能。但是这个性能的损失换来的是管理上的优势。
3)原子更新
GridFS没有提供对文件的原子更新方式。如果你需要满足这种需求,那么你需要维护文件的多个版本,并选择正确的版本。


标签:files,文件,fs,MongoDB,文件系统,概述,GridFS
From: https://blog.51cto.com/prettycms/6154218

相关文章

  • 安装 MongoDB
    安装MongoDBhttps://www.mongodb.com/try/download/community如果是Yum安装,可以Package选项选server,然后拷贝链接后使用yum直接安装,如yuminstallhttps://repo.mongo......
  • Jmeter mongodb
    Jmeter5.0访问mongodb数据库,用MongoDBScript(DEPRECATED)的方法不能实现,会报错。改用JSR223Samplerpython的方式可以实现。附图   注意,一定要把模块的地址......
  • MongoDB修改最大连接数
    MongoDB修改最大连接数前言查询mongodb配置参数,可以知道最大连接的参数是maxIncomingConnections。但是修改参数后,查看支持的最大连接数还是默认的819.。原因:最大连接......
  • MongoDB进阶系统学习3——MongoDB高级操作
    第三部分:MongoDB高级操作5聚合分组统计(管道)5.1聚合aggregate聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道......
  • 可搜索加密(Searchable Encryption)机制概述
    引言[1]:可搜索加密(searchableencryption,SE)是近年来发展的一种支持用户在密文上进行关键字查找的密码学原语,能够为用户节省大量的网络和计算开销,并充分利用云端服务......
  • 元宇宙概述
    1、什么是元宇宙近来,“元宇宙”成为热门话题,越来越频繁地出现在人们的视野中。大家都在谈论它,但似乎还没有一个被所有人认同的定义。元宇宙究竟是什么?未来它会对我们的工作......
  • [软件设计] 软件系统总体结构设计 | 软件架构概述 [转载]
    1概述对于程序员而言,开始关注架构就是重大进步。就已经从单纯写代码的层次里跳了出来,至少从“增删改查”中跳了出来,能以更宏观的视角去思考代码、思考软件工程!这是一个......
  • 物联网操作系统概述
    物联网操作系统发展历史操作系统概述操作系统(OperatingSystem)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理:管理与配置内存、决定系统资源供需的优先次序、控......
  • mongoDB3.4 Localhost Exception
    localhostexception简单翻译为“本地主机例外”,主要对于开发者(运维人员)而言,通常使用mongoshell来操作mongodb。本地主机例外允许您启用访问控制,然后在系统中创建第一个用......
  • 2023爬虫学习笔记 -- MongoDB数据库
    一、下载安装mongodb1、下载地址https://www.mongodb.com/try/download/community2、一路下一步安装,路径不要出现空格中文等特殊字符3、设置环境变量将bin目录地址放到path......