与关系型数据库RDBMS的大厂商垄断不同,NoSQL在发展之初就可谓是百家争鸣、百花齐放,无论目前如日中天的MongoDB,还是刚刚发布最新版本的Redis;无论是面向文本的CouchDB,还是基于KV的Cassandra,都有着各自的特点和应用场景。而作为传统SQL数据库的良好补充,DBA有必要了解这些主流NoSQL数据库的各自特点。在本文中,我们就将对比一下主流NoSQL数据库,包括了Cassandra、Mongodb、CouchDB、Redis、Riak以及HBase。

 

基本特性:


各自特点与应用场景:

 

Cassandra

 

  • 分布式与复制的权衡
  • 根据列和键范围进行查询
  • BigTable类似的功能:列,列族
  • 写比读快很多
  • Map/reduce Apache Hadoop
  • Java语言在设置上会有一定复杂度

最佳适用:写操作较多,读比较少的时候。如果你的系统都是基于Java的时候。

应用场景:银行,金融行业。数据分析。

 

MongoDB

 

  • 主从复制
  • 查询利用javascript表达式
  • 服务器端运行javascript函数
  • 比CouchDB更容易就地升级
  • 内置Sharding
  • 数据存储使用的是内存映射文件
  • 数据库崩溃后需要对表进行修复
  • 持久性更好

最佳适用:如果你需要动态的查询,如果你更偏向与定义索引而非 map/reduce,如果你针对大数据库想要更好的性能,如果你想使用CouchDB而数据变化太快,磁盘不够用的话,可以使用MongoDB。

应用场景:一言以蔽之,MySQL或PostgreSQL的替代品。

 

CouchDB

 

  • 双向复制
  • 连续或ad-hoc
  • 冲突检测
  • 主主复制(master-master replication)
  • 多版本并发控制,写操作不会阻塞读取
  • 通用的技术文档
  • 只崩溃设计Crash-only
  • 需要经常压缩
  • 视图:嵌入式map/reduce
  • 格式化视图:lists & shows
  • 服务器端文档验证可行
  • 身份验证可行
  • 通过_changes实时更新
  • 附件处理
  • CouchApps(独立js应用)
  • 包括jQuery库

最佳适用:对于数据变化不太频繁的业务,运行有预先定义的查询。此外对于版本控制有高要求的业务同样适用。

应用场景:CRM、CMS系统。主主复制是非常有趣的功能特性,它令多站点部署变得更加容易。

 

 

Riak

  • 分布式与复制的权衡
  • post-commit 和pre-commit hooks
  • 安全性验证
  • 内置的全文检索
  • Javascript或Erlang Map/reduce
  • 开源 与 企业 两个版本

最佳适用:如果你想要Cassandra或Dynamo类似的功能,但不想太复杂。如果你需要非常好的单点扩展性、可用性和容错功能可以使用Riak。

应用场景:销售点数据采集。工厂控制系统。需要零停机时间的场景。

 

Redis

 

  • 内存数据库
  • 2.0版本之后可以部署到硬盘上
  • 主从复制
  • 简单的Key-Value
  • 操作符较为复杂,如ZREVRANGEBYSCORE
  • INCR & co (有利于速率限制和统计)
  • 有集合(union/diff/inter)
  • 有列表(a queue; blocking pop)
  • 有散列(多字段对象)
  • NoSQL中唯一处理交易的数据库
  • Value可以设定过期
  • 分类集合(有利于范围查询)
  • 针对数据变化的Pub/Sub和WATCH

最佳适用:在数据库大小可预见的前提下,适用于数据变化速度快的应用。

应用场景:股价系统,数据分析,实时数据采集以及实时通信场景。

 

HBase

 

  • 分布式与复制的权衡
  • 模仿BigTable
  • Map/reduce Hadoop
  • 利用服务器端扫描进行查询预测叠加并获取过滤
  • 优化的实时查询
  • 高性能Thrift网关
  • HTTP支持XML、Protobuf和二进制
  • Cascading、hive、pig source和sink模块
  • 基于Jruby的shell
  • 无单点故障
  • 类似MySQL的随机访问性能

最佳适用:如果你喜欢BigTable,如果你需要随即、实时的读写大数据(Big Data),可以使用HBase。

应用场景:Facebook网站邮件数据库等。