目录
一、介绍
在数据库的发展历史上,数据库先后经历了层次数据库、网状数据库和关系数据库等几个阶段。
当然最大放异彩的是关系数据库,20世纪80年代以来, 几乎所有的数据库厂商新出的数据库产品都支持关系型数据库, 即使一些非关系数据库产品也几乎都有支持关系数据库的接口。
随着云计算的发展和大数据时代的到来, 关系型数据库越来越无法满足需求:
(1)不易横向扩展:由于存在外键等多表联级查询,牵一发而动全身,使得很难进行数据库横向扩展;
(2)读写速度慢:因为关系型数据库的一般都具有复杂的系统逻辑,在处理海量数据时,非常容易引起死锁等并发问题,所以导致其 IO 速度降低非常严重;
(3)成本高:企业级数据库如 Oracle 的 许可证价格很高,由于面向服务收费,因此随着系统的规模的扩展,服务费用呈线性上升。
二、 理论基础
CAP 原则、BASE 理论是支撑 NoSQL的基础理论。
1.CAP原则
C: Consistency 一致性,A: Availability 可用性,P: Tolerance of network Partition 分区容错性。
cap理论就是由这三个特性的首字母组成。而且cap理论指出,一个分布式系统不可能同时满足一致、可用性、分区容错性这三个要求,最多只能同时满足两个。
Consistency
一致性:“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。
数据复制
由于分布式系统采用多机器进行分布式部署的方式提供服务,必然存在着数据的复制(如数据库的异地容灾,多地部署)。分布式系统的数据复制需求主要来源于以下两个原因:
(1)可用性。将数据复制到分布式部署的多台机器中,可以消除单点故障。防止系统由于某台(些)机器宕机导致的不可用。
(2)性能。通过负载均衡技术,能够让分布在不同地方的数据副本全都对外提供服务。有效提高系统性能。
分布式系统为了提升可用性和性能,会通过复制技术来进行数据同步。复制机制的目的是为了保证数据的一致性。
举个栗子
(1)初始状态。
(2)用户访问服务器1并更改了她的name属性为Cat
(3)之后用户有可能访问服务器2,得到的name属性却是pig
(4)为了让服务器2的name属性也变成Cat,需要把数据复制到服务器2,这就是一致性。
Availability
可用性:“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。
Partition Tolerance
分区容错性:“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。
注意: 对于分布式系统来说,必须保证分区容错性,因为分布式系统中的组件都是通过机器集群实现,然后部署到不同的节点,每个节点就相当于子网络,这样就导致了一定会发生网络异常。因此分布式系统只能在 C 与 A 中作出选择。
所以就有了下面的图:
2.BASE理论
工程师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
BASE指的是Basically Available(基本可用)、Soft State(软状态)、Eventual Consistency(最终一致性)
Basically Available
基本可用:指分布式系统在出现故障等异常情况时,对外依然可以提供核心服务,但允许损失部分功能。
比如:(1)针对搜索引擎系统而言,正常情况下用户提交查询请求,0.5 秒可以返回查询结果,但在出现异常情况下,仍然能保证在 2 秒内响应查询结果;(2)电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。
Soft State
软状态:软状态是指允许系统存处于一个既非服务状态也非不可用状态的中间状态,而就全局而言,这个中间状态不会影响整个系统的可用性。分布式存储中一般一份数据至少会有三个副本,允许副本之间在进行数据同步时存在短暂的延时。(PS感觉这个名词有点怪怪的。。)
Eventual Consistency
要理解最终一致性,我们先要了解弱一致性。
弱一致性
系统并不保证进程或者线程的访问都会返回最新的更新过的值。还是上面的例子,你得到的name属性有可能还是pig。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒级别)之后,可以让数据达到一致性状态。CAP原则中的一致性是强一致性。
最终一致性:“the storage system guarantees that if no new updates are made to the object, eventually all accesses will return the last updated value”,即系统保证在没有后续更新操作的前提下,最终所有访问都将返回上次更新的值,也就是达到强一致性。
三、 分类
在NoSQL的世界里,不同的NoSQL数据库之间的物理数据模型显著不同而且没有行业标准。但主要分为四类:“键值(key-value)”、“文档”,"列族"和“图形”,
1.键值
键值数据库是本质上就是一张哈希表,类似于 Java 语言中的 HashMap 。根据 key 值进行存储,每个 key 值对应的 value 可以为一个任意的数值。NoSQL 并没有对 value 作出过多限制,可由各个产品自由决定。
一般情况下,NoSQL 数据库只提供根据 key 值进行 set、get、delete 等简单操作,并不提供针对某个 value 值的操作。键值数据库主要适应于通过主键来访问的业务操作。常见的基于 key-value 存储的数据库产品有 Redis、Tokyo Cabinet/Tyrant、Voldemort 等。
2.文档
文档数据库也是基于 key 进行存储,不过相应的 value 值不再是任意数值,而是一个结构化的文档。此结构化文档要满足特定的存储格式,比如 XML、JSON 等。
文档型数据库可以看成是 key-value 数据库的升级版,其允许在文档内嵌套键值,实现复杂存储。一般而言,因为规定了 value 格式,文档型数据库的查询效率要高于 key-value 数据库,但查询复杂度有所上升。常见的基于文档存储的数据库产品有 MongoDb、CouchDB 等。
3.列族
列族数据库类似关系数据库中的表,键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。比如:HBase、Cassandra等。
4.图形
图形数据库利用图结构相关算法实现数据的存储。采用图数据模型时,很多时候需要对整个图做计算才能得出需要的信息,计算相对复杂,而且图结构不太适应于分布式的集群方案。图形数据库比较适应于社交网络、推荐系统等,专注于构建关系图谱。常见的基于图形存储的数据库产品有 Neo4J, Infinite Graph等。