免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4859 | 回复: 1

[MongoDB] Riak与MongoDB的对比 [复制链接]

论坛徽章:
0
发表于 2012-02-22 15:54 |显示全部楼层
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/248 ... odb-update-in-place
http://www.mongodb.org/display/DOCS/Updating#Updating-Update
复制备份及横向扩展
Riak主要通过一致性hash算法来实现其数据的复制及分片,一致性hash机制是Riak的核心思想之一。在Riak中,每个节点都是对等的,所以其不存在单点故障。

Add Nodes to Riak
Consistent Hashing
而MongoDB在1.6版本后也推出了强有力的复制备份功能

1.主从复制
http://www.mongodb.org/display/DOCS/Master+Slave
2.Replica Sets
Replica Sets是MongoDB的重头功能之一,它让几个节点组成一个集合,在这个集合中的节点中有一个主机提供写入,其它节点会从主机上备份数据,主机故障后会自动在从机中选取产生新的主机。

http://www.mongodb.org/display/DOCS/Replica+Sets
而在数据分片上,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中摘除节点后的自动数据迁移,具体见此文:

http://www.mongodb.org/display/D ... ding-Removingashard
性能对比
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来为数据建立关联。

Data Storage in Riak
MongoDB的数据是以BSON格式存储的,你可以在MongoDB中存储任意JSON格式的文档,在存储时会被转成BSON进行存储,另外二进制数据也可以转换成相应的一种BSON数据类型进行存储,GridFS正是基于这种类型来实现的。

查询语句及分布式操作
Riak只提供key-value式的数据操作接口,它支持key-value数据的各种操作,也支持link-walking和MapReduce操作,像二级索引这种东西,在Riak里是不存在的,因为Riak根本不关心它存的数据是什么样的,value对它来说只是一串数据。

https://wiki.basho.com/display/RIAK/MapReduce
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机制来进行冲突检测,所以其冲突解决的选择权是留给应用层来做的。应用层可以决定两个用户对同一行数据的更新哪一个会胜出。

Vector Clocks
MongoDB使用的是最近更新者胜出的方式,相对来说更简单直接。

http://www.mongodb.org/display/DOCS/Atomic+Operations
API
Riak提供给非Erlang的客户端两种操作方式

1. HTTP
2. Protocol Buffers
MongoDB的协议是自己制定的一套特有协议,其客户端由其所属的10gen公司开发并维护,基本主流的语言都有相应的官方客户端。

http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol
最后,七夕看这篇文章的都是尼玛折翼的梁山好汉,各位七夕快乐。

论坛徽章:
0
发表于 2012-02-24 17:32 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP