摘要:虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破。这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举。

简介

NoSQL,是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储。现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改变这一现状。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。

但是NoSQL数据库之间的不同,远超过两 SQL数据库之间的差别。这意味着软件架构师更应该在项目开始时就选择好一个适合的 NoSQL数据库。

针对这种情况,这里对 Cassandra、 Mongodb、CouchDB、Redis、 Riak、 Membase、Neo4j、HBase进行了比较:

1. CouchDB

1. 所用语言: Erlang

2. 特点:DB一致性,易于使用

3. 使用许可: Apache

4. 协议: HTTP/REST

5. 双向数据复制

6. 持续进行或临时处理

7. 处理时带冲突检查

8. 因此,采用的是master-master复制(见编注2)

9. MVCC – 写操作不阻塞读操作

10. 可保存文件之前的版本

11. Crash-only(可靠的)设计

12. 需要不时地进行数据压缩

13. 视图:嵌入式 映射/减少

14. 格式化视图:列表显示

15. 支持进行服务器端文档验证

16. 支持认证

17. 根据变化实时更新

18. 支持附件处理

19. 因此,CouchApps(独立的 js应用程序)

20. 需要 jQuery程序库

21. master-master复制是一种数据库同步方法,允许数据在一组计算机之间共享数据,并且可以通过小组中任意成员在组内进行数据更新。

最佳应用场景:适用于数据变化较少,执行预定义查询,进行数据统计的应用程序。适用于需要提供数据版本支持的应用程序。

例如: CRM、CMS系统。 master-master复制对于多站点部署是非常有用的。

2. Redis

1. 所用语言:C/C++

2. 特点:运行异常快

3. 使用许可: BSD

4. 协议:类 Telnet

5. 有硬盘存储支持的内存数据库,

6. 但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)

7. Master-slave复制(见编注3)

8. 虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如 ZREVRANGEBYSCORE。

9. INCR & co (适合计算极限值或统计数据)

10. 支持 sets(同时也支持 union/diff/inter)

11. 支持列表(同时也支持队列;阻塞式 pop操作)

12. 支持哈希表(带有多个域的对象)

13. 支持排序 sets(高得分表,适用于范围查询)

14. Redis支持事务

15. 支持将数据设置成过期数据(类似快速缓冲区设计)

16. Pub/Sub允许用户实现消息机制

17. Master-slave复制,如果同一时刻只有一台服务器处理所有的复制请求,通常应用在需要提供高可用性的服务器集群。

最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。

例如:股票价格、数据分析、实时数据搜集、实时通讯。

3. MongoDB

1. 所用语言:C++

2. 特点:保留了SQL一些友好的特性(查询,索引)。

3. 使用许可: AGPL(发起者: Apache)

4. 协议: Custom, binary( BSON)

5. Master/slave复制(支持自动错误恢复,使用 sets 复制)

6. 内建分片机制

7. 支持 javascript表达式查询

8. 可在服务器端执行任意的 javascript函数

9. update-in-place支持比CouchDB更好

10. 在数据存储时采用内存到文件映射

11. 对性能的关注超过对功能的要求

12. 建议最好打开日志功能(参数 –journal)

13. 在32位操作系统上,数据库大小限制在约2.5Gb

14. 空数据库大约占 192Mb

15. 采用 GridFS存储大数据或元数据(不是真正的文件系统)

最佳应用场景:适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求;需要使用 CouchDB但因为数据改变太频繁而占满内存的应用程序。

例如:你本打算采用 MySQL或 PostgreSQL,但因为它们本身自带的预定义栏让你望而却步。

4. Riak

所用语言:Erlang和C,以及一些Javascript

1. 特点:具备容错能力

2. 使用许可: Apache

3. 协议: HTTP/REST或者 custom binary

4. 可调节的分发及复制(N, R, W)

5. 用 JavaScript or Erlang在操作前或操作后进行验证和安全支持。

6. 使用JavaScript或Erlang进行 Map/reduce

7. 连接及连接遍历:可作为图形数据库使用

8. 索引:输入元数据进行搜索(1.0版本即将支持)

9. 大数据对象支持( Luwak)

10. 提供“开源”和“企业”两个版本

11. 全文本搜索,索引,通过 Riak搜索服务器查询( beta版)

12. 支持Masterless多站点复制及商业许可的 SNMP监控

最佳应用场景:适用于想使用类似 Cassandra(类似Dynamo)数据库但无法处理 bloat及复杂性的情况。适用于你打算做多站点复制,但又需要对单个站点的扩展性,可用性及出错处理有要求的情况。

例如:销售数据搜集,工厂控制系统;对宕机时间有严格要求;可以作为易于更新的 web服务器使用。

5. Membase

1. 所用语言: Erlang和C

2. 特点:兼容 Memcache,但同时兼具持久化和支持集群

3. 使用许可: Apache 2.0

4. 协议:分布式缓存及扩展

5. 非常快速(200k+/秒),通过键值索引数据

6. 可持久化存储到硬盘

7. 所有节点都是唯一的( master-master复制)

8. 在内存中同样支持类似分布式缓存的缓存单元

9. 写数据时通过去除重复数据来减少 IO

10. 提供非常好的集群管理 web界面

11. 更新软件时软无需停止数据库服务

12. 支持连接池和多路复用的连接代理

最佳应用场景:适用于需要低延迟数据访问,高并发支持以及高可用性的应用程序

例如:低延迟数据访问比如以广告为目标的应用,高并发的 web 应用比如网络游戏(例如 Zynga)

6. Neo4j

1. 所用语言: Java

2. 特点:基于关系的图形数据库

3. 使用许可: GPL,其中一些特性使用 AGPL/商业许可

4. 协议: HTTP/REST(或嵌入在 Java中)

5. 可独立使用或嵌入到 Java应用程序

6. 图形的节点和边都可以带有元数据

7. 很好的自带web管理功能

8. 使用多种算法支持路径搜索

9. 使用键值和关系进行索引

10. 为读操作进行优化

11. 支持事务(用 Java api)

12. 使用 Gremlin图形遍历语言

13. 支持 Groovy脚本

14. 支持在线备份,高级监控及高可靠性支持使用 AGPL/商业许可

最佳应用场景:适用于图形一类数据。这是 Neo4j与其他nosql数据库的最显著区别

例如:社会关系,公共交通网络,地图及网络拓谱

7. Cassandra

1. 所用语言: Java

2. 特点:对大型表格和 Dynamo支持得最好

3. 使用许可: Apache

4. 协议: Custom, binary (节约型)

5. 可调节的分发及复制(N, R, W)

6. 支持以某个范围的键值通过列查询

7. 类似大表格的功能:列,某个特性的列集合

8. 写操作比读操作更快

9. 基于 Apache分布式平台尽可能地 Map/reduce

10. 对 Cassandra有偏见,一部分是因为它本身的臃肿和复杂性,也因为 Java的问题(配置,出现异常,等等)

最佳应用场景:当使用写操作多过读操作(记录日志)如果每个系统组建都必须用 Java编写(没有人因为选用 Apache的软件被解雇)

例如:银行业,金融业(虽然对于金融交易不是必须的,但这些产业对数据库的要求会比它们更大)写比读更快,所以一个自然的特性就是实时数据分析

8. HBase(配合 ghshephard使用)

1. 所用语言: Java

2. 特点:支持数十亿行X上百万列

3. 使用许可: Apache

4. 协议:HTTP/REST (支持 Thrift,见编注4)

5. 在 BigTable之后建模

6. 采用分布式架构 Map/reduce

7. 对实时查询进行优化

8. 高性能 Thrift网关

9. 通过在server端扫描及过滤实现对查询操作预判

10. 支持 XML, Protobuf, 和binary的HTTP

11. Cascading, hive, and pig source and sink modules

12. 基于 Jruby( JIRB)的shell

13. 对配置改变和较小的升级都会重新回滚

14. 不会出现单点故障

15. 堪比MySQL的随机访问性能

最佳应用场景:适用于偏好BigTable:)并且需要对大数据进行随机、实时访问的场合。

例如: Facebook消息数据库(更多通用的用例即将出现)

Thrift 是一种接口定义语言,为多种其他语言提供定义和创建服务,由Facebook开发并开源。

当然,所有的系统都不只具有上面列出的这些特性。这里仅仅根据自己的观点列出一些认为的重要特性。与此同时,技术进步是飞速的,所以上述的内容肯定需要不断更新。

8种主流NoSQL数据库对比的更多相关文章

  1. 八种主流NoSQL数据库系统对比(转)

    出处:http://database.51cto.com/art/201109/293029.htm 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫 ...

  2. 主流 NoSQL 数据库对比

    HBase HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK).HBase 依托于 Hadoop 的 H ...

  3. 主流nosql数据库对比

    目前开源的NOSQL数据库有,Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Ri ...

  4. 数据库 --> 8种NoSQL数据库对比

    8 种 NoSQL 数据库对比 NoSQL是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储.现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改 ...

  5. 几款主流 NoSql 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  6. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  7. 几款主流 NoSql 数据库的对比(转)

    转自:http://www.cnblogs.com/vajoy/p/5471308.html 最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoS ...

  8. 3大主流NoSQL数据库性能对比测试报告

    近日,知名独立基准测评机构Bankmark,针对目前市面上主流的NoSQL数据库SequoiaDB.MongoDB以及Cassandra三款NoSQL数据库产品做了性能对比测试并发布测试报告.在所有的 ...

  9. 8种nosql数据库对比

    1. CouchDB 所用语言: Erlang 特点:DB一致性,易于使用 使用许可: Apache 协议: HTTP/REST 双向数据复制, 持续进行或临时处理, 处理时带冲突检查, 因此,采用的 ...

随机推荐

  1. 最新 腾讯java校招面试题(含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.腾讯等10家互联网公司的校招Offer,因为某些自身原因最终选择了腾讯.6.7月主要是做系统复习.项目复盘.LeetCode ...

  2. WebRoot/WEBINF下的classes文件内无法生成编译文件,classes下没有文件,eclipse无法编译项目

    其实主要问题还是一个eclipse配置的问题. 如下图.将这一项的勾取消掉. 转自:https://blog.csdn.net/qq_36443497/article/details/79684231

  3. cent8安装postgres

    postgres是一款免费.开源的对象型关系数据库,其在cent8的安装方式与cent7的不太一样,特此记录. 步骤: 1 安装postgres server dnf install postgres ...

  4. uwp,c#,listView与gridView列表控件进阶

    listView与gridView使用类似,这里讲解gridView的一些数据绑定(x:Bind)基础知识. 顺便学习下如何使用属性通知.(后台中的数据变化会直接显示在UI上,实现动态变化,默认是没有 ...

  5. [转帖]使用TOAD优化复杂SQL

    独家秘笈!看下如何一键优化Oracle数据库复杂sql,DBA必备 https://www.toutiao.com/i6741208493644055053/ 原来toad 还有这种功能 感觉类似于 ...

  6. 【转帖】CRI-O 1.0 正式发布

    CRI-O 1.0 正式发布 http://www.sohu.com/a/200141920_465914 CRI-O 出来之后 docker 也就可有可无了 docker创造性的提出了 将依赖关系封 ...

  7. 顺序表添加与删除元素以及 php实现顺序表实例

    对顺序表的操作,添加与删除元素. 增加元素 如下图所示  对顺序列表 Li [1328,693,2529,254]  添加一个元素 111 ,有三种方式: a)尾部端插入元素,时间复杂度O(1);  ...

  8. Python--时间模块time模块

    原地址:https://finthon.com/python-time/ Python时间模块——time模块 简介 在数据处理当中,经常会碰到处理时间的问题.比如:在序列预测的过程中,需要通过学习一 ...

  9. Oracle数据库——ROWNUM

    Oracle数据库--ROWNUM 前言   刚学到了ROWNUM的用法,网上一搜,结果发现了有很多帖子,写的都很全.本着好记性不如烂笔头的原则,我还是决定自己手打一遍,当然下面也附上了我参考的链接. ...

  10. s5p6818 从SD卡启动程序(制作SD启动卡)

    背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...