第一章 NoSQL
1.1 什么是NoSQL
NoSQL(Not Only SQL)即不仅仅是SQL,泛指非关系型的数据库,它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。
1.2 NoSQL的类别
键值(key-value)存储数据库
说明:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
Key/Value模型对于IT系统来说优势在于简单、易部署。
应用:内容缓存,主要用于处理大量数据的高访问负载。
产品:Tokyo Cabinet/Tyrant、==Redis==、Voldemort、Berkeley DB。
优势:快速查询。
劣势:存储数据的结构化较低。
列存储数据库
说明:这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,这些列是由列家族来安排的。
应用:分布式文件系统。
产品:Cassandra,==HBase==,Riak。
优势:查找速度快,可扩展性强,更容易进行分布式扩展。
劣势:功能较低,具有局限性。
文档型数据库
说明:该类型的数据模型 是版本化的文档,半结构化的文档以特定的格式存储,如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
应用:Web应用。
产品:CouchDB,==MongoDB==。
优势:查询效率较高。
劣势:数据结构复杂,缺乏统一查询语法。
图形数据库
说明:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST格式的数据接口或者查询API。
应用:社交网络。
产品: ==Neo4j==,InfoGrid,Infinite Graph。
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
1.3 NoSQL适应场景
1、数据模型比较简单
2、需要灵活性更强的IT系统
3、对数据库性能要求较高
4、不需要高度的数据一致性
5、对于给定的key,比较容易映射出复杂的关系和环境
6、取最新的数据(排行)
7、数据缓存
1.4 在分布式数据库中CAP原理
1.4.1 传统的ACID是什么
关系型数据库遵循==ACID==规则,事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
-
A (Atomicity) 原子性
指事务里的所有操作要么都成功,要么都失败。事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
-
C (Consistency) 一致性
指数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
-
I (Isolation) 隔离性
指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
-
D (Durability) 持久性
是指一旦事务提交后,它所做的修改将会永久的保存在数据库中,即使出现宕机也不会丢失。
1.4.2 CAP
C 强一致性
A 可用性
P 分区容错性
CAP 理论是指在分布式存储系统中,最多只能实现上述两点。由于当前的网络硬件存在延迟丢包等问题,所以分区容忍性是我们必须要实现的。所以我们只能在一致性和可用性之间进行权衡,没有任何的SQL系统能够兼顾这三点。
CA 传统sql数据库
AP 大多数网站架构的选择
CP nosql数据库
注意:在做分布式架构的时候必须做出取舍。==一致性和可用性之间取一个平衡==。对于大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
-
==CA== - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
-
==CP== - 满足一致性,分区容忍性的系统,通常性能不是特别高。
-
==AP== - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
1.5 什么是BASE
BASE 是为了解决关系型数据库强一致性引起的问题而导致可用性降低而提出的解决方案.
基本可用(==B==asically ==A==vailable) 软状态(==S==oft state) 最终一致(==E==ventually consistent)
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。