Riak与MongoDB的对比
本文来自Riak所属的Basho公司的技术WiKi,文章从几个方面对Riak和MongoDB进行了对比,这不是一篇PK文章,NoSQLFan翻译给大家,希望本文能让您对Riak和MongoDB有更多的了解。
来源地址:wiki.basho.com
机制与概念上的异同
Riak和MongoDB在使用特性上有下面几个相同点:
- 都是文档型的数据模型
- 具体存储方式都不是以文档型进行存储
- 写性能及写吞吐都很高
虽然上面几点看起来二者挺像,但在内部实现上两者却是相去甚远。比如Riak是一个分布式的存储,而MongoDB可以理解为是一个单一的数据库系统,同时加上了Replication和Sharding功能。MongoDB的内部数据结构上还是文档,而Riak是不用关心存储内容的二进制。MongoDB提供GridFS机制来存储二进制内容,而Riak的二进制内容与普通内容存储方式一样。MongoDB的写入方式是 in-place方式,修改一个文档是原子性的,而Riak是通过quormNRW的机制保证写入操作安全性的。
- http://www.mongodb.org/display/DOCS/Home
- http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-place
- http://www.mongodb.org/display/DOCS/Updating#Updating-Update
复制备份及横向扩展
Riak主要通过一致性hash算法来实现其数据的复制及分片,一致性hash机制是Riak的核心思想之一。在Riak中,每个节点都是对等的,所以其不存在单点故障。
而MongoDB在1.6版本后也推出了强有力的复制备份功能
1.主从复制
2.Replica Sets
Replica Sets是MongoDB的重头功能之一,它让几个节点组成一个集合,在这个集合中的节点中有一个主机提供写入,其它节点会从主机上备份数据,主机故障后会自动在从机中选取产生新的主机。
而在数据分片上,MongoDB提供了一种叫auto-sharding的机制,使数据在多个节点间可以均匀分布,提供动态添加删除节点的功能。
- http://www.mongodb.org/display/DOCS/Sharding
- http://www.mongodb.org/display/DOCS/Sharding+Introduction
- http://en.wikipedia.org/wiki/Sharding
数据分片的自动调整
Riak基于一致性hash策略,在有节点从hash环上移除后,其数据会自动分摊整个环上的其它节点上。其负载也就被均匀分摊了。而MongoDB也支持在Sharding中摘除节点后的自动数据迁移,具体见此文:
性能对比
Riak的存储引擎本身是作为插件的形式挂载的,Riak支持BitCask,InnoDB和LevelDB等存储引擎,使用默认的BitCask引擎,你可以在性能和数据持久化的选择上进行调节。相比之下,MongoDB由于采用了mmap机制,如果索引和热数据能被内存完全装下,那么其操作基本上相当于内存操作,所以MongoDB的当机性能是相当高的。
- http://www.mongodb.org/display/DOCS/Durability+and+Repair
- http://blog.mongodb.org/post/381927266/what-about-durability
数据模型
Riak的数据存储没有特定的格式需求,它允许你存储不同体积的文档型数据,另外Riak还可以在数据间创建link来为数据建立关联。
MongoDB的数据是以BSON格式存储的,你可以在MongoDB中存储任意JSON格式的文档,在存储时会被转成BSON进行存储,另外二进制数据也可以转换成相应的一种BSON数据类型进行存储,GridFS正是基于这种类型来实现的。
查询语句及分布式操作
Riak只提供key-value式的数据操作接口,它支持key-value数据的各种操作,也支持link-walking和MapReduce操作,像二级索引这种东西,在Riak里是不存在的,因为Riak根本不关心它存的数据是什么样的,value对它来说只是一串数据。
MongoDB提供与关系型数据库类似的各种数据操作(除了关联查询),其索引机制更是与关系型数据库几乎一模一样。同时MongoDB也提供MapReduce的操作接口,用以处理一些批量任务。
- http://www.mongodb.org/display/DOCS/Indexes
- http://www.mongodb.org/display/DOCS/Querying
- http://www.mongodb.org/display/DOCS/MapReduce
冲突解决策略
Riak使用vector-clock机制来进行冲突检测,所以其冲突解决的选择权是留给应用层来做的。应用层可以决定两个用户对同一行数据的更新哪一个会胜出。
MongoDB使用的是最近更新者胜出的方式,相对来说更简单直接。
API
Riak提供给非Erlang的客户端两种操作方式
- 1. HTTP
- 2. Protocol Buffers
MongoDB的协议是自己制定的一套特有协议,其客户端由其所属的10gen公司开发并维护,基本主流的语言都有相应的官方客户端。
最后,七夕看这篇文章的都是尼玛折翼的梁山好汉,各位七夕快乐。
相关文章: | ||||
MongoDB vs Cassandra |
Warning:MongoDB Replica Sets配置注意事项 |
Cassandra、MongoDB、CouchDB、Redis、Riak、HBase比较 |
Foursquare:使用MongoDB Replica Sets的三种架构 |
Mongodb Mapreduce 初窥 |
无觅 |