1. 什么是NoSQL?
NoSQL(Not Only SQL) 即不仅仅是SQL,泛指非关系型的数据库,它可以作为关系型数据库的良好补充。
NoSQL 不依赖业务逻辑方式存储 ,而以简单的key-value模式存储,因此大大的增加了数据库的扩展能力
2. 为什么会出现NoSQL技术?
2.1 概述
Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题

- 随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS(Social Networking Services 社交网络服务)类型的web2.0纯动态网站已经显得力不从心,再加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战

2.2 出现以下问题
High performance - 数据的高并发读写
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。
而关系型数据库应付上万次SQL查询还勉强可以承受,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。
其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
Huge Storage - 海量数据的高效率存储和访问
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,如Friendfeed一个月就达到了2.5亿条用户动态。
对于关系型数据库而言,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
同样对于大型web网站的用户登录系统,如腾讯、阿里、网易等动辄数以亿计的帐号,使用关系型数据库很难应付。
High Scalability & High Availability - 数据库的高扩展和高可用
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server 和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。
对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,因此需要数据库具有可扩展和高可用的特性。
总结:
传统的关系型数据库只能存储结构化数据,对于非结构化的数据支持不够完善。
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
3. NoSQL类别

3.1 键值(Key-Value)存储数据库
说明:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键 和一个指针指向特定的数据。
Key/Value模型对于I- T系统来说优势在于简单、易部署。
应用:内容缓存 ,主要用于处理大量数据的高访问负载。
产品:Tokyo Cabinet/Tyrant、==Redis==、Voldemort、Berkeley DB
优势:快速查询
劣势:存储的数据缺少结构化
3.2 列存储数据库
-
说明:这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,这些列是由列家族来安排的。
-
应用:分布式文件系统
-
产品:Cassandra,==HBase==,Riak

-
Cassandra:
-
Apache Cassandra是一款免费的开源NoSQL数据库
-
其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量通常达到PB级别)
-
Cassandra最为卓越的长处是对写入及读取操作进行规模调整 ,而且其不强调主集群的设计思路能够以相对直观的方式 简化各集群的创建与扩展流程
-
HBase
hbase是Hadoop 项目中的数据库。它用于需要对大量的数据进行随机、实时的读写操作的场景中
HBase的目标就是处理数据量非常庞大 的表,可以用普通的计算机 处理超过10亿行数据 ,还可处理有数百万列元素的数据表
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
3.3 文档型数据库
说明:该类型的数据模型 是版本化的文档,半结构化的文档 以特定的格式存储,如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值 。而且文档型数据库 比键值数据库的查询效率更高。
应用:Web应用
产品:CouchDB,==MongoDB==
MongoDB
高性能、开源、模式自由(schema free)的文档型数据库
数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
支持二进制数据及大型对象
可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据
优势:数据结构要求不严格
劣势:查询性能不高,且缺乏统一的查询语法
3.4 图形(Graph)数据库
说明:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST格式的数据接口或者查询API。
应用:社交网络
产品: ==Neo4j==,InfoGrid,Infinite Graph

- Neo4j:用于描述公共交通网络,地图及网络拓谱,社会关系,如:

优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
4. NoSQL适应场景
对数据高并发的读写
海量数据的读写
对数据高可扩展性的
数据模型比较简单
需要灵活性更强的IT系统
不需要高度的数据一致性
对于给定key,比较容易映射复杂的环境
取最新的N个数据(如排行榜)
数据缓存
即:用不着sql的和用了sql也不行的情况,请考虑用NoSql
4.1 数据库对比

5. 在分布式数据库中CAP原理
5.1 传统的ACID是什么
-
关系型数据库遵循==ACID==规则,事务在英文中是transaction,和现实世界中的交易很类似
-
事务有如下四个特性:
-
A (Atomicity) 原子性:指事务里的所有操作要么都成功,要么都失败。事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
-
C (Consistency) 一致性:指数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
-
I (Isolation) 隔离性:指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
-
D (Durability) 持久性:是指一旦事务提交后,它所做的修改将会永久的保存在数据库中,即使出现宕机也不会丢失。
-
5.2 CAP
-
特点
-
Consistency(强一致性)
-
Availability(可用性)
-
Partition tolerance(分区容错性)
-
-
CAP理论是指在分布式存储系统中,最多只能实现上面的两点。由于当前的网络硬件存在延迟丢包等问题,所以分区容忍性是我们必须要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
-
数据库可以实现的特性
-
==CA==:传统Oracle数据库
-
==AP== :大多数网站架构的选择
-
==CP==:Redis、Mongodb
-
-
注意:在做分布式架构的时候必须做出取舍。==一致性和可用性之间取一个平衡==。对于大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向。
5.3 经典CAP图
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
-
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
-
==CA== - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
-
==CP== - 满足一致性,分区容忍必的系统,通常性能不是特别高。
-
==AP== - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
-
6. 什么是BASE?
6.1 概念
BASE就是为了解决关系数据库强一致性引起的问题而导致可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(==B==asically ==A==vailable)
软状态(==S==oft state)
最终一致(==E==ventually consistent)
6.2 分析
BASE的思想是通过让系统放松对某一时刻数据一致性的要求 来换取系统整体伸缩性和性能上改观。
由于在于大型系统往往由于地域分布 和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,而BASE就是解决这个问题的办法。