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的读写不平衡的特性. 滴 ...
随机推荐
- DELPHI 重命名文件名时 文件存在自动重命名
procedure TForm1.Button1Click(Sender: TObject); var Dir, FileTitle, FileExt: string; s,s1: str ...
- clock_gettime测代码运行时间
//函数原型: // long clock_gettime (clockid_t which_clock, struct timespec *tp); //参数列表: // CLOCK_REALTIM ...
- JMX 与系统管理--转
前言 在 Java 程序的运行过程中,对 JVM 和系统的监测一直是 Java 开发人员在开发过程所需要的.一直以来,Java 开发人员必须通过一些底层的 JVM API,比如 JVMPI 和 JVM ...
- SQL Server中的死锁
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
- Oracle主键自动生成_表and存储过程
-- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...
- iOS中ARC内部原理
ARC会自动插入retain和release语句.ARC编译器有两部分,分别是前端编译器和优化器. 1. 前端编译器 前端编译器会为“拥有的”每一个对象插入相应的release语句.如果对象的所有权修 ...
- 使用IDEA,利用SpringMVC框架建立HelloWorld项目
无论是从头开始学习一门新的语言还是技术,我们的入门都是从HelloWorld开始,也许就是因为这样,我在学习Spring MVC的时候,就有一种偏执,一定要写出一个HelloWorld来.研究了好久, ...
- 通用数据挖掘[ZZ]
一.什么是数据挖掘?许多人认为数据挖掘更像是一门哲学,或数学的组成部分,而不是业务需求的实际解决方案.您可以从采用的各种定义中看出这一点,例如:“数据挖掘是对非常大型的数据进行的研究和分析,采用自动或 ...
- zoj 3209.Treasure Map(DLX精确覆盖)
直接精确覆盖 开始逐行添加超时了,换成了单点添加 #include <iostream> #include <cstring> #include <cstdio> ...
- Linux下ln链接命令详解
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...