NoSQL之MongoDB开篇
在“NoSQL”一词,实际上是一个Racker创造的,当约翰埃文斯埃里克要组织一次活动来讨论开源的分布式数据库。这个名称和概念都由此而来。
NoSQL的未来一片光明,社交新闻网站Digg近日决定放弃MySQL,并从LAMP(Linux、 Apache、MySQL和Perl/PHP/Python)架构迁移到基于Cassandra的NoSQL架构。不久之前,Twitter也做出了相同的举措。
NoSQL系统在运行时一般会把数据存放在内存中,或者是并行地从许多磁盘上读取数据。其中就有一个问题,“传统”的关系数据库不提供这种模式,因此也没法提供同样的性能。在过去那种数据库中,如果只有几个GB数据,这一问题还不是很明显,但是许多云计算的数据库已经超过了1TB,还会有更多的大规模数据库会被用来支撑不断发展的云计算系统。在关系型数据库上对大规模数据进行操作是兵家大忌,因为在处理数据时SQL请求会占用大量的CPU周期,并且会导致大量的磁盘读写。
非分布式NoSQL数据库包括CouchDB,MongoDB,Neo4j,Redis,和Tokyo Cabinet。这些可以作为分布式系统持久层; MongoDB提供有限的共享支持,做了单独的休息室为CouchDB项目,和Tokyo Cabinet可作为Voldemort存储引擎使用。
数据和查询模型
在NoSQL里有很多不同的数据模型和数据库的查询API。
持久性设计
通过持续的设计我的意思是,“如何在内部存储的数据?” 持久性模型告诉我们很多这些数据库能够善于什么样的工作量。
在内存数据库是非常,非常快的(Redis达到每秒超过100,000操作一台计算机上),但不能与数据集的工作,超出可用的RAM。耐久性(保留数据,即使服务器崩溃或断电)也将是一个问题的数据量,可以预期损失之间的冲(复制数据到磁盘)可能非常大。 Scalaris,其他内存数据库,我们的名单上,意向处理与复制耐久性问题,但由于它不支持多个数据中心的数据将仍然容易受到停电的事情一样。
Memtables和SSTables缓存在内存中写入(1“memtable”)后,以书面追加只承诺为耐久性日志。当写够已被接受的memtable排序并写入到磁盘上的所有一次作为“sstable。”这提供近内存中的表现,因为没有涉及要求,同时避免了纯粹的耐久性问题,在内存的方法。 (这是详细描述在第5.3和先前提及的5.4 Bigtable的文件,以及在该日志结构合并树。)
B-树已被用于从数据库中实际上是时间的起点。索引他们提供强大的支持,但表现欠佳的旋转盘(这仍然是迄今为止最具有成本效益,因为多)要求读或写什么工作。
一个有趣的变体是CouchDB的追加,只有B-树,它避免了管理费用的目的在限制CouchDB一写一时间成本.
在这里,主要介绍MongoDB。
MongoDB是一款分布式文档数据库,支持类似关型数据库的主从结构,文档以二进制Json形式存储,无锁,无事务,有索引。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言, 几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
刚刚发布的 MongoDB 1.6 增加了自动分区 Sharding 和复制子集的支持。
下图是自动 Sharding 的架构:
面向文档的数据库与关系数据库有着显著的区别,面向文档的数据库用一个有组织的文件来存储数据,而不是用行来存储数据,在MongoDB中,一组文档被看作是一个集合,在关系数据库中,许多行的集合被看作是一张表。但同时它们的操作又是类似的,关系数据库使用select,insert,update和delete操作表中的数据,面向文档的数据库使用query,insert,update和remove做意义相同的操作。
MongoDB中对象的最大尺寸被限制为4MB,但对象的数量不受限制,MongoDB可以通过集群加快操作的执行速度,当数据库变得越来越大时,可以向集群增加服务器解决性能问题。
延伸阅读
Mongo是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发,提供了以下功能:
◆面向集合的存储:适合存储对象及JSON形式的数据。
◆动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
◆完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
◆查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
◆复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
◆高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
◆自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述,Mongo适合用于以下场景:
◆网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
◆缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
◆大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
◆高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
◆用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。
自然,MongoDB的使用也会有一些限制,例如它不适合:
◆高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
◆传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
◆需要SQL的问题
MongoDB支持OS X、Linux及Windows等操作系统,并提供了Python,PHP,Ruby,Java及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。