对比Riak与MongoDB

日期: 2011-08-07 作者:nosqlfan 来源:TechTarget中国 英文

  机制与概念上的异同

  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.主从复制

  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/DOCS/Configuring+Sharding#ConfiguringSharding-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来为数据建立关联。

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

  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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

nosqlfan
nosqlfan

相关推荐