[转]Riak与MongoDB的对比

来源:互联网 发布:笔记本刷mac os 编辑:程序博客网 时间:2024/05/29 09:55

本文来自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中,每个节点都是对等的,所以其不存在单点故障。

  • 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/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来为数据建立关联。

  • 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
阅读(199) | 评论(0) | 转发(0) |
0

上一篇:企业中的NoSQL

下一篇:企业中的NoSQL

相关热门文章
  • 策划可行性电子邮件营销方案技...
  • 如何高效进行邮件推
  • BGP多线单IP技术实现形式以及...
  • 本文是在百度“网站运营优化实...
  • 应用水玻璃基型砂的十二项技术...
  • ABAP文章索引
  • 数据库课程设计报告(仓库管理...
  • 拼音汉字对照表
  • sql isnull函数的使用
  • 数据挖掘电子书下载
  • LNMP 老是会出现502?
  • suse 运用一个shell获取本机和...
  • 虚拟机 unix 配置ip
  • hp-un 主机新系统读不到磁盘阵...
  • mysql出现问题:Starting MySQ...
评论热议
0 0
原创粉丝点击