由于MongoDB中的Bson对象大小是有限制的,在1.7版本以前单个Bson对象最大容量为4M,1.7版本以后单个Bson对象最大容量为16M[5]。对于一般的文件存储,单个对象的4到16M的存储容量能够满足需求,但无法满足对于一些大文件的存储,如高清图片、设计图纸、视频等,因此在海量数据存储方面,MongoDB提供了内置的Grid
FS,可以将一个大文件分割成为多个较小的文档,可以指定文件分块标准,对用户是透明的。GridFS使用两个数据结构来存储数据:files(包含元数据对象)、chunks(包含其他一些相关信息的二进制块)。为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认前缀为fs,用户有权改变这个前缀。
GridFS对Java、C#、Perl、PHP、Python、Ruby等程序言语均支持,且提供了良好的API接口。
3.2 基于GridFS的海量数据存储测试
本文主要采用MongoDB最新版2.0及官方提供的C#语言驱动进行测试,C#驱动下载地址:https://github.com/mongodb/Mongo-csharp-driver。
MongoDB在bin目录下提供了一系列有用的工具,可以很方便的进行运维管理:
(1)bsondump:将Bson格式的文件转储为Json格式的数据。
(2)mongo:客户端命令行工具,支持js语法。
(3)mongod:数据库服务端,每个实例启动一个进程��可以fork为后台运行。
(4)mongodump:数据库备份工具。
(5)mongorestore:数据库恢复工具。
(6)mongoexport:数据导出工具。
(7)mongoimport:数据导入工具。
(8)mongofiles:GridFS管理工具,可实现二进制文件的存取。
(9)mongos:分片路由,如果使用了sharding功能,则应用程序连接的是mongos,而非mongod。
(10)mongosniff:这一工具的作用类似于tcpdump,不同的是他只监控MongoDB相关包请求,并且是以指定的可读性的形式输出。
(11)mongostat:实时性能监控工具。
同时有好几个第三方提供的客户端图形工具,如MongoVUE、RockMongo、MongoHub等,方便管理和维护。
GridFS结合自动分片及自动复制技术,可以实现高性能的分布式数据库集群架构,从而进行海量数据存储,如下图2所示。
图2 高性能的分布式数据库集群架构
MongoDB Sharding Cluster需要三种角色:
(1)Shard Server:即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。