Mongodb与GridFS

MongoDB篇——Java Maven项目中使用MongoDB GridFS上传音频图片 一、文件系统 先简单的介绍一下文件系统和分布式文件系统 1、文件系统:是操作系统用来存取文件的,计算机通过文件系统存放数据。大部分均基于磁盘存储,典型的文件系统包括unix 的UFS,NTFS是window NT的文件存储系统。传统文件系统主要面临的问题就是磁盘容量不够时,需要扩容才可继续进行文件存储,如同咱电脑内存不够加块内存条。 2、分布式文件存储系统:同传统的纵向扩容不 阅读详情

一、概述

    GridFS是基于mongodb存储引擎是实现的“分布式文件系统”,底层基于mongodb存储机制,和其他本地文件系统相比,它具备大数据存储的多个优点。GridFS适合存储超过16MB的大型文件,不过16M数据在当今互联网时代,已经不足为奇。我们可以使用GridFS构建大规模的“图片服务器”、“文档服务器”、“视频、音频”文件服务器,GridFS对于web应用,可以结合nginx插件“ningx-gridfs”能够简单的实现负载均衡等特性,非常便捷;可以简单认为GridFS是为web应用而生。个人认为,目前架构比较简单的NoSQL文件系统中GridFS是最优秀的。

 

    GridFS并不是将单个文件直接存储为一个document,而是将文件分成多个parts或者说chunks,然后将每个chunk作为作为一个单独的document存储,然后将chunks有序保存。默认情况下,GridFS的chunk大小位255k。GridFS使用2个collections来存储这些文件,一个collection存储文件的chunks(实际文件数据),另一个则存储文件的metadata(用户自定义的属性,filename,content-type等)。

 

    当用户查询GridFS中的文件时,客户端或者driver将会重新按序组装这些chunks。用户可以range查询文件,也可以获取文件的任意部分的信息,比如:跳过(skip)视频或者音频(任何文件)的中间部,实现“range access of single file”。

 

    对于mongodb而言,每个document最大尺寸为16M,如果想存储一条数据(比如一个文件)超过16M,那么只能使用GridFS支持;GridFS可以支持单个文件尺寸达到数G,读取文件时可以分段读取。此外,GridFS可以从Mongodb的高性能、高可用特性中获益,比如我们可以在“replica set”或者“sharding”架构模式下使用GridFS。

 

二、使用场景

    document的大小超过16M是使用GridFS的条件之一,因为mongodb普通的collection无法支持16M以上的document,我们不得不选择其他方案;在一些情况下,将这些大文件存储在GridFS中,比直接存储在本地文件系统中更加适合:

    1)如果你的文件系统对每个目录下文件的个数有限制(或者太多,将会影响文件的打开速度等)。

    2)如果你的文件数据,有分数据中心镜像保存(大数据情况,可用性保证)。

    3)如果你希望访问一个超大的文件,而不希望将它全部加入内存,而是有“range access”的情况,即分段读取,那么GridFS天生就具备这种能力,你可以随意访问任意片段。

 

    对于一个大文件,如果你希望原子性的更新它的全部内容,那么GridFS将不适合;比如同时更新一个文件的多个chunk,因为mongodb本身没有事务机制。

 

    对于小于16M的文件,比如一些图片、CSS、js文件等,应该将它们直接存储在普通的collection中而非GridFS(bindata,参见org.bson.types.Binary),因为它们通常较小,GridFS无法发挥其优势。当然,你为了统一application的“文件系统”存储方式,也可以将这些小文件保存在GridFS中,性能也不会差的太多,为了提升性能,对这些小文件,可以在存储时手动设置它的chunkSize,避免文件被切分成多个chunks来提高性能。

 

三、GridFS内部存储结构简析(JAVA代码示例)

    比如我们创建了一个GridFS数据库,可以可以通过mongo shell指令看到:

> ./mongo --host 127.0.0.1 --port 27017
> use common-fs
> show collections;
fs.chunks
fs.files
system.indexes

 

    我们可以看到“common-fs”数据库下有2个collection:“fs.chunks”和“fs.files”;其中前缀“fs”为bucket名称。

    1)fs.chunks:存储二进制数据,如上文所述,保存在GridFS中的每个文件都会根据“chunkSize”拆分成多个chunks并依次保存在“fs.chunks”中,每个chunk都持有“files_id”即为“文件id”,“n”为chunk的序列;比如一个文件被拆分成3个chunks,那么“fs.chunks”中将会有3个document,它们持有相同的files_id,“n”分别为0、1、2。

{
  "_id" : <ObjectId>,	//chunk ID,全局唯一
  "files_id" : <ObjectId>,	//file collection表的"_id"值
  "n" : <num>,	//chunk的序列号,第一个chunk位0。
  "data" : <binary>	//二进制数据
}
> db.fs.chunks.getIndexes();
[
...
	{
		"v" : 1,
		"unique" : true,
		"key" : {
			"files_id" : 1,
			"n" : 1
		},
		"name" : "files_id_1_n_1",
		"ns" : "common-fs.fs.chunks"
	}
]

    chunks默认情况下已经对“files_id”和“n”建立了唯一索引。

 

    2)fs.files:存储文件的metadata,GridFS每保存一个文件,都会在此collection中插入一条document,结构如下所示。其中“metadata”字段用于保存用户自定义的K-V数据(比如保存文件的format),其他字段是GridFS内置的,开发者不能修改(除file_name外),每个文档都有一个md5字段,所以开发者不需要自己再去计算md5值。其中filename为开发者指定的“文件名称”。

{
  "_id" : <ObjectId>,	//
  "length" : <num>,	//文件的长度
  "chunkSize" : <num>,	//chunkSize
  "uploadDate" : <timestamp>,	//文件生成的时间戳
  "md5" : <hash>,	//HASH值

  "filename" : <string>,	//文件名,用户指定
  "contentType" : <string>,	//
  "aliases" : <string array>,	//别名
  "metadata" : <dataObject>,	//用户自定的metadata
}
> db.fs.files.getIndexes();
[
...
	{
		"v" : 1,
		"key" : {
			"filename" : 1,
			"uploadDate" : 1
		},
		"name" : "filename_1_uploadDate_1",
		"ns" : "common-fs.fs.files"
	}
]

    其中“filename”和“updateDate”默认已经建立了组合索引,但不是unique,所以GridFS中filename是可以重复的;建议使用_id来获取文档,比如如果你使用GridFS构建一个图片服务器,可以使用_id的值作为图片的名称。

    其中有一个比较重要的参数“chunkSize”,这个值默认为“261120”(即255k),对于web应用此值基本不需要调整;如果你的应用是文件的“上传”、“下载”等,可以考虑将此值扩大,比如64M等。还有一种特例,比如你的文件通常较小,比如只有1M左右,而且通常不会涉及到“range access”,那么可以将每个file的chunkSize设置为文档的大小,这样可以在存储时只有一个chunk。

    客户端查询文件时首先会查询“fs.files”获取metadata并获得files_id值(即_id),然后再根据files_id查询“fs.chunks”获取chunks列表(根据n排序),当客户端需要读取某个chunk数据时才会触发实际数据传输。

 

四、Sharding架构

    随着GridFS中文件数量的增加,最终有可能存储空间会达到单机磁盘上限,或者由于Read操作较多单机无法承载压力,此时就需要考虑分布式部署;解决此文件的方案为sharding,即将GridFS的数据分布存储在多个mongod节点中。

    sharding基本原理和mongodb一样,此处不再赘言;因为一个GridFS数据库,由“fs.files”和“fs.chunks”两个collections构成,一个文件将不同的信息保存在两个collections中,那么究竟该如何设计sharding呢?首先表明无论两个collection同时sharding还是只有其中一个sharding,都不需要客户端修改代码,也不会影响数据访问,因为无论是“通过filename查询fs.files”还是“通过files_id查询fs.chunks”中间都会经过mongos实例路由。

    因为fs.files文件中只保存metadata,通常都比较小,因此在可以不sharding。如果sharding,则根据应用需要选择合适的“shard key”,比如你通常使用_id来查询文件,那么可以将_id作为“shard key”的一部分(比如shard key为{_id : 1,filename:1}),如果你的应用通常使用filename查询文件,那么可以将filename作为shard key(或者前缀);我们最终的目的,就是确保查询方式与数据sharding保持一致,提供高效的查询,同时还需要尽可能保证数据的均匀分布。

    对于fs.chunks文件,这个是优先被sharding的,因为它的数据量通常为fs.files的数倍;不过这个collection的shard key只能为{"files_id" : 1, n : 1},因为这个collection只有这种查询方式,且只有这样才会保证同一个file_id的多个chunk尽可能的保存在同一个shard-chunk中。

    具体如何sharding请参见相关文档。

 

五、GridFS代码样例(JAVA)

    1、构建GridFS实例

MongoClient mongoClient = new MongoClient("127.0.0.1",30017);//单例
DB db = mongoClient.getDB("common-fs");

//单例即可,创建多个实例并无影响,内部间接使用了mongoClient作为通讯支撑
GridFS gridFS = new GridFS(db);//可以指定bucket名字,默认值为“fs”

 

    2、创建文件

FileInputStream inputStream = new FileInputStream(new File("/data/logs/support-web/web-all.log"));
GridFSInputFile inputFile = gridFS.createFile(inputStream);
inputFile.setFilename("web-all.log");
inputFile.setContentType("text/plain");
inputFile.save();
ObjectId fileId = (ObjectId)inputFile.getId();//此ID,在客户端生成
System.out.println(fileId.toHexString());//此字符串ID,可供application使用

 

    3、读取文件

GridFSDBFile file = gridFS.find(new ObjectId("56457faf6dca030a4b3e46cd"));
file.writeTo(new File("/data/logs/test-1.log"));

//此外还可以使用inputstream方式
BufferedInputStream inputStream = new BufferedInputStream(file.getInputStream(),1024);
OutputStream outputStream = new FileOutputStream(new File("/data/logs/test-2.log"));
byte[] bytes = new byte[1024];
while (true) {
    int count = inputStream.read(bytes);
    if(count < 1024) {
        break;
    }
    outputStream.write(bytes,0,count);
}
inputStream.close();
outputStream.close();

 

参考文档:

1)GridFS:【官方文档】

2)GridFS构建解答:【1】【2】  

3)Nginx插件:https://github.com/mdirolf/nginx-gridfs,不过此插件已经停止维护了,可能随着mongodb版本的升级将有可能不兼容;此后大只能在tomcat中访问gridfs了(或者NodeJS)。

 

MongoDB入门调研笔记-用JAVA操作MongoDB、GridFS 1. MongoDB的下载. mongoDB官网:https://www.mongodb.com/ 根据业界规则,偶数为“稳定版”,奇数为“开发版” 32bit的mongodb最大只能存放2G的数据,64bit没有限制 我下载了最新的3.4.4.msi安装稳定版。 2.   安装 安装好后在环境变量中将环境变量配置到BIN目录下 启动mongoDB 要先启 阅读详情

相关推荐

【模拟电子设计实战】开源!基于Multisim与AD620的心电采集电路仿真与优化

本文详细介绍了基于Multisim与AD620的心电采集电路仿真与优化实战。通过分析心电信号采集的挑战,重点讲解了AD620仪表放大器和OP07运算放大器的选型优势及电路设计技巧,包括对抗50Hz工频干扰和基线漂移的优化方法。文章还分享了Multisim仿真参数设置与实测对比经验,最终实现性能达标的心电采集电路设计。

weixin_30555125的博客 95

python-mongodb存储文件

python 版本为2.7 mongodb版本2.6.5 使用mongodb存储文件,可以使用两种方式,一种是像存储普通数据那样,将文件转化为二进制数据存入mongodb,另一种使用gridfs,咱们先来说说第一种 先读取文件内容,然后塞进bson.binary.Binary对象里,最后像平常那样写入数据库,是不是很简单呢,获取文件一样的简单,像平时那样查找数据,然后将二进制内容

KWSY2008的专栏 7831

从零到一:基于Rocky Linux 9的Kubernetes高可用集群部署实战

本文提供了一份基于Rocky Linux 9操作系统,从零开始部署Kubernetes高可用集群的完整实战指南。详细讲解了包括系统初始化、容器运行时配置、使用kubeadm工具进行集群初始化、节点加入以及Calico网络插件安装在内的核心步骤,并针对国内网络环境提供了镜像加速等优化方案,旨在帮助读者构建一个稳定可靠的生产级K8s环境。

weixin_29197835的博客 137

13.MongoDB之Gridfs

参照官网如下(如下链接依次递进): https://docs.mongodb.com/manual/core/gridfs/ https://docs.mongodb.com/database-tools/mongofiles/#mongodb-binary-bin.mongofiles https://docs.mongodb.com/database-tools/installation/installation/ mongofiles可执行程序提供了命令行操作存储在GridFS对象中Mongo

mijichui2153的博客 4130

从机械臂示教到厨房做饭:ACT模仿学习如何让机器人更“人性化”?

本文探讨了ACT(Action Chunking with Transformers)模仿学习技术如何让机器人更“人性化”,特别是在厨房等复杂场景中的应用。通过动作分块(Action Chunking)和时态融合(Temporal Ensemble)技术,机器人能够像人类一样记忆和执行复杂任务,如烹饪。文章还分析了ACT在家庭场景中的落地挑战及其在康复医疗、柔性制造等领域的跨领域应用潜力。

weixin_30613343的博客 255

VS2019中C++动态链接库(DLL)的创建与调用

VS2019中C++动态链接库(DLL)的创建与调用,及一些进阶技巧。

qq_42232522的博客 7563

MongoDB入门学习(二)GridFS、GridFS整合SpringBoot

MongoDB的GridFS MongoDB整合SpringBoot操作GridFS

Huathy的博客 2744

深入解析Gerber RS274X文件格式:从基础语法到实战应用

本文深入解析PCB制造的核心标准Gerber RS274X文件格式,详细介绍了其基础语法、坐标系统、功能码以及嵌入式光圈定义等关键特性。通过实战案例演示了如何解析和手写Gerber指令,并总结了常见错误与调试技巧,帮助PCB工程师掌握这一与制造工厂沟通的“通用语言”,确保设计准确无误地转化为实体电路板。

weixin_29252171的博客 94

mongoDB--GridFS简介

前言 :GridFS从名字来看,就明白是一个文件系统,它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取).   使用场景:如果你的系统有如下情景 1) 有大量的上传图片(用户上传或者系统本身的文件发布等) 2) 文件的量级处于飞速增长,有可能打到单机操作系统自己的文件系统的查询性能瓶颈,甚至超过单机硬盘的扩容范围....

iteye_7340的博客 249

ISA-95(S95)标准详解

ISA-95是制造业系统集成的“通用语言”,通过分层模型和信息流规范,打通企业计划层与设备控制层,成为实现数字化工厂的核心标准之一。其与ISA-88的协同应用,可进一步优化生产执行与资源管理的效率。标准,旨在解决企业商业系统(如ERP)与工业控制系统(如MES、SCADA)之间的集成问题。

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 3737

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

MongoDB之GridFS

【MongoDB是什么?】 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,

yangyatou1991的专栏 1万+

软考高级网络规划设计师教程(第3版)

"本书是由工业和信息化部教育与考试中心组织编写的考试用书,依据《网络规划设计师考试大纲》(2026年审定通过)编写。本书分为两篇:第一篇为网络规划与设计综合知识,其中第1章介绍计算机网络基础知识,第2章介绍网络互连与互联网,第3章介绍网络规划与设计的知识和方法,第4章介绍网络资源设备,第5章介绍网络安全技术,第6章介绍标准化和网络安全法规;第二篇为案例实践,其中第7章介绍网络规划案例,第8章介绍网络故障分析与处理案例,第9章介绍网络安全部署案例,第10章介绍网络规划与设计论文写作的指导思想和写作技巧。

鹿鸣天涯 3942

MongoDB(八) - MongoDB GridFS介绍及使用Python操作GridFS

摘要 GridFS是MongoDB用于存储大型二进制文件的规范,它将文件分割成255KB的块存储,突破了单文档16MB的限制。主要应用于多媒体存储、备份归档、分布式文件系统等场景。其存储结构由fs.files(元数据)和fs.chunks(文件块)两个集合组成。操作方式包括MongoDB Shell(已弃用)和Python编程接口,通过put()、get()、list()等方法实现文件上传下载管理。Python示例展示了文件上传和查询元数据的基本操作,体现了GridFS在扩展性、可靠性和检索效率上的优势。

zcs2312852665的博客 1468

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MongoDB中GridFS简介

GridFS简介 GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这些文件。 GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持

Damon_zqt的博客 849

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mongodb gridfs java_mongodb gridfs基本使用

Mongodb GridFS图片文件存储解决方案之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径。目前需要后台服务存储图片,将图片存储到MongoDB集群中,然后通过Nginx中的nginx-gridfs模块进行访问,在浏览器中通过url访问,效果与Apache访问本地文件一样。本方案的内容比较基础,以后会...

weixin_39553600的博客 385

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mongodb gridfs java_mongodb Gridfs操作

GridFS 介绍GridFS是MongoDB规范用于存储和检索大文件,如图片,音频文件,视频文件等。这是一种文件系统用来存储文件,但数据存储于MongoDB集合中。GridFS存储文件比其文档大小16MB限制的更大能力。GridFS的划分一个文件分成块存储数据每个块在一个单独的文件,每个最大尺寸255K。GridFS默认使用两个集合 fs.files 和 fs.chunks 存储该文件的元数据和...

weixin_30499557的博客 684

MongoDB GridFS

GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。GridFS 可以更好的存储大于16M的文件。GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。

qq_25502783的博客 850

Mongodb操作GridFS案例

Mongodb操作GridFS案例

qq_39123467的博客 1057

MongoDB教程(二十一):MongoDB大文件存储GridFS

在处理多媒体文件、文档或其他大型二进制数据时,传统的文件存储方式往往难以满足高并发、可扩展和易管理的需求。MongoDB 通过 GridFS 模块提供了一套完整的解决方案,用于存储和检索大型文件。本文将深入探讨 GridFS 的工作原理,以及如何在 MongoDB 中使用 GridFS 存储和检索文件。

菜鸟小码的博客 2316

Python 实现MongoDB Gridfs图片存取

Python 实现MongoDB Gridfs图片存取 Gridfs官方文档链接:http://api.mongodb.com/python/current/api/gridfs/index.html?highlight=gridfs#module-gridfs # -*- coding:utf-8 -*- from gridfs import GridFS from pymongo i...

Janebook的博客 2406

MongoDB中的GridFs是什么

本文来介绍下MongoDB的GridFsTemplate如何使用 文章目录概述 概述

wh柒八九的博客 2469

MongoDB - MongoDB处理大文件:GridFS的使用场景与教程

本文介绍MongoDB处理大文件的GridFS解决方案。GridFS将大文件自动分块存储在MongoDB中,解决传统文件存储的痛点。文章详细解析了GridFS的设计原理、核心集合结构及工作流程,对比了适用场景与不适用场景,并通过Spring Boot实战代码演示了文件上传下载等操作。GridFS适合16MB-10GB文件存储,具有与业务数据强一致性等优势,但对于超大文件建议使用对象存储。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: JAVA中BitSet使用
下一篇: Jenkins + Git + Maven + tomcat集成环境搭建
shift_alt_ctrl
博客等级 码龄10年 0粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值