NoSql研究报告
NoSql研究报告
1、概述
随着互联网的不断发展,信息系统的数据变得越来越多,关系型数据库逐渐面临着难以克服的障碍,主要体现在:
- 对数据库的高并发读写需求
- 对海量数据的高效率存储和访问需求
- 对数据库的高扩展性和高可用性的需求
而在大多数与海量数据相关的应用场景下,传统关系型数据库的诸多特性却显得不那么重要(例如事务、读写实时性、多表关联),因此,非关系型数据库(NoSql)应运而生。
本文即针对当前较为主流的NoSql产品进行了横向对比。旨在为NoSql产品的选型提供依据。
2、功能对比
| 
 | MongoDB | Redis | CouchDB | Cassandra | HBase | 
| 实现语言 | C++ | C/C++ | Erlang | Java | Java | 
| 存储结构 | Document | Key-Value | Document | Wide Column | Wide Column | 
| 支持协议 | 自定义、Binary | 自定义、binary | HTTP/REST | Telnet-like | HTTP/REST | 
| 存储类型 | 普通文件系统 | 内存 | 普通文件系统 | Dynamo架构 | HDFS | 
| 数据复制 | 支持以下3种数据复制方式:Matser/Matser,Matser/Slave,Replica Sets | 主从复制Master/Slave | 双向数据复制,Master-Master | 节点由单个Java进程构成,所有节点间通过Gossip协议进行数据复制 | 借助HDFS提供高可靠的数据可用性,在数据库层不需要进行数据复制。 | 
| 水平扩展与数据分片 | 提供自动分片功能,水平扩展十分容易 | 暂时没有自动分片功能,需手动分片 | 有CouchDB Lounge这个代理插件可以做couchDB集群 | 扩容时需要调整数据分布,比较耗时。(通过Consistent | 数据始终保持均匀分布,伸缩性较好。(通过Zookeeper定位目标Region Server,最后定位Region获取数据。Region Server扩容后,通过将自身发布到Master,Master仍保持均匀分布) | 
| 一致性 | 弱一致性(最终一致) | 弱一致性(最终一致) | 分布式做的不太好,还在开发中 | 使用Quorum | 在数据库层只存在一份数据,具有强一致性 | 
| 主要功能特性 | 1、json格式的查询和写入 | 1、内存数据库 | 1、是一个MVCC的系统 | 1、支持以某个范围的键值通过列查询 | 1、采用分布式架构 Map/reduce,与hadoop完美结合 | 
| 主要应用场景 | 适用于需要动态查询支持;需要使用索引而不是 map/reduce功能;需要对大数据库有性能要求。 | 1、适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序 2、用作缓存,当memcached使用 | 用于数据变化较少,执行预定义查询,进行数据统计的应用程序。适用于需要提供数据版本支持的应用程序 | 当使用写操作多过读操作(记录日志)的场景 | 适用于偏好BigTable,并且需要对大数据进行随机、实时访问的场合 | 
| 应用例子 | 计划使用mysql的系统都可以考虑使用mongodb,事务密集型系统除外 | 股票价格、数据分析、实时数据搜集、实时通讯 | CRM、CMS系统。 master-master复制对于多站点部署是非常有用的 | 银行业,金融业(虽然对于金融交易不是必须的,但这些产业对数据库的要求会比它们更大)写比读更快,所以一个自然的特性就是实时数据分析 | Facebook、淘宝 | 
| 缺点 | 1、不支持事务 2、自动分片功能并不是很可靠 3、不能在AIX系统上安装 | 1、需要占用相当大的内存 2、没有提供自动分片功能 | 不支持动态查询,必须为每一个查询模式建立相应的view,并在此view的基础上进行查询 | 
 | 
 | 
3、性能对比
3.1 测试环境
  optiplex 780 /
4G内存 / cent os 6
3.2 测试方案
使用性能测试框架YCSB对各产品进行以下测试:
- 使用单线程插入1000W条数据
- 分别使用4/8/16/32/64/128线程,以读写负载比例为1:1的操作模式,对每款产品执行读写总计10W次操作。
- 根据每秒成功操作数(OPS)与每次操作平均延时(AL)分析各产品的性能。
3.3 测试结果
3.3.1 插入1000W条数据
在该测试中,redis表现出了较为优异的性能,下图是详细测试情况,通过每秒成功操作次数(OPS)反映出了各产品在写入时性能表现,单位为(次/秒):

3.3.2 读/写10W次
在该测试中,根据产品自身的特点,各产品在不同的环境下有不同的表现,下图是测试的详细情况,其中纵轴表示完成一次操作的平均延时,单位为us:
读操作的平均延时统计:

写操作的平均延时统计:

除此之外,在读写负载比为1:1的情况下,各产品每秒成功完成的操作数也在一定程度上反应了该产品的吞吐量,下图是详细情况,纵轴表示每秒完成的操作次数(OPS),单位为:次/秒。

总体来说,该测试反映出以下情况:
1、hbase与cassandra有最好的写性能。
2、redis有最好的读性能。
4、附录
4.1 详细数据
本次测试得到的详细数据如下:
4.1.1 写入1000W条数据
| 产品 | 总计耗时(ms) | ops | AL(us) | 失败数 | 
| HBase | 1774842 | 5634 | 701 | 0 | 
| Cassandra | 2083771 | 4798 | 204.73 | 0 | 
| mongodb | 1834681 | 5450.53 | 180.25 | 0 | 
| redis | 115864 | 8630.8 | 112.36 | 0 | 
4.1.2 读写10W次
| Type | 总计耗时(ms) | ops | 操作类型 | AL(us) | 耗时小于1ms的操作 | 总操作数 | 
| hbase_10w_4t | 20480 | 4882.81 | Write | 13.16 | 49734 | 49745 | 
| Read | 1523.39 | 28760 | 50255 | |||
| hbase_10w_8t | 17698 | 5650.35 | Write | 40.12 | 50034 | 50041 | 
| Read | 2642.07 | 15454 | 49959 | |||
| hbase_10w_16t | 14880 | 6720.43 | Write | 49.64 | 49906 | 49918 | 
| Read | 4441.15 | 1959 | 50082 | |||
| hbase_10w_32t | 26666 | 3750.09 | Write | 82.51 | 49871 | 49887 | 
| Read | 16332.56 | 73 | 50113 | |||
| hbase_10w_64t | 22087 | 4526.1 | Write | 202.33 | 49886 | 49923 | 
| Read | 26510.66 | 66 | 50045 | |||
| hbase_10w_128t | 23635 | 4229.65 | Write | 411.5 | 49812 | 49873 | 
| Read | 55354.39 | 57 | 50095 | |||
| cassandra_10w_4t | 15662 | 6384 | Write | 235.7 | 48245 | 49801 | 
| Read | 978.81 | 40294 | 50199 | |||
| cassandra_10w_8t | 22251 | 4494.18 | Write | 293.69 | 47666 | 50012 | 
| Read | 3182.84 | 20751 | 49988 | |||
| cassanra_10w_16t | 25422 | 3933.6 | Write | 284.07 | 48431 | 49750 | 
| Read | 7640.28 | 13326 | 50250 | |||
| cassanra_10w_32t | 26380 | 3790.75 | Write | 571.2 | 47003 | 49933 | 
| Read | 15926.31 | 2004 | 50067 | |||
| cassanra_10w_64t | 25538 | 3914.48 | Write | 656.34 | 47622 | 50018 | 
| Read | 30452.87 | 459 | 49950 | |||
| cassanra_10w_128t | 26211 | 3813.97 | Write | 1322.7 | 46743 | 50320 | 
| Read | 55582.7 | 410 | 49648 | |||
| mongodb_10w_4t | 8009 | 12485.95 | Write | 345.07 | 48701 | 49784 | 
| Read | 263.54 | 40294 | 50216 | |||
| mongodb_10w_8t | 8726 | 11460 | Write | 677.47 | 47306 | 49963 | 
| Read | 660.89 | 46792 | 50037 | |||
| mongodb_10w_16t | 9556 | 10464.62 | Write | 1519.25 | 43933 | 49784 | 
| Read | 1444.27 | 45380 | 50216 | |||
| mongodb_10w_32t | 12624 | 7921.41 | Write | 4399 | 38787 | 49993 | 
| Read | 3496.85 | 39693 | 50007 | |||
| mongodb_10w_64t | 13450 | 7432.56 | Write | 9188.02 | 35429 | 49930 | 
| Read | 7274.17 | 36024 | 50038 | |||
| mongodb_10w_128t | 17546 | 5697.48 | Write | 25402.16 | 30248 | 49701 | 
| Read | 18014.58 | 31634 | 50267 | |||
| redis_10w_4t | 3308 | 30229 | Write | 120.26 | 50085 | 50203 | 
| Read | 130.91 | 49706 | 49797 | |||
| redis_10w_8t | 3499 | 28579.59 | Write | 252 | 49142 | 49520 | 
| Read | 261 | 50142 | 50480 | |||
| redis_10w_16t | 3863 | 25886.61 | Write | 599.65 | 45967 | 49973 | 
| Read | 606.69 | 46183 | 50027 | |||
| redis_10w_32t | 7533 | 13274.92 | Write | 1975.88 | 3582 | 50388 | 
| Read | 2105.88 | 3233 | 49612 | |||
| redis_10w_64t | 5736 | 17428.17 | Write | 2826.28 | 268 | 50179 | 
| Read | 2757.48 | 238 | 49789 | |||
| redis_10w_128t | 3722 | 26858.67 | Write | 4479.02 | 117 | 50011 | 
| Read | 4599.77 | 101 | 49957 | 
4.2 软件版本
l YCSB 0.14
l HBase 0.90.5 (Hadoop 0.20.2)
l Cassandra 1.1.2
l mongodb 2.0.6
l redis 2.4.15
NoSql研究报告的更多相关文章
- NoSql数据库使用半年后在设计上面的一些心得
		NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ... 
- 非关系型数据库(NoSql)
		最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ... 
- 关系型数据库与NoSQL数据库
		关系型数据库的优缺点 优点: 可以做事务处理,从而保证了数据的一致性: 可以进行JOIN等多表查询: 由于以SQL标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处). 缺点: 大量数据的写 ... 
- 2016年中国微信小程序专题研究报告
		2016年12月29日,全球领先的移动互联网第三方数据挖掘和分析机构iiMedia Research(艾媒咨询)权威首发<2016年中国微信小程序专题研究报告>. 报告显示,82.6%手机 ... 
- 几款主流 NoSql 数据库的对比
		最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ... 
- “NOSQL” 杂谈
		引言: nosql 的兴起和革命,在我看来已经开始逐渐影响到了传统的sql的地位,但是仅仅是影响而已,取代是不太可能的. 正文: 两年前,一个偶然的机会开始接触到 nosql ( mongodb ). ... 
- Squirrel: 通用SQL、NoSQL客户端
		安装 配置数据库 配置驱动 配置连接 如果你的工作中,需要使用到多个数据库,又不想在多种客户端之间切换来切换去.那么就需要找一款支持多数据库的客户端工具了.如果你要连接多个关系型数据库,你就可以使用N ... 
- NoSQL和MongoDB
		NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”.关系数据库关注在关系上,NoSQL关注在存储上. 发展背景 (1)传统关系型数据库遇到了性能瓶颈. 高并发读写(High ... 
- NoSQL指南
		一.数据库发展 1.早期出现的数据库包括平面文件数据管理系统.分层数据管理系统和网络数据管理系统,分别对应的数据结构是线性表.树和图. 平面文件数据管理系统是使用磁带对数据进行顺序存储的,带来的问题不 ... 
随机推荐
- 多线程的并发问题,lock用法
			开启多个线程,每个线程中多次操作公共变量 using System; using System.Collections.Generic; using System.Linq; using System ... 
- Swift迁入第三方库时的版本错误解决
			我的swift的项目用的是swift 2.3的版本,但是用CocoaPods迁入一个第三方:ObjectMapper后,编译会出现这样一个问题: Use Legacy Swift Language V ... 
- select into from 和 insert into select 的用法
			SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) valu ... 
- Python3基础 set() 集合 创建集合与特点:自动将重复合并掉 不支持索引
			镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ... 
- Python的lambda匿名函数
			lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 g = lam ... 
- JavaScript定时机制、以及浏览器渲染机制 浅谈
			昨晚,朋友拿了一道题问我: a.onclick = function(){ setTimeout(function() { //do something ... },0); }; JavaScript ... 
- 企业为什么要实行ERP系统,它到底有什么好处呢?
			目前,我国正在大力推行企业信息化建设,作为一种包含了现代管理思想的ERP(Enterprise Resource Planning)系统日益成为现代企业业务运作的主要工具,为了提升管理水平,提升企业竞 ... 
- 第一个Servlet程序及分析
			第一个Servlet程序: package cc.openhome; import java.io.IOException; import java.io.PrintWriter; import ja ... 
- jQuery事件触发和参数传递
			jQuery事件触发和参数传递: 参考:http://www.jb51.net/article/36249.htm <%@ page language="java" impo ... 
- Flex移动应用程序开发的技巧和窍门(三)
			这是关于 Flex 移动应用程序开发的技巧和窍门系列文章的第三部分内容.第一部分内容主要集中讨论了视图之间以及应用程序执行之间切换时的数据处理.第二部分则主要涵盖了应用程序动作条和标签组件风格化方面的 ... 
