主流NoSQL技术详解与比较

主流NoSQL分类

1键值(Key-Value)存储数据库
键值对NoSQL是比较流行的一种NoSQL的解决方案,特点就是采用键值对来存储数据,它的优势在于容易部署和简单性,但是如果查询的部分只是整个数据库的小部分,那性能并不是特别突出。

2列存储数据库
列存储NoSQL比较适合的场景是处理海量的分布式存储的数据,它的主键可能是指向多个列的,数据量增加的时候几乎不影响性能。

3文档型数据库
文档数据库是采用类似键值对的方式进行存储,更准确的说是采用的JSON的格式进行存储,可以嵌套键值对,文档数据库比键值对数据库的效率更高,主流的文档型NoSQL为MongoDB、CouchDB等等。

4图形(Graph)数据库
图形数据库是以灵活的图形结构去存储数据,这样极大的避免了传统的SQL数据库需要首先定义模式才能存储数据的局限性。

  • Canssandra

Canssandra是一个基于amazon的Dynomo和google的BigTable模型由facebook开发的NoSQL数据库。Canssandra具有良好的扩展性和伸缩性,是一个分布式存储的数据库,不仅具有良好的数据结构存储的支持,还采用了BigTable的基于列的模型,数据量变大不会导致性能的降低,它侧重了CAP中的AP,即可用性和分区容忍,分布式基于一致性hash环算法实现,Cassandra是无结构存储,所谓的无结构是对应的关系数据的结构化数据,它不需要事先定义好字段,记录当中的每一行可以是不同的结构,每一行也有个唯一标示可以进行索引。
Cassandra不是一个完全的数据库,而是主要强调的是分布式的存储网络,包含很多节点,数据被存储到某个节点,当用户访问集群的时候,集群会根据适合的路由去相关的节点获取数据。对于整个数据库的扩充也是十分方便的,直接增加节点即可。
Canssandra采用了多维度的key-value存储结构,比传统的数据库静态定义模式的方式更加灵活。有比较典型的NoSQL数据处理能力和扩充能力,只要简单地向集群里添加节点。灵活的查询功能,可以指定在一定范围内去查询。良好的对分布式集群的数据访问支持。
它的优点大概有以下几个方面:
(1)扩展性:不用预先定义字段,灵活的扩充字段,相比传统数据库需要静态的定义字段才能存储数据有方便扩展的优势。
(2)分布式:它的存储是基于很多节点的分布式,扩充容量只需要添加节点即可,迁移十分的方便,方便集中读写数据,单点不容易失败。
(3)去中心化:P2P支持,容易备份有良好的容灾支持。
(4)支持范围查询:不一定去查询所有的数据,可以指定键的范围去查询。
缺点如下也是比较明显的,它最开始的设计就不是面向存放超大规模文件的系统,因此应用还是有一定局限性的,它的开源社区也并没有完善,代码层面还有一些问题,底层没有采用一个类似 HBase之类的HDFS去存储文件,因此大文件是个问题,采用客户端去分割文件也会降低可用性。因此如果是构建大规模数据存储和处理,可以使用Hbase和HDFS,就算是扩展性来说MongoDB也不失为一个不错的的选择。
Canssandra最开始来自于facebook,但是对于facebook的应用也仅限于index box,因此Canssandra没有太多大规模数据访问成功的案例,index box对于facebook也不是出于比较核心的基础架构,后来twitter虽然对Canssandra寄予厚望大量的优化,但是最终还是放弃了Canssandra。Canssandra还有很多运维的相关问题不能好的解决,例如跟其他工具整合,刷新集群的数据到磁盘可能导致停机等情况等等。因此Canssandra逐渐在NoSQL中处于比较边缘的状态。

  • MongoDB

MongoDB是现在非常流行的一种NoSQL,具有操作简便,完全开源免费,灵活的扩展性,弱事务管理的特点。MongoDB是由C++编写,这种类似于C语言的编程语言使得在底层执行效率更加高效。 MongoDB也是最像关系数据库的NoSQL,简便和灵活的模式和高性能让国内大多的创业公司最开始就选择MongoDB 作为自己基础架构。
高性能、高扩展、易部署、易使用的存储解决方案。它的存储结构区别于关系数据库的表,采用类似集合的结构,集合中存放的内容类似表中存放的记录,叫做文档,存储的数量不受限制,存放的字段也是自由的,不用事先定义,传统的关系数据库要修改表结构小则降低可用性,严重的情况还会停机。可以对应字段添加索引,加快查询速度。还可以指定索引进行查询。MongoDB支持强大的聚合工具,可以采用MapReduce实现各种聚合任务。采用二进制存储对象,这样更加的高效。对远程数据库访问的良好支持。自动采用分片处理,支持多种语言开发的驱动。
MongoDB可以很好地支持面向对象的查询,支持传统关系数据库类似的查询功能,也支持建立索引,支持多种语言。MongoDB与传统关系数据库表类似的集合。集合包含的记录我们叫做文档,文档可以是各种数据结构,类似于JSON一样的格式,我们叫做BSON的数据结构。
MongoDB可以有多个数据库,每个数据库相对独立。可以分别设置不同的权限来进行管理,数据库里存放的集合,这个集合类似于里面的表,但是不同的是相对于关系数据库,这个集合里存放的记录我们叫做文档,文档的结构是十分灵活的,并没有特别的模式。理论上来讲我们可以将整个应用系统的所有内容都存放在一个集合里,但是如果系统比较大的话这不是很方便管理而且对于数据的操作也不是特别方便,因此我们一般会按照业务逻辑去划分一些集合去分别存放这些数据,不会太关注与传统关系数据库里面字段的定义。文档的结构类似于JSON的格式,可以有键,键只能是字符串类型,值可以是常用的类型,例如整形、布尔型、时间型、也可是嵌套的文档或者是数组类型。
MongoDB对分布式的支持也十分良好,内置了MapReduce引擎。可以弹性的扩充数据管理能力。非常适合高并发的增删改查操作。MongoDB也可以用来做缓存数据库,因为频繁交互数据对于传统数据库可能性能过载,所以让MongoDB存放部分数据提升整个数据持久层的相应能力。因为很多NoSQL的共性,横向的扩充数据存储能力的MongoDB也适合用,廉价的基础设施来存储大尺寸低价值的文件,这比利用传统的关系数据库存放的成本要降低很多。传统的数据库我们在处理高并发的情况为了保证严格的一致性,我们可能会在数据更新的时候进行锁表等操作,这样如果短时间内大量的请求堵塞在这里将会导致数据库的IO性能急剧降低,在MongoDB弱化了事务的概念,我们优先保证了可用性和分区容忍,我们首先将数据读取放到内存,然后再尽快的去保持数据的一致性而不会导致大量的锁存在导致其他的访问被阻塞在这里。传统的数据库大量的表连接操作在数据量非常大的情况下通常会消耗比较大的资源,MongoDB灵活的字段定义可以让不同的文档有不同的记录。由于MongoDB的壮大,各种开源社区提供的相关语言支持也相当的完善。
MongoDB不是万能的,它在CAP理论中弱化了一致性,基于BASE理论的NoSQL在一致性的保证难以跟传统数据库抗衡,因此对于银行系统等对实时修改可见性即对事务性要求很高的应用系统采用MongoDB的可能性暂时还比较小,MongoDB不支持事务。对于高度优化查询的情况,例如商业智能的处理情况下,数据仓库可能更适合。还有在需要SQL操作数据库的情况,更适合传统的关系数据库。

  • Hadoop

Hadoop是一个实现了海量分布式存储的基础架构,Hadoop的底层实现了一个HDFS(分布式文件系统)。可以海量的存储数据而对于数据的基本操作性能不受到影响,可以采用比较廉价的存储方案分布式地存储在集群上,采用比较松散的一致性算法,可以灵活的对海量数据进行流式的访问。
对于Hadoop的核心就是两点:HDFS(海量存储支持),MapReduce(对海量数据的计算)。数据存放在计算集群里,然后通过MapReduce进行运算出Results然后在存放在DFS。Hadoop首先将文件拆分成64MB的数据,然后存放到hadoop集群,然后Hadoop可以可靠地在分布式环境下弹性的处理大数据文件,
Hadoop开始是apache lucene的子项目,就是为了就是加快数据处理,最开始就是基于集群。Hadoop作为核心的两个部分就是HDFS和MapReduce,HDFS全称是Hadoop distribute file system,就是存放和管理海量数据的文件系统。
对数据库的基本操作我们都可以概括为增删改查,那么笔者来谈谈 HDFS的增删改查原理。首先Hadoop是一个集群,这个集群有一个MasterNode,还有很多SlaveNode。客户端都是首先与主节点masterNode打交道,对于文件的写入,我们给masterNode发送请求,masterNode首先查看从节点的分配情况,并返回给客户端从节点的地址,然后客户端找将文件分成大小的block文件块,顺序的写入从节点的dataNode。文件的读取也是客户端首先请求masterNode,然后masterNode返回具体的dataNode给客户端,然后客户端读取。
对于MapReduce,我们可以把它的功能理解成是对于写入文件的归纳整理成一个结果并存放在HDFS的工具。MapReduce把数据分解成小块存放在HDFS,然后Hadoop可以在存放数据节点之间处理数据。当部分的dataNode失效的时候可以让集群之间自动完成数据的复制达到数据一致。
Hadoop的特点在于高扩展性、高可靠性、效率高、低成本。数据的存储可以达到千兆级别(PB级),非常适合做大数据处理;高可靠性,因为在部分的节点数据失效的情况下也能自动完成数据的备份和恢复,系统保持可用;效率高是可以并行地在不同的节点上处理数据;低成本是方便增加节点的方式横向的扩充集群的处理能力,而不是像传统的集群那样纵向的去提升服务器,让数据的分布式处理更加的廉价,而且Hadoop也是开源的,是免费的。缺点是无法得到企业支持的服务保证。HDFS的结构比较SQL数据库更适合数据仓储。高性价比的大数据处理方案。

  • Redis

Redis也是一种十分流行的NoSQL,它是一个缩写,全称为remote directionary server。Redis类似于memercache,它是将数据存放在内存,是一种键值对的数据结构,采用TCP连接访问数据库,Redis支持的数据类型有字符串、集合、列表、散列等类型。
Redis对访问速度的支持非常强大,每秒达十万次的存取数据,对于数据的持久化也有相关的支持,可以一边服务一边对数据提供持久化操作。整个过程是在异步的情况下进行。由于Redis支持高速查询和数据持久化,因此Redis也经常用于数据缓存和消息队列等应用场景。Redis提供缓存时间的调整,自动删除相关数据,这样扩展了Redis的应用场景。Redis客户端可以支持多种语言,在Redis内部对数据的交互采用相关的命令来进行,这可以类比于SQL语句。因此Redis可以在各式各样的客户端实现,各种客户端分别封装了这些命令,可以使Redis的存储更加的简单方便,由于其开源的特性也让整个生态更加的壮大。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Spark简要学习 - 2016-07-24 19:07:20

什么是Spark? 在Apache的网站上,有非常简单的一句话,'Spark is a fast and general engine',就是说Spark是一个统一的计算引擎,而且突出fast。那么具体是做什么的?是做large-scale的processing,即大数据处理。 Spark is a fast and general engine for large-scale processing. 这句话非常简单,但是它突出了Spark的一些特点:第一个特点就是Spark是一个并行式的、内存的、计算密

CentOS上面安装Oracle 11GR2 - 2016-07-24 17:07:10

正常图形化界面安装 安装X Window yum groupinstall "X Window System" yum install unzip .x 86_64 vim java- 1.8 .0 -openjdk .x 86_64 java- 1.8 .0 -openjdk-devel .x 86_64 安装依赖软件包 yum install binutils compat -libstdc ++- 33 elfutils -libelf elfutils -libelf -devel gcc gcc

pl/sql知识点总结 - 2016-07-24 14:07:00

概念 pl/sql(procedural language/sql)是oracle专有的在sql上扩展的一门语言,不仅可以写sql语言,还可以定义变量和常量。 pl/sql编写的存储过程,函数等可以提高效率,省去了传统程序与数据库交互时的编译时间。(例如:传统java程序在访问数据库带着sql语句访问,sql语句需要编译后才能被数据库识别) 编写 存储过程 SQL create or replace procedure sp_pro1 is 2 begin 3 insert into test value
实际项目实践过程中,经常会遇到一些形如“ORA-XXXX”的Oracle错误提示,此时,我们便会打开百度、Google,搜索相关技术解决方案。本系列博文的目的就在于,对常见的Oracle错误提示进行总结,不断完善。 ORA-12560 ORA-12560: TNS: protocol adapter error(SQLPLUS) ORA-27101: shared memory realm does not exist(PL/SQL Developer) (1)原因分析 在path环境变量中Oracle_
调试经验: 1. 编译包时,如果出现编译错误(PL/SQL developer中包名出现红叉),可通过以下语句查看: SELECT   name,line, POSITION, text     FROM user_errors    WHERE NAME = 'INITTEST' ORDER BY SEQUENCE; 2. 上述语句中,引号中的包名(如,INITTEST)一定要大写,否则查不到 另外,PL/SQL中的包分为包规范(包的定义)和包体(包的实现)两部分,是PL/SQL编程的基本单元。 虽然名

DB2数据库的学习及总结 - 2016-07-23 19:07:12

                                                                                                                                                   db2命令 给db2用赋权的命令 db2 grant dbadm on database to user dsp #导出数据库结构会生成一个faldb20160224.sql文件  db2look -d udep -
对于PL/SQL这种基本上面向过程的语言来讲,子程序(过程和函数)就是其核心所在了。 整个解决方案可通过组织、调用由过程和函数构成的模块来实现。 在“Divide and conquer”(分而治之)的编程世界中,子程序就是程序员手中的兵器,用的越熟练越好。 --代码 13.1 创建过程示例CREATE OR REPLACE PROCEDURE newdept ( p_deptno dept.deptno%TYPE, --部门编号 p_dname dept.dname%TYPE, --部门名称 p_loc
调试nocopy功能时,为了看到实际效果,设置了一个比较大的循环次数,结果悲剧了: 运行了近1个小时没出结果,电脑死机(任务管理器都打不开);无奈只能强行关机,开机时间又特别长,一度让我以为系统崩溃。 看来,PL/SQL developer下调试这种暴力计算的程序风险很高啊,我在Eclipse下调试Java程序时从来没碰到过这种造成电脑死机的情况。 不过,这章的内容实用性很强,死机也值了(有点心疼电脑了 ) -代码13.11 使用%Type定义形式参数CREATE OR REPLACE PROCEDURE
Less - 54 Challenge-1 Test Sourse Code Solution Less - 55 Challenge-2 Test Sourse Code Solution Less - 56 Challenge-3 Test Sourse Code Solution Less - 57 Challenge-4 Test Sourse Code Solution Less - 58 Challenge-5 Test Sourse Code Solution Less - 59 Chall

CentOS7安装配置hadoop2.7.2 - 2016-07-23 18:07:08

linux 虚拟机配置 系统配置: 虚拟机:一个master(Master.Hadoop),两个slave(Slave1.Hadoop, Slave2.Hadoop) 网络设置:我使用的是桥接的方式 内存:每个虚拟机配置4G内存 分区:手动配置 软件选择:最小安装,注意选择开发工具 用户设置:密码都设置为:hadoophadoop, 不创建任何用户,操作时使用root直接进行 安装完后各个虚拟机的ip配置(参考用) 主机 ip地址 master.hadoop 192.168.200.30 slave1.h