2012年11月8日星期四

MongoDB循序渐进之[入门]

MongoDB循序渐进之[入门]

   初识 MongoDB 是在2012年,接触MongoDB是源自 Nodejs ,至于是怎么接触Nodejs ,我倒是忘记了,不过应该是2012年4月份左右吧,估计是在哪个帖子里看到的然后被吸引了吧,然后就一发不可收拾。为什么接触了 Nodejs 就接触了MongoDB呢,是因为在Nodejs开发过程中好多地方都用到了MongoDB,例如Nodejs的SESSION就用到MongoDB,因为Nodejs本身的SESSION管理有问题,必须依赖第三方的数据库,但当时Nodejs在驱动方面还难以满足MySQL、SQLServer、Oracle这样的大型强事务型数据库,因为Nodejs是异步的,所以大部分人选择了当时比较流行的NoSQL数据库MongoDB,简单、高效,很容易上手,而今证明这个选择是正确的,因为很多拥有大型数据存储需求的公司都开始转向MongoDB,这得益于它的很多特性,因此在对大数据量进行才处理的时候,性能要优于其他大型的事务型数据库。其实文档型数据库发展也很快,最近几年也出来了很多,例如Cassandra、Mongodb、CouchDB、Redis、Riak、Membase、Neo4j和HBase[1],但是MongoDB是目前来说最火的,新浪就在用。

   在Nodejs中使用MongoDB是很简单的一件事情,有各种各样的驱动供你选择,你不必担心事务,也不必担心有复杂的配置,双击一个批处理文件(WindowsOS)运行即可。但是既然是要学习MongoDB那我们就必须弄清楚三个问题:一、它是什么,二、它有哪些特性,三、它适用于什么环境,四、它的原理是什么,五、它未来的发展怎样。那么接下来我们就循序渐进的去了解,学习,应用,研究,并有可能改进它。

一、简介:

官方首页有一句话:

MongoDB (from "humongous") is a scalable, high-performance, open source NoSQL database. Written in C++, MongoDB features:


   按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented)的数据库,采用C++开发。注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储。和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQL AB的模式。

前面已经说了像MySQL、SQLServer、Oracle一样MongoDB也是数据库,但是它又不同于以上三种常规的数据库,它是面向文档型的数据库,那么什么是文档呢?很明显这不是我们常见的word文档。这里说的文档,是一种可以嵌套的数据集合。从关系数据库的范式的概念来说,嵌套是明显的反范式设计。范式设计的好处是消除了依赖,但是增加了关联,查询需要通过关联两张或者多张表来获得所需要的全部数据,但是更改操作是原子的,只需要修改一个地方即可。反范式则是增加了数据冗余来提升查询性能,但更新操作可能需要更新冗余的多处数据,需要注意一致性的问题。

    MongoDB的面向文档采用的是BSON,一种类似JSON的格式,但是是二进制序列化的。如上面提到的blog的文章和评论,可以做如下设计:

{ 'id':1, 'author':'NinGoo', 'title':'MongoDB入门', 'content':'内容文本,    comment:[ { 'comment-author':'这是回复人1', 'comment-content':'回复内容' } ,              { 'comment-author':'这是回复人2','comment-content':'回复内容' }            ]}

1. 相关数据存放在一起,针对性的查询可以消除join,性能比分散存储要高且方便。
2. 整个结构清晰自解析。所有字段名和值都存储,所以不需要提前设计结构,key的名字和数目可以任意指定,也就是所谓的schema-free。
3. 由于字段名在每一行每一列都需要重复存在,会带来一些额外的存储消耗,这在海量数据及字段较多的时候也需要考虑。
4. 一个document的长度有限,1.7.2之前是4MB,目前是8MB,以后可能增长到32MB。如果有更大的数据,可以使用MongoDB底层的GridFS直接作为文件存储。
5. 如果需要查找某个评论者的所有评论,则相对困难。当然,MongoDB支持任意key的索引,这也不是什么大问题。
   像上面的一个结构,为一个文档(document),相当于关系数据库中的一行记录,多个文档组成一个集合(collection),相当于关系数据库的表。多个集合(collection),逻辑上组织在一起,就是数据库(database),一个MongoDB实例支持多个数据库(database)。
   大部分的NoSQL产品,为追求性能,一致性等,一般只能支持简单的基于row-key的单条或者范围查询,但是MongoDB可以针对任意列的key创建索引,甚至是内嵌文档里的key,从支持的查询的灵活性上来看,更接近传统的关系数据库,同时还能在性能上向NoSQL看齐,加上支持复制,自动分片和Map/Reduce等功能,非常的吸引眼球,正在成为一款热门的海量存储产品。其背后的商业支持公司10gen,也正在不遗余力的推广,前不久还在北京专门组织了一场技术交流会。在其首页列举的典型客户里,包括foursquare,sourceforge,github等知名互联网公司和应用,当然,也包括淘宝网。

 

二、安装试用:

Windows平台:

1.去MongoDB downloads page下载最新版本的压缩包

2.解压压缩包到任意位置,例如mongodb-win32-i386-2.2.1.zip

3.把路径加入到环境变量,例如D:\mongodb-win32-i386-2.2.1\bin

4.打开CMD,运行下面一个简单的命令就启动了服务,默认端口27707

mongo --dbpath d:\test\mongodb\data

5.测试一下,运行以下命令

> db.test.save( { a: 1 } )   > db.test.find()

当然了,如果觉着这样麻烦也可以把MongoDB做成系统服务:

1.给MongoDB做一个配置文件,包含MongoDB的各种参数

logpath=C:\mongodb\log\mongo.log > C:\mongodb\mongod.cfg

2.安装为系统服务

--config C:\mongodb\mongod.cfg --install

3.控制MongoDB服务

net start MongoDB  启动
net stop MongoDB   停止

4.移除服务

C:\mongodb\bin\mongod.exe --remove

    当然,服务的启动、关闭,和自启动是否,禁用是否等可以在Windows系统的服务管理工具里面配置。

   MongoDB在Windows有三个版本:MongoDB for Windows Server 2008 R2 edition、MongoDB for Windows 64-bit、MongoDB for Windows 32-bit,安装方法大同小异,只是在Windows32位平台下MongoDB的数据库最大不能超过2G。

Linux平台以CentOS为例

1.配置YUM

32位平台

[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64gpgcheck=0enabled=1

64位平台

[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686gpgcheck=0enabled=1

2.安装包

yum install mongo-10gen mongo-10gen-server

3.配置MongoDB

/etc/mongod.conf

4.控制MongoDB服务

service mongod start   启动
chkconfig mongod on    跟随系统启动
service mongod stop    停止
service mongod restart 重启

5.测试一下

使用mongo命令进入MongoDB环境,然后运行:

> db.test.save( { a: 1 } )   > db.test.find()

 

三、小试牛刀:

   如果你按照上面的例子成功安装了MongoDB的话那我们接下来就可以小试牛刀了,

例如你可以这样来保存一个用户:

>db.users.insert( { _id : "alex", name: { first:"Alex", last:"Benisson" }, karma : 1.0 } )

也可以像这样来查询一个帖子:

> db.posts.findOne( { _id : ObjectId("4e77bb3b8a3e000000004f7a") } );

   是不是很Happy?没有复杂的SQL脚本,也没有麻烦的表关联,很带劲。

如果没有安装好,那你稍后再慢慢捣鼓,不过这不意味着你就玩不了MongoDB,官方很人性化的提供了一个在线试用的平台:http://www.mongodb.org/downloads# 在这里你可以使用MongoDB的所有命令来试用,Very exciting。

QQ_thumb2

 

四、总结:

一句话:NoSQL数据库是未来的一种发展需求和趋势,但是不能替代传统的关系型数据库,只是技术需求发展到一定程度的补充。

两句话:NoSQL数据库有很多,但目前MongoDB是做的比较好的,值得学习。

三句话:本人是个技术宅,对这种将要改变某些事情的技术比较感兴趣。

五、文章相关:

注解:

[1]八种主流NoSQL数据库系统对比

http://database.51cto.com/art/201109/293029.htm

 

参考文档:

淘宝网高级数据库专家宁海元白话MongoDB系列文章

http://www.ningoo.net/html/2011/mongodb_in_a_nutshell_1.html

更详细的安装过程

http://cn.docs.mongodb.org/manual/installation/

更多NoSQL数据库

http://nosql-database.org/




TAG: