转载自:of http://perfectmarket.com/blog/not_only_nosql_review_solution_evaluation_guide_chart

NoSQL Solution: Evaluation and Comparison: MongoDB vs Redis, Tokyo Cabinet, and Berkeley DB

你也许认为这是NoSQL (Not Only SQL)广告宣传的另一个博客。

是,这的确是。

但是如果这个时候你仍就为寻找一个可行的NoSQL解决方案而苦恼,读完这篇后你就知道该做什么了。

当我以前参与Perfect Market的内容处理平台时,我拼命地尝试寻找一个极端快速(从延时和处理时间上)和可扩展的NoSQL数据库方案,去支持简单地键/值查询。

在开始前我预定义了需求:

  • 快速数据插入(Fast data insertion)。有些数据集可能包含上亿的行(KV键值对),虽然每行数据很小,但如果数据插入很慢,那将这个数据集传入数据库将需要花几天时间,这是不可接受的。
  • 大数据集上的快速随机读取(Extermely fast random reads on large datesets)。
  • 在所有数据集上的一致的读写速度。这个意思是说,读写速度不能因为数据如何保持和index如何组织就在某个数据量上拥有很好的值,读写速度应该在所有的数据量上均衡。
  • 有效的数据存储。原始的数据大小和数据被导入数据库中的大小应该相差不大。
  • 很好的扩展性。我们在EC2的内容处理节点可能产生大量的并发线程访问数据节点,这需要数据节点能很好的扩展。同时,不是所有的数据集是只读的,某些数据节点必须在合适的写负载下很好的扩展。
  • 容易维护。我们的内容处理平台利用了本地和EC2资源。在不同的环境里,同时打包代码,设置数据,和运行不同类型的节点是不容易的。预期的方案必须很容易维护,以便满足高自动化的内容处理系统。
  • 拥有网络接口。只用于库文件的方案是不充足的。
  • 稳定。必须的。

我开始寻找时毫无偏见,因为我从未严格地使用过NoSQL产品。经过同事的推荐,并且阅读了一堆的博客后,验证的旅程开始于Tokyo Cabinet,然后是 Berkeley DB库, MemcacheDB, Project Voldemort, Redis,MongoDB。

其实还存在很多流行的可选项,比如Cassandra, HBase, CouchDB…还有很多你能列出来的,但我们没没有必要去尝试,因为我们选择的那些已经工作得很好。结果出来相当的不错,这个博客共享了我测试的一些细节。

为了解释选择了哪个以及为什么选择这个,我采纳了同事Jay Budzik(CTO)的建议,创建了一张表来比较所有方案在每一个需求上的情况。虽然这张表是一个事后的事情,但它展示了基本原理,同时也会对处于决策的人们带来帮助。

请注意这个表不是100%的客观和科学。它结合了测试结果和我的直觉推导。很有趣,我开始验证时没有偏见,但测试完所有的后,我也许有了一点偏心(特别是基于我的测试用例)。

另一个需要注意的是这里的磁盘访问是I/O密集性工作负载里最慢的一个操作。相对于内存访问, 这是毫秒与纳秒的关系。为了处理包含上亿行的数据集合,你最好给你的机器配置足够的内存。如果你的机器只有4G内存而你想处理50GB的数据且期望较好的速度,那你要么摇晃你的机器,要么用个更好的,否则只能扔到下面所有的方案,因为它们都不会工作。

看了这张表,你也许能猜到我选了哪个方案。不要着急,让我详细说明每一个方案。

Tokyo Cabinet (TC)是一个非常好的方案也是我第一个验证的。我现在仍然很喜欢它,虽然这不是我最后选择的。它的质量惊人的高。哈希表数据库对于小数据集(低于2千万行)惊人的快,水平扩展能力也很好。TC的问题是当数据量增加时,读写的性能下降的特别快。

Berkeley DB(BDB)MemcacheDB (BDB的远程接口)是一个较老的结合物。如果你熟悉BDB,并且不是非常依赖速度和功能集合,比如你愿意等几天去加载大数据集到数据库里并且你接受一般但不优秀的读速度,你仍可以使用它。对于我们,事实是它花了太长的时间来加载初始数据。

Project Voldemort是唯一一个基于Java和云计算的方案。在验证前我有很高的期望,但是结果却有点失望,原因是:

  • BDB Java版本让我的数据膨胀得太厉害(大概是1比4,而TC只有1比1.3)。基本上存储效率非常低。对于大数据集,它就是灾难。
  • 当数据变得很大的时候,插入速度降低得很快。
  • 当大数据集被加载时偶尔由于无法预测的异常而崩溃。

当数据膨胀得太厉害并且偶尔系统崩溃时,数据加载还没有完成。只有四分之一的数据被传播,它读速度还可以但不出色。在这个时候我想我最好放弃它。否则,除了上面列的那些需要优化,JVM可能让我操更多的心让我的头发灰的更多,虽然我已经为Sun工作了五年。

Redis是一个极好的缓存解决方案,我们也采用了它。Redis将所有的哈希表存在内存里,背后有一个线程按照预设的时间定时将哈希表中的快照存到磁盘上。如果系统重启,它可以从磁盘上加载快照到内存,就像启动时保温的缓存。它要花几分钟来恢复20GB的数据,当然也依赖你的磁盘速度。这是一个非常好的主意,Redis有一个合适的实现。

但是在我们的用例里,它工作得并不好。后台的保存程序仍妨碍了我们,特别是当哈希表变得更大时。我担心它会负面地影响读速度。使用logging style persistence而不是保存整个快照,可以减缓这些数据转存的影响,但是数据大小将会膨胀,如果太频繁,将最终影响恢复时间。单线程模式听起来不是可伸缩的,虽然在我的测试里它水平方向扩展的很好:支持几百个并发读。

另一个事情干扰我的是Redis的整个数据集必须适合物理内存。这点使得它不容易被管理,象在我们这样在不同的产品周期造成的多样化的环境里。Redis最近的版本可能减轻了这方面的问题。

MongoDB是至今我最喜欢的,在我所验证的所有解决方案中,它是胜出者,我们的产品也正在使用。

MongoDB提供了不同寻常的插入速度,可能原因是延迟写入和快速文件扩展(每个集合结构有多个文件)。只要你拥有足够的内存,上亿的数据行能在几小时内插入,而不是几天。我应该在这提供确切的数据,但数据太具体(与我们的项目有关)不见得对别人有帮助。但相信我,MongoDB提供了非常快的大数据量插入操作。

MongoDB使用内存映射文件,它一般花纳秒级的时间来解决微小的页面错误,让文件系统缓存的页面映射到MongoDB的内存空间。相比于其它方案,MongoDB不会和页面缓存竞争,因为它使用和只读块相同的内存。在其它方案里,如果你分配给太多的内存给工具自身,那盒子里的页面缓存就变得很少,并且一般来说想让工具的缓存完全地预热不是很容易,或者没有一个有效地方法(你绝对不想事先去从数据库里读取每一行)。

对于MongoDB,可以非常容易地做一些简单的技巧让所有的数据加载到页面缓存。一旦在这个状态,MongoDB就很像Redis,在随机读上有较好的性能。

在我另一个测试中,200并发客户在大数据集(上亿行数据)做持续的随机读取,MongoDB表现了总体上的400,000QPS。测试中,数据在页面缓存里预热(事先加载)。在随后的测试中,MongoDB同样显示了在适度的写负载下拥有非常好的随机读取速度。在相对来说一个大的负载下,我们压缩了数据然后将它存入MongoDB,这样就减少了数据大小所以更多的东西能放入内存。

MongoDB提供了一个方便的客户端工具(类似MySQL的),非常好用。它也提供了高级的查询功能,处理大型文档的功能,但是我们还没有用到这些。MongoDB非常稳定,基本不需要维护,处理你可能要监控数据量增大时的内存使用情况。MongoDB对不同的语言有很好的客户端API支持,这使得它很容易使用。我不用列举它所有的功能,但我想你会得到你想要的。

虽然MongoDB方案可以满足大多数NoSQL的需求,但它不是唯一的一个。如果你只需要处理小数据量,Tokyo Cabinet最合适。如果你需要处理海量数据(PB千兆兆)并拥有很多机器,而且延时不是个问题,你也不强求极好的响应时间,那么Cassandra和HBase都可以胜任。

最后,如果你仍需要考虑事务处理,那就不要弄NoSQL, 直接用Oracle。

转载于:https://www.cnblogs.com/CBDoctor/archive/2013/01/29/2881572.html

NoSQL解决方案比较相关推荐

  1. 大容量NoSql解决方案:Aerospike实战

    个推专注为开发者们提供消息推送服务多年.通过个推SDK,手机终端与服务器建立长连接,维持在线状态.然而在网络异常等情况下,消息无法实时送达到终端用户,因而推送服务器建立了一份离线消息列表,以待用户重新 ...

  2. MySQL下的NoSQL解决方案HandlerSocket

    目前使用MySQL的网站,多半同时使用Memcache作为键值缓存.虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Memcache成为故障的根源: Memcache数据 ...

  3. NoSQL与SQL:选择数据管理解决方案

    目录 1.简介 2.分布式系统:CAP定理 3.关系数据存储 3.1. MySQL的/ MariaDB的 3.2. PostgreSQL的 3.3. 其他 4.为什么要使用NoSQL? 5.键/值数据 ...

  4. 为什么NoSQL数据库是启动的最佳解决方案

    创业是一个人一生中最令人兴奋的事情之一.这也是最难的.很长的时间,一份比州际公路还要长的待办事项清单,并感觉到每一项穿越的任务都会有10项任务伴随着你的旅程. 成功启动的过程就像开发应用程序的过程:快 ...

  5. 【数据层解决方案】NOSQL:Redis,MongoDB,ES

    目录结构 SpringBoot整合Redis 一.认识Redis 1. 启动服务器 2. 启动客户端 3. Windows基本操作 4. hash结构 二.SpringBoot整合Redis 1. 导 ...

  6. 细数 Windows 平台上的 NoSQL 数据库

    从可查询的分布式解决方案,如MongoDB,到简单的分布式Key/Value存储解决方案,如Cassandra.此外,还有Riak,Tokyo Cabinet,Voldemort,CouchDB和Re ...

  7. NoSQL还是SQL?这一篇讲清楚

    随着大数据时代的到来,越来越多的网站.应用系统需要支撑海量数据存储,高并发.高可用.高可扩展性等特性要求. 传统的关系型数据库在应付这些已经显得力不从心,并暴露了许多难以克服的问题. 由此,各种各样的 ...

  8. NoSQL 非关系数据库

    NoSQL 数据库的学习 Redis的Windows版本安装 待整理 redis 安装 关于分布式的网站介绍 NOSQL 几个网页 认识MongoDB Mongodb实现副本集和Mongodb副本集的 ...

  9. MySQL+HandlerSocket=MySQL的功能+NoSQL的性能

    文章首先分析了MySQL查询时的瓶颈(SQL分析.数据表的打开关闭等),然后介绍了HandlerSocket插件.HandlerSocket插件让MySQL达到了近两倍于memcached的查询性能, ...

最新文章

  1. 简述机器指令与微指令之间的关系_自考《计算机组成原理》模拟试题(一)
  2. RecyclerView复杂适配器的终极形态?代码更解耦
  3. 如何选择PDU电源配套机柜?
  4. php 原生多图上传,php 原生多图文件上传
  5. 阿里云有一群 “猪猪侠”
  6. 高仿真的类-业务逻辑注入接口
  7. Python线程与进程 I/O多路复用
  8. python注销代码_django用户注册、登录、注销和用户扩展的示例
  9. 信号与槽是如何实现的_如何解决wifi信号不好,实现全面覆盖
  10. 你不知道的《阿里巴巴Java开发手册》背后故事
  11. 怎的使用jstack诊断Java应用程序故障
  12. 浮点数 字符串 java_Java如何将浮点数转换为字符串
  13. 英雄联盟——心得体会
  14. springboot2 security 登陆成功后无法跳转到指定页面,还是默认页面
  15. 无线电定位系统与技术期末个人总结
  16. 【Charles】charles unknown问题解决,及手机代理设置【iOS手机】
  17. Java JPG转TIF文件过大的解决方案(单张解决方案,多张可看以下参考链接)
  18. [ARC084]E - Finite Encyclopedia of Integer Sequences 乱搞
  19. U盘超级加密3000
  20. ​Linux最强总结!

热门文章

  1. Windows配置GitBook
  2. SQL中GROUP BY的理解
  3. 大学计算机专业挂科人多吗,这几个专业真的是太难了,挂科率年年都是新高,很多人都后悔了...
  4. 元气骑士机器人旁边建筑_元气骑士:锤落谁家?锤子更适合机器人还是能双持的骑士呢?...
  5. 生产活动目录不宜做快照,克隆,直接备份VMDK;
  6. 如何选用NAS、OSS和EBS
  7. swift 拖动按钮_Swift 简单控件示例:滑块(UISlider)
  8. Flutter知识点:数据存储之sqflite
  9. 云效支持自定义构建镜像 征集10家企业免费使用
  10. 阿里影业宣布新战略:“新基础设施”赋能电影产业