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