Scalable系统设计之NoSQL- CouchDB和MongoDB

 上页

MongoDB

  • 关键点: 强迫性一致;类SQL,容易上手 , 内置分片碎片
  • 适合: 需要动态查询. 愿意事先定义索引indexes, 需要巨大的数据库有良好性能。
  • 案例:适合90%所有MySQL等RDBM场合。
  • 问题:数据集大于内存很慢。

   MongoDB 使用MapReduce替代SQL的聚合功能进行分析,但是当前是单线程,并不可伸缩。

   MongoDB的数据模型:

monodb

MonDB写操作:

mongodb写操作

MonDB读操作

mongodb读操作


 

CouchDB

  • 关键点: 最终一致性, 易用。
  • 写操作不会阻塞读操作。
  • 内部嵌入Hadoop之类map/reduce算法。
  • 实时更新。
  • 累计计算, 偶尔改变数据, 预先定义的查询. 非常注重版本控制的场合.
    举例:: CRM, CMS系统. 主-主复制是其特别亮点,可以易于多个站点部署。

CouchDB 

  • Couch 适合实时性要求不高,易于使用。文本数据库
  • MVCC 模型:copy-on-modified 
  • 任何修改都会引起一个拷贝,这引起索引修改,再引起一个索引拷贝,以此类推:

    couchdb

 

CouchDB 持久机制

将更新追加到文件中,老数据成为垃圾,被定期回收。



CouchDB 和Redis

  • CouchDB 的长处正是Redis的短处
  • Redis提供了简单的索引机制和复杂的数据结构,而CouchDB提供的是复杂的索引和简单的数据结构
  • CouchDB:存储大量的不易变但会被经常查询的大量的文档型数据。
  •    Redis :存储小量的常变数据,存储实时数据 。



博客系统案例
  • CouchDB作为一个文档型数据库,可以用来存储文章,评论,模板及附件
  • Redis :适合用来存储评论列表,网站实时状态,过滤spam,用户session信息以及页面缓存

 

CouchDB 最佳 App 大奖得主 blitz.io 技术架构

 


 

NEO4J

NEO4J原理

  • Node firstNode = neo.createNode();
  • Node secondNode = neo.createNode();
  • Relationship relationship = firstNode.createRelationshipTo( secondNode, MyRelationshipTypes.KNOWS );
  •  
  • firstNode.setProperty( "message", "Hello, " );
  • secondNode.setProperty( "message", "world!" );
  • relationship.setProperty( "message", "brave Neo " );
  • 有一个节点空间:
(firstNode )---KNOWS--->(secondNode)

 

下页

更多伸缩性scalable讨论