Scalable系统设计之NoSQL- CouchDB和MongoDB
MongoDB
- 关键点: 强迫性一致;类SQL,容易上手 , 内置分片碎片
- 适合: 需要动态查询. 愿意事先定义索引indexes, 需要巨大的数据库有良好性能。
- 案例:适合90%所有MySQL等RDBM场合。
- 问题:数据集大于内存很慢。
MongoDB 使用MapReduce替代SQL的聚合功能进行分析,但是当前是单线程,并不可伸缩。
MongoDB的数据模型:
MonDB写操作:
MonDB读操作
CouchDB
- 关键点: 最终一致性, 易用。
- 写操作不会阻塞读操作。
- 内部嵌入Hadoop之类map/reduce算法。
- 实时更新。
- 累计计算, 偶尔改变数据, 预先定义的查询. 非常注重版本控制的场合.
举例:: CRM, CMS系统. 主-主复制是其特别亮点,可以易于多个站点部署。
CouchDB
- Couch 适合实时性要求不高,易于使用。文本数据库
- MVCC 模型:copy-on-modified
- 任何修改都会引起一个拷贝,这引起索引修改,再引起一个索引拷贝,以此类推:
CouchDB 持久机制
将更新追加到文件中,老数据成为垃圾,被定期回收。
CouchDB 和Redis
- CouchDB 的长处正是Redis的短处
- Redis提供了简单的索引机制和复杂的数据结构,而CouchDB提供的是复杂的索引和简单的数据结构
- CouchDB:存储大量的不易变但会被经常查询的大量的文档型数据。
- Redis :存储小量的常变数据,存储实时数据 。
博客系统案例
- CouchDB作为一个文档型数据库,可以用来存储文章,评论,模板及附件
- Redis :适合用来存储评论列表,网站实时状态,过滤spam,用户session信息以及页面缓存
CouchDB 最佳 App 大奖得主 blitz.io 技术架构
NEO4J
- 图数据库,适合社会网络应用 LinkedIn Facebook 文件系统 角色关系
- 由nodes, relationships and properties.组成
- 内存中的节点图,自动持久。
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 " );
- 有一个节点空间:
更多伸缩性scalable讨论