随着应用需要处理数据量的指数级膨胀和分析这种海量数据需求的膨胀,关系型数据库渐渐显露出了疲态。系统进行横向扩展时,关系型数据库也往往成为性能提升的瓶颈。这时,NoSQL相关技术成为这轮更迭的发起者和成功者。这其中MongoDB风头最劲了。MongoDB非常适合于大数据量,高并发,弱事务的互联网应用,并且其内置的水平扩展机制提供了从百万到十亿级别的数据量处理能力!这点可以保证采用MongoDB的应用,在后期扩展中数据库端不会成为约束瓶颈。
以上算是作为自己开始自学MongoDB的开篇小记吧。自己完全出于兴趣开始研究MongoDB,所选书籍为《MongoDB权威指南》,第一次以博文的形式去学习一门技术是因为想在学习过程中留下更多的痕迹,便于后期有机会实战时进行反思。我会逐个章节进行学习,同步的逐个章节进行博客记载,希望最后能有所收获。开始吧。
工欲善其事,必先利其器,学习一门技术首先必须下载相关的程序包和源码,我下载了2.0.6版本,并上传到自己的资源中。这本书的第一章就是对MongoDB的简介。
MongoDB是面向文档的数据库,不是现在使用最普遍的关系型数据库,其放弃关系模型的原因就是为了获得更加方便的扩展、稳定容错等特性。面向文档的基本思路就是:将关系模型中的“行”的概念换成成“文档”模型。面向文档的方式可以将文档和数组内嵌进行,因此实际中用一条数据可以表示非常复杂的结构,而这非常符合面向对象语言看待数据的方式。
MongoDB没有模式:文档的键不会事先定义也不会固定不变。由于没有模式需要更改,通常不需要迁移大量数据。不必将所有数据都放到一个模子里面,应用层可以处理新增或丢失的键。这样开发者可以非常容易地变更数据模型。
实际应用中,随着用户群的增长和应用的增多,系统都不可避免地需要进行扩展,通常扩展包括纵向扩展和横向扩展。纵向扩展是简单的方式,对应用不会有任何影响,就是提升单台服务器的性能,如2核变4核,8G内存升16G内存等,但这种扩展方式是有限的,达到硬件的物理极限就无法进行下去,对于中小应用是可以接受的。横向扩展就是通过增加服务器的数量来提升应用整体性能的方式,支持无限扩展。但这种扩展方式对整个应用和维护都会提出更高的要求,应用本身需要支持横向扩展,服务器集群也需要支持负载均衡等,系统的稳定性同样需要更强的控制,这事适合大型应用的扩展方式。
在横向扩展中,关系型数据库部分同样是一个难点,关系型数据库本质上不支持横行扩展,如果你一定要通过将表进行分类分开的方式进行,则在DAO层仅需要进行大量的额外代码支持!MongoDB在初始设计时就考虑到了扩展的问题,面向文档的数据模型可以自动在多台服务器之间分割数据。它还可以平衡集群的数据和负载,自动重排文档。开发者根本不用考虑数据库层次的扩展问题,需要扩展数据库时,在集群中添加机器即可,MongoDB会自动处理后续的事情。
MongoDB有如上各种特性,但为了达到这些,他也放弃了关系型数据库的某些功能如表连接join和复杂的多行事务。因为这两个功能本质上确实很难在一个分布式系统上实现。
MongoDB尽量让服务器自治来简化数据库的管理。除了启动数据库服务器之外,几乎没有什么必要的管理操作。如果主服务器挂掉了,MongoDB会自动切换到备份服务器上,并且将备份服务器提升为活跃服务器。在分布式环境下,集群中只要知道新增加了节点,就会自动集成并配置这个新节点。
MongoDB的管理理念是尽可能让服务器自动配置,让用户在需要的时候调整设置。
最后给大家一个MongoDB的网址,如果想看看该项目的其他信息,可以参考:http://www.mongodb.org/display/DOCS/Home