nosql数据库选型
http://blogread.cn/it/article/6654
今天在书店里翻完了一遍《七天七数据库》。这本书简单介绍了postgreSQL,riak,mongodb,HBase,riak,Neo4j,redis七个数据,并着重谈了数据库的特性差异和在部署维护时候的特点,并对不同需求下的数据库选型做了很多建议,感觉受益非浅。
我的几个项目,都遇到了mysql 向nosql过渡的问题,应该如何选型,我终于有了初步的方案。
社区网站的关系数据:neo4j
原来大量使用关联表的方式来存储,schema怎么看都觉得恶心,一共只有三列,两列是双重主键。现在有了对neo4j这样的图数据库,天生就是为了解决这样的问题而生的。原来网站里,人对小站的关注关系,图片和相册的关系,图博和标签的关系,这些现在都可以用neo4j来存储。不光是简单存储关系,还可以存储关系的hash信息,几乎1:1直接还原了设计思想。neo4j现在主要的问题是分布式能力不足,虽说官方宣称可以存储上百亿的关系,但是整个系统里留这么一个单点,总是让人不放心。好在这个社区网站的规模还远远没有大到上亿的级别,neo4j足以应付。并且用neo4j可以在编程模式上有很大的帮助,性能上也有很大提升。
社区网站的内容数据:mongodb
社区网站有用户、站点、相册、图片、博客等模型,这些模型都有丰富的元数据,其中不乏很多字段会出现空值,原来用mysql,会造成空间浪费,但是如果用nosql就可以避免空间浪费。这些模型大多数情况都是主键查询,nosql能够发挥很大的性能优势。目前的规模并不大,对性能没有特别的要求,但是由于业务逻辑非常复杂,经常会出现复杂查询,cassandra和riak对索引虽然有支持,但是非常非常有限,完全不能满足业务的需要。mongodb对索引的支持非常好,对各种查询条件的支持几乎能兼容mysql绝大多数的功能。我们希望能够简单快速地实现复杂查询,满足业务快速迭代的需要。因此,mongodb最适合最为社区主要模型的存储数据库。
原来的redis主要就是用来缓存常用模型的,而mongodb其实也有内存缓存,之前有过相关的测试,证明如果mongodb能够载入所有的数据到内存中,性能和redis相差无几。如果使用mongodb,那么redis这一层其实基本上是多余的。那么我们就只需要mongodb+neo4j就能完整实现整个应用了。
微博数据的本地缓存:cassandra
本来我考虑是用mongodb,因为mongo的数据类型是JSON,和微博的返回结果完全一致,可以在不考虑任何数据结构的情况下,将查询结果直接存进mongodb。但是mongodb有两个比较大的问题,一是他是强一致性的,而实际上我们对一致性的要求并不高,甚至希望用弱一致性(W=0,R=1)来保证高可用;二是他的写性能并不如cassandra,由于cassandra采用了多层SSTable的方式,使得它能够在多次对同一个内容进行写操作时,merge多个SSTable成一个SSTable,即使反复update同一份数据也不会降低性能,非常适合SSD。
这个业务的特点是,写比读还多,并且同一份数据经常反复写。所以看来还是cassandra更加合适一点。
高并发api接口服务数据库:cassandra/riak
需求是读取和写入的并发都非常大,每天动态访问量上亿,尤其是读取。排除HBase,因为太笨重,排除mongodb,因为它仍然是主从结构,我非常不喜欢投票选主的模式,数据分片方面支持有限。其实可选择的只剩下riak和cassandra了。riak支持任意格式的数据,比较适合全手动地存储。cassandra是面向列的,能够帮助我们更多地完成一些业务逻辑。riak完整实现了向量时钟,而cassandra通过时间戳维护一致性。不过对cassandra和riak的索引机制还不够了解,无法确定索引的方便程度和可维护性。暂时还是偏向于cassandra。
nosql数据库选型的更多相关文章
- 几款主流 NoSql 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
- HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
- NoSql 数据库
几款主流 NoSql 数据库的对比 posted @ 2016-05-11 21:36 vajoy 阅读(915) 评论(3) 编辑 收藏 最近小组准备启动一个 node 开源项目,从前端亲和力. ...
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...
- Expo大作战(十六)--expo结合firebase 一个nosql数据库(本章令我惊讶但又失望!)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 几款主流 NoSql 数据库的对比(转)
转自:http://www.cnblogs.com/vajoy/p/5471308.html 最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoS ...
- Linux实战教学笔记44:NoSQL数据库开篇之应用指南
第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...
- 主流 NoSQL 数据库对比
HBase HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK).HBase 依托于 Hadoop 的 H ...
- 《滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路》
SSD:采用闪存: 读的速度很快:写入数据时,因为需要通过加压的方式对存储单元进行电子填充,所以速度略慢:擦除速度最慢,擦除块的时间在ms级.在使用SSD的时,需要考虑到SSD的读写不平衡的特性. 滴 ...
随机推荐
- MyEclipse8.6安装svn(非link方式)
此方法经试验可行,暂时可以作为最佳解决方案. 本文所使用的MyEclipse版本为:8.6.1 svn的eclipse插件版本为:1.6.17,下载地址:http://subclipse.tigris ...
- shell入门之expr的使用 分类: 学习笔记 linux ubuntu 2015-07-10 14:59 76人阅读 评论(1) 收藏
在expr中加减乘除的使用,脚本如下: #!/bin/sh #a test about expr v1=`expr 5 + 6` echo "$v1" echo `expr 3 + ...
- javascript 高级程序设计(三)-数据类型
ECMAScript 中所有类型的值都有与这两个Boolean值等价的值 数据类型 转换为true的值 转换为false的值 Boolean true false( String ...
- 第九篇:python高级之操作数据库
python高级之操作数据库 python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段: 事件捕获 --> 事件目标 --> ...
- 在WinForm应用程序中,使用选项卡控件来加载不同的Form界面!
TabPage tp=new TabPage(); your选项卡控件.Controls.Add(tp); From1 frm=new Form1(); frm.TopLevel = false; f ...
- npm的镜像替换成淘宝
1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...
- 执行hadoop fs -ls时出现错误RuntimeException: core-site.xml not found
由于暴力关机,Hadoop fs -ls 出现了下图问题: 问题出现的原因是下面红框框里面的东西,我当时以为从另一个节点下载一个conf.cloudera.yarn文件就能解决问题,发现不行啊,于是删 ...
- cocos2dx ease 公式
所有ease计算公式都在CCTweenFunction.cpp里.
- SGU 130.Circle
答案为Catalan数C(2k, k)/(k+1) #include <stdio.h> using namespace std; int k; int main() { scanf(&q ...