mongodb GridFS

本文介绍了MongoDB GridFS用于存储大型文件的优势与实现原理。包括解决文件目录限制、提高访问效率及备份容灾等问题,并探讨了GridFS的操作方式及其局限性。

MongoDB GridFS

         因为业务的原因,会存储到图片数据,以往在SQL中,都是利用文件系统来存放图片。但是文件系统存在的问题是,不可以备份,无法容灾。

        优势:那么使用GridFS的理由,好处具体有哪些:1)不再受文件目录下文件数目大小的限制,无论在linux还是windows中,某一个文件夹中下的文件数目是有限制的,分不同的文件系统。2)文件在访问的时候必须从磁盘中掉出整个文件以访问,如果文件比较大,那么占用的内存及访问时间会是一个问题。3)mongodb本身的副本集概念,能够做到备份数据,避免文件被删除产生的问题。

         实现原理:Mongodb的GridFS就是为存储文件而生,因为mongodb在存储数据的时候是有对文件大小有限制,BSON文件的最大为16M。因此,在Mongodb存放文件时,使用两个集合:fs.chunks,fs.files.在MongoChef中,右击数据库,会有一个Add GridFS bucket,建立一个文件的集合。其中,fs.chunks存放文件数据,fs.files存放文件信息。文件信息主要属性:文件长度、块大小,创建时间等。有点类似索引的概念。Mongodb采用二进制的方式存放数据,二进制与文本文件的存取,主要在于编码方式,二进制文件方式能够最大程度上减小文件所占用的大小。在Mongodb的GridFS中的块默认情况下每块的大小为255K。GridFS对files及chunks都使用了索引。Chunks的索引为file_id及chunk的序列号。Files的索引为文件名称及上传时间:filename,uploadDate

        操作方式:在mongodb中提供一个工具:mongofiles,上传、下载文件的命令分别为:put 与get。当mongos已经使用了权限,注意后面使用-u –p –db -port等参数,列出当前fs中已有的文件:list。

         MongodbFS存在的局限:

1、  无法保证原子操作,因为是块保存的,这就有一个问题了,如果要修改文件的话,可能需要删除原来的再重新保存进去。块需要重新分配。

2、  如果图片的大小比较小,mongodb在访问GridFS会有两次,首先会访问fs.files,然后访问chunks,时间或许比文件系统的更慢。

### MongoDB GridFS 安装指南 MongoDB GridFS 是一种用于存储和检索超过 BSON 文档大小限制(16 MB)的文件的规范。以下是一个综合的安装与配置指南,涵盖不同环境下的操作。 #### 1. 系统要求 在开始之前,请确保已安装 MongoDB 数据库服务,并且其版本支持 GridFS 功能。可以通过以下命令检查 MongoDB 的版本: ```bash mongod --version ``` 确保版本不低于支持 GridFS 的最低要求[^2]。 #### 2. 使用 gridfs_fuse 挂载 GridFS 为了将 GridFS 文件系统挂载到本地目录,可以使用 `gridfs_fuse` 工具。以下是具体步骤: - **安装依赖**:确保系统已安装 FUSE 支持。 ```bash sudo apt-get install fuse ``` - **下载并安装 gridfs_fuse**:根据官方文档或第三方实现进行安装。 - **挂载命令**: ```bash gridfs_fuse \ --mongodb-uri="mongodb://127.0.0.1:27017/" \ --database="your_database_name" \ --mount-point="/mnt/gridfs_fuse" ``` 此命令将指定的 MongoDB 数据库中的 GridFS 文件挂载到 `/mnt/gridfs_fuse` 目录中[^1]。 #### 3. PHP 环境下的 GridFS 配置 如果需要在 PHP 环境中使用 GridFS,可以参考以下步骤: - **安装 MongoDB PHP 扩展**: 下载最新版本的 PHP MongoDB 扩展源码,并进行编译安装。例如: ```bash wget http://pecl.php.net/get/mongo-1.2.12.tgz tar -xzf mongo-1.2.12.tgz cd mongo-1.2.12 phpize ./configure make sudo make install ``` - **启用扩展**:编辑 `php.ini` 文件,添加以下内容: ```ini extension=mongo.so ``` - **测试连接**:编写一个简单的 PHP 脚本来验证 GridFS 是否正常工作。 ```php <?php $client = new MongoClient("mongodb://127.0.0.1:27017/"); $db = $client->selectDB("your_database_name"); $gridfs = $db->getGridFS(); // 插入文件 $file_id = $gridfs->storeFile("/path/to/local/file"); // 获取文件 $file = $gridfs->find_one(array("_id" => $file_id)); echo $file->getBytes(); ?> ``` 上述代码展示了如何通过 PHP 将文件存储到 GridFS 中,并从中检索文件[^3]。 #### 4. Java 环境下的 GridFS 操作 对于 Java 开发者,可以利用 MongoDB 的 Java 驱动程序来操作 GridFS: - **Maven 依赖**: 在项目的 `pom.xml` 文件中添加以下依赖项: ```xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.0</version> </dependency> ``` - **示例代码**: ```java import com.mongodb.MongoClient; import com.mongodb.gridfs.GridFS; import com.mongodb.gridfs.GridFSInputFile; public class GridFSTest { public static void main(String[] args) { MongoClient client = new MongoClient("127.0.0.1", 27017); GridFS gridFS = new GridFS(client.getDB("your_database_name")); // 插入文件 GridFSInputFile file = gridFS.createFile(new File("/path/to/local/file")); file.save(); // 查询文件 InputStream inputStream = gridFS.find(new BasicDBObject()).next().getInputStream(); // 处理输入流... } } ``` 此代码片段展示了如何通过 Java 驱动程序上传和检索文件[^4]。 #### 5. 其他注意事项 - **性能优化**:对于大规模文件存储,建议对 MongoDB 进行适当的索引优化和分片配置。 - **安全性**:确保 MongoDB 实例已启用身份验证,并限制外部访问。 - **备份策略**:定期备份包含 GridFS 数据的数据库以防止数据丢失。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值