mongodb是现今最火的nosql之一,暑假终于有时间把《mongodb权威指南》和nosql fan上关于它的一些文章浏览了一些,下面我简单总结几点mongodb吸引人的地方。关于mongodb的基本操作,运维,使用,大家可以自己去看书或者学习资料。
1. 较之别的nosql
《mongodb: the definition guide》一书中说,“要是不能用的话,再牛的技术也是空谈,mongodb致力于容易上手、便于使用”。前段时间,阿里的一位搞hbase的师兄,春辉,花了两个多小时,深入浅出讲解了hbase的一些东西,感触很深。相比于hbase这样一个基于hdfs的big data的实现,它的架构和层次更复杂。而对于facebook一手捧红而今又不再维护了的cassandra,难免让人觉得不太promising了。
mongodb的社区还是相当活跃的。mongodb是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全。
mongodb使用json的变种bson作为内部存储的格式和语法。针对mongodb的操作都使用json风格语法,客户端提交或接收的数据都使用json形式来展现。相对于sql来说,更加直观,容易理解和掌握。
schema-less,支持嵌入子文档:mongodb是一个schema-free的文档数据库。一个数据库可以有多个collection,每个 collection是documents的集合。collection和document和传统数据库的table和row并不对等。无需事先定义 collection,随时可以创建。
crud更加简单,支持in-place update:只要定义一个数组,然后传递给mongodb的insert/update方法就可自动插入或更 新;对于更新模式,mongodb支持一个upsert选项,即:“如果记录存在那么更新,否则插入”。mongodb的update方法还支持 modifier,通过modifier可实现在服务端即时更新,省去客户端和服务端的通讯。这些modifer可以让mongodb具有和redis、 memcached等kv类似的功能:较之mysql,monodb更加简单快速。modifier也是mongodb可以作为对用户行为跟踪的容器。在实际中使用modifier来将用户的交互行为快速保存到mongodb中以便后期进行统计分析和个性化定制。
性能高效,速度快: mongodb使用c++/boost编写,,在多数场合,其查询速度对比mysql要快的多,对于cpu占用非常小。部署也很简单,对大多数系统,只需下载后二进制包解压就可以直接运行,几乎是零配置。
2. 支持多种复制模式
mongodb支持不同的服务器间进行复制,包括双机互备的容错方案。master-slave是最常见的。通过master-slave可以实现数据的备份。在我们的实践中,我们使用的是master-slave模式,slave只用于后备,实际的读写都是从master节点执行。replica pairs/replica sets允许2个mongodb相互监听,实现双机互备的容错。
3. mongodb内融合的一些东西
mongodb的shell命令全面支持js,甚至比js多一些类型,而且可以存储js函数和变量。mongodb自带mapreduce的功能,只是这个mapreduce功能只支持js语法(函数map和reduce是js写的),且js引擎的实现导致一个实例只能运行一个map/reduce线程。mongodb允许在服务端执行脚本,可以用javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。mongodb不支持事务级别的锁定,对于某些需要自定义的“原子性”操作,可以使用server side脚本来实 现,此时整个mongodb处于锁定状态。map/reduce也是mongodb中比较吸引人的特性。map/reduce可以对大数据量的表进行统 计、分类、合并的工作,完成原先sql的groupby等聚合函数的功能。并且mapper和reducer的定义都是用javascript来定义服务 端脚本。此外,mongodb shell下支持的正则表达式是perl兼容的pcre。mongodb支持java驱动,可以结合python,php,ruby这些脚本语言使用,如pymongo。
4. gridfs
gridfs用于mongodb中存储大二文件,基本思想是将将文件文成很多块,每块作为一个单独的文档存储。只要使用./mongofile put filename,文件就会被存在gridfs内,经md5处理,存在mongodb的fs.files数据库内。gridfs可以应用于存视频,图片,而mongodb有sharding和replica set的支持,还顺便解决了分布存储的问题,所以很诱惑人。附上一个应用例子: 基于mongodb gridfs的图片存储
5. 产品的代替和演变
lamp(linux+apache+mysql+php)是以前web开发中的一盏明灯。而随着web应用规模的扩大,越来越多的nginx开始取代apache,缓存层将mysql的功能逐渐弱化,越来越多的nosql产品以其简单灵活和高性能向mysql的地位发起挑战,由全新的组合:unix系列系统,加node.js,再加上mongodb组成一个新的web开发框架。
