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.早期出现的数据库包括平面文件数据管理系统.分层数据管理系统和网络数据管理系统,分别对应的数据结构是线性表.树和图. 平面文件数据管理系统是使用磁带对数据进行顺序存储的,带来的问题不 ...
随机推荐
- INSTALL_FAILED_UPDATE_INCOMPATIBLE
安装apk的时候,报错. 解决:把所有这个apk的相关信息删除干净,隐藏较深的是设置->应用管理->这个应用的相关信息删除干净就可以了
- sql2000/sql2005/sql2008数据库变为0字节修复/MDF文件0字节恢复
[数据恢复故障描述] 这个客户是生产型数据库,数据比较重要,产生量也比较大,客户要求必须尽快修复,保证生产尽快恢复运行.sql数据库文件,由于碎片链接过长,mdf文件突然变为0字节,开始客户尝试自行 ...
- php 利用socket上传文件
php 利用socket上传文件 张映 发表于 2010-06-02 分类目录: php 一,利用fsockopen来上传文件 以前我写过一篇关于socket通信原理的博文http://blog.51 ...
- 4、安卓数据存储——sqlite
朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名.图片url.点赞.评论等等.上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上. Android通过 ...
- java系列--类和对象
一.成员属性,构造方法,成员方法 1.类名首字母一般大写 2.方法名的首字母一般是小写,使用驼峰法(匈牙利法) myCry, 下划线法 my_cry 3.方法的声明没有函数体(接口,抽象类),数据类型 ...
- 如何备份、还原或迁移 WhatsApp 的信息和资料?
WhatsApp 会在每天清晨 2 点钟自动创建本地备份文件并将备份文件存储在手机系统设置的文件夹中. Google 云端硬盘 您可以备份对话记录和媒体到 Google 云端硬盘以便日后更换手机时仍可 ...
- Ubuntu切换默认语言
不得不说,从Ubuntu到Debian,又到CentOS 7,我胡汉三又回来了... 然后又装了个中文版的Ubuntu16.04LTS,不得不说,Ubuntu对中文的支持真的很好 不过,还是不太习惯, ...
- java中的double
代码如下: Double d1 = 0.35; Double d2 = 0.1; System.out.println(d1+d2); 结果很不幸不是0.45,而是0.4499999999999999 ...
- thinkphp 3.2 导入第三方类库的两种方式
第一种
- Android中SharedPreferences介绍和使用方法
1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使 ...