【摘要】当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求。随着NoSQL数据库的不断发展和成熟,可以较好地解决海量存储和海量计算方面的应用需求。本文重点描述作为NoSQL之一MongoDB数据库在海量数据存储方面的应用。
1 引言
NoSQL,全称是“Not Only Sql”,指的是非关系型的数据库。这类数据库主要有这些特点:非关系型的、分布式、开源的、水平可扩展的。原始目的是为了大规模web应用,这场全新的数据库革命运动早期就有人提出,发展至2009年趋势越发高涨。非关系型的数据存储通常的应用如:模式自有、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。它的种类繁多,如列式数据库(Hadoop/HBase、Cassandra、Hypertable、Amazon SimpleDB等)、文档型数据库(MongoDB、CouchDB、OrientDB等)、键值数据库(Azure Table Storage、MEMBASE、Redis、Berkeley DB、MemcacheDB等)、图形数据库(Neo4J、Infinite Graph、Sones、Bigdata等)、面向对象数据库(db4o、Versant、Objectivity、Starcounter等)、网格及云数据库(GigaSpaces、Queplix、Hazelcast等)、XML数据库(Mark Logic Server、EMC Documentum xDB、BaseX、Berkeley DB XML等)、多值数据库(U2、OpenInsight、OpenQM等)及其他非关系型数据库(如FileDB)等。
MongoDB属于NoSQL数据的一种,是由10gen公司提供的一个开源的、模式自由的、面向文档存储的、分布式的数据库,是一个介于关系数据库和非关系数据库之间的产品。由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。他支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储比较复杂的数据类型。
他可以运行在Solaris、Linux、Windows和OSX平台上,支持32位和64位应用,其中在32位应用中单个数据库最大容量为2G,在64位应用中存储容量大小只与实际存储空间大小有关,并且提供了Java、C#、PHP、C、C++、Javascript、Python、Ruby、Perl等多种语言的驱动程序,最新的生产版本为2.0,官方下载地址:。目前正在使用他的网站和企业已超过了100家,如视觉中国、大众点评网、淘宝网、盛大、Foursquare、Wordnik、OpenShift、SourceForge、Github等。
随着企业数据不断积累和增加及Web2.0应用不断向前发展,已进入了个人信息时代,对于大中型企业来说,可能每天将产生大量的数据,来之于各类系统,如各类文档(OA文档、项目文档等)、设计图纸、高清图片、视频等,对于员工来说,更关心的是个人信息方面的存储和计算,当这些信息量足够大时,想要实时提取或分析数据,传统集中式方式难以满足这方面的需求,因此采用分布式的存储和计算成为必然的选择,一方面主要解决海量存储问题,另一方面解决海量计算问题。采用MongoDB的数据库技术能有效地解决分布式方面的应用,本文重点分析MongoDB在海量数据存储方面的应用。
2 概述
2.1 MongoDB的主要特点
(1)文件存储格式为Bson,使用易于掌握和理解的Json风格语法。相对Json来说,Bson拥有更好的性能,主要表现为更快的遍历速度、操作更简易、增加了额外的
数据类型。
(2)模式自由,支持嵌入子文档和数组,无需事先创建数据结构,属于逆规范化的数据模型,有利于提高查询速度。
(3)动态查询,支持丰富的查询表达式,使用Json形式的标记,可轻易查询文档中内嵌的对象和数组及子文档。
(4)完整的索引支持,包括文档内嵌对象和数据,同时还提供了全文索引方式,MongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划。
(5)使用高效的二进制数据存储,适合存储大型对象(如高清图片、视频等)。
(6)支持多种复制模式,提供冗余及自动故障转移。支持Master-Slave、Replica Pairs/Replica Sets、有限Master-Master模式。
(7)支持服务端脚本和Map/Reduce,可以实现海量数据计算,即实现云计算功能。
(8)性能高、速度快。在多数场合,其查询速度对于MySQL要快的多,对于CPU占用非常小。部署很简单,几乎是零配置。
(9)自动处理碎片,支持自动分片功能实现水平扩展的数据库集群,可以动态添加或移除节点。
(10)内置GridFS,支持海量存储。
(11)可通过网络访问,采用高效的MongoDB网络协议,在性能方面要优于http或Rest协议。
(12)第三方支持丰富,MongoDB社区活跃,越来越多的公司和网站在生产环境中使用MongoDB进行技术架构优化,同时由10gen公司官方提供强大技术支持。
2.2 MongoDB的适用场景
MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
(1)网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
(3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
(4)高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce
引擎的内置支持。
(5)用于对象及JSON数据的存储:MongoDB的Bson数据格式非常适合文档化格式的存储及查询。
2.3 MongoDB的体系结构
MongoDB是由一系列物理文件(数据文件,日志文件等)的集合与之对应的逻辑结构(集合、文档等)构成的数据库。
MongoDB的逻辑结构实际是一种层次结构,由文档(document,相当于关系数据库中的row)、集合(collection,相当于关系数据库中的table)、数据库(database,相当于关系数据库中的database)这三部分组成。
一个MongoDB实例支持多个数据库。在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,采用预分配空间的机制,始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增带来的磁盘压力过大问题。每个预分配的文件都用0进行填充,数据文件每新分配一次,他的大小都会是上一个数据文件大小的2倍,每个数据文件最大为2G。
2.4 MongoDB与MS SQL Server的语句对照
MongoDB提供了功能丰富的查询表达式,可以实现绝大多数关系数据库的sql语句功能,以表employee(id,name,age)举例对照说明,如下图1所示。
图1 MongoDB与MS SQL Server语句对照
3 过程分析与测试
3.1 GridFS概述