最终一致性的要求更低,只要经过一段时间后能够访问到更新后的数据即可。也就是说,如果一个操作 OP 往分布式存储系统中写入了一个值,遵循最终一致性的系统可以保证,如果后续访问发生之前没有其他写操作去更新这个值的话,那么,最终所有后续的访问都可以读取到操作OP 写入的最新值从 OP 操作完成到后续访问可以最终读取到 OP 写入的最新值,这之间的时间间隔称为“不一致性窗口”,如果没有发生系统失败的话,这个窗口的大小依赖于交互延迟、系统负载和副本个数等因素。
最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以进行如下区分
因果一致性。如果进程 A 通知进程 B 它已更新了一个数据项,那么进程 B 的后续访问将 获得进程 A 写入的最新值。而与进程 A 无因果关系的进程 C 的访问,仍然遵守一般的最终一致 性规则。
“读己之所写”一致性。可以视为因果一致性的一个特例。当进程 A 自己执行一个更新 操作之后,它自己总是可以访问到更新过的值,绝不会看到旧值。
N传统的关系数据库可以较好地支持结构化数据存储和管理,它以完善的关系代数理论作为基础,具有严格的标准,支持事务 ACID 四性,借助索引机制可以实现高效的查询。
简介
NoSQL 是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL 数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守 ACID 约束。因此,与关系数据库相比,NoSQL 具有灵活的水平可扩展性,可以支持海量数据存储。此外,NoSQL数据库支持 MapReduce 风格的编程,可以较好地应用于大数据时代的各种数据管理。NoSQL 数据库的出现,一方面弥补了关系数据库在当前商业应用中存在的各种缺陷,另一方面也撼动了关系数据库的传统垄断地位,通常NoSQL数据库有下面三个特性
灵活的扩展性
传统的关系型数据库由于自身设计机理的原因,通常很难实现“横向扩展”,在面对数据库负载大规模增加时,往往需要通过升级硬件来实现“纵向扩展”。但是,当前的计算机硬件制造工艺已经达到一个限度,性能提升的速度开始趋缓,已经远远赶不上数据库系统负载的增加速度,而且配置高端的高性能服务器价格不菲,因此寄希望于通过“纵向扩展”满足实际业务需求,已经变得越来越不现实。相反,“横向扩展”仅需要非常普通廉价的标准化刀片服务器,不仅具有较高的性价比,也提供了理论上近乎无限的扩展空间。NoSQL 数据库在设计之初就是为了满足“横向扩展”的需求,因此天生具备良好的水平扩展能力。
灵活数据模型
关系模型是关系数据库的基石,它以完备的关系代数理论为基础,具有规范的定义,遵守各种严格的约束条件。这种做法虽然保证了业务系统对数据一致性的需求,但是过于死板的数据模型,也意味着无法满足各种新兴的业务需求。相反,NoSQL 数据库天生就旨在摆脱关系数据库的各种束缚条件,摈弃了流行多年的关系数据模型,转而采用键/值、列族等非关系模型,允许在一个数据元素里存储不同类型的数据。
与云计算紧密结合
云计算具有很好的水平扩展能力,可以根据资源使用情况进行自由伸缩,各种资源可以动态加入或退出,NoSQL 数据库可以凭借自身良好的横向扩展能力,充分自由利用云计算基础设施,很好地融入到云计算环境中,构建基于 NoSQL 的云数据库服务。
NoSQL与关系数据库比较
NoSQL四种类型
主要包括:键值数据库、列族数据库、文档数据库、图数据库
1、键值数据库
键值数据库(Key-Value Database)会使用一个哈希表,这个表中有一个特定的 Key 和一个指针指向特定的 Value。Key 可以用来定位 Value,即存储和检索具体的 Value。Value 对数据库而言是透明不可见的,不能对 Value 进行索引和查询,只能通过 Key 进行查询。Value 可以用来存储任意类型的数据,包括整型、字符型、数组、对象等。
2、列族数据库
列族数据库一般采用列族数据模型,数据库由多个行构成,每行数据包含多个列族,不同的行可以具有不同数量的列族,属于同一列族的数据会被存放在一起。每行数据通过行键进行定位,与这个行键对应的是一个列族,从这个角度来说,列族数据库也可以被视为一个键值数据库。列族可以被配置成支持不同类型的访问模式,一个列族也可以被设置成放入内存当中,以消耗内存为代价来换取更好的响应性能。
3、文档数据库
在文档数据库中,文档是数据库的最小单位。虽然每一种文档数据库的部署都有所不同,但是大都假定文档以某种标准化格式封装并对数据进行加密,同时用多种格式进行解码,包括 XML、YAML、JSON 和 BSON 等,或者也可以使用二进制格式(如 PDF、微软 Office 文档等)。文档数据库通过键来定位一个文档,因此可以看成是键值数据库的一个衍生品,而且前者比后者具有更高的查询效率
4、图数据库
图数据库以图论为基础,一个图是一个数学概念,用来表示一个对象集合,包括顶点以及连接顶点的边。图数据库使用图作为数据模型来存储数据,完全不同于键值、列族和文档数据模型,可以高效地存储不同顶点之间的关系。图数据库专门用于处理具有高度相互关联关系的数据,可以高效地处理实体之间的关系,比较适合于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题。些图数据库(如 Neo4J),完全兼容 ACID。
NoSQL三种基石
1、CAP
C(Consistency):一致性。它是指任何一个读操作总是能够读到之前完成的写操作的结 果,也就是在分布式环境中,多点的数据是一致的。
A(Availability):可用性。它是指快速获取数据,可以在确定的时间内返回操作结果。
P(Tolerance of Network Partition):分区容忍性。 它是指当出现网络分区的情况时(即系统中的一部分节点 无法和其他节点进行通信),分离的系统也能够正常运行。
CAP 理论(见图 5-2)告诉我们,一个分布式系统不可能同时满足一致性、可用性和分区容忍性这 3 个需求,最多只能同时满足其中 2 个,正所谓“鱼和熊掌不可兼得”。如果追求一致性,那么就要牺牲可用性,需要处理因为系统不可用而导致的写操作失败的情况;如果要追求可用性,那么就要预估到可能发生数据不一致的情况
2、 BASE
BASE 的基本含义是基本可用(Basically Availble)、软状态(Soft-state)和最终一致性(Eventual consistency)。那么传统数据库又有的ACID是什么:
基本可用
基本可用是指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情形出现。比如,一个分布式数据存储系统由 10 个节点组成,当其中 1个节点损坏不可用时,其他 9 个节点仍然可以正常提供数据访问,那么,就只有 10%的数据是不可用的,其余 90%的数据都是可用的,这时就可以认为这个分布式数据存储系统“基本可用”。
软状态
“软状态(Soft-state)”是与“硬状态(Hard-state)”相对应的一种提法。数据库保存的数据是 “硬状态”时,可以保证数据一致性,即保证数据一直是正确的。“软状态”是指状态可以有一段 时间不同步,具有一定的滞后性。
最终一致性
一致性的类型包括强一致性和弱一致性,二者的主要区别在于高并发的数据访问操作下,后续操作是否能够获取最新的数据。对于强一致性而言,当执行完一次更新操作后,后续的其他读操作就可以保证读到更新后的最新数据;反之,如果不能保证后续访问读到的都是更新后的最新数据,那么就是弱一致性。而最终一致性只不过是弱一致性的一种特例,允许后续的访问操作可以暂时读不到更新后的数据,但是经过一段时间之后,必须最终读到更新后的数据。最终一致性也是 ACID 的最终目的,只要最终数据是一致的就可以了,而不是每时每刻都保持实时一致。
3、最终一致性
讨论一致性的时候,需要从客户端和服务端两个角度来考虑。从服务端来看,一致性是指更新如何复制分布到整个系统,以保证数据最终一致。从客户端来看,一致性主要指的是高并发的数据访问操作下,后续操作是否能够获取最新的数据。关系数据库通常实现强一致性,也就是一旦一个更新完成,后续的访问操作都可以立即读取到更新过的数据。而对于弱一致性而言,则无法保证后续访问都能够读到更新后的数据。
最终一致性的要求更低,只要经过一段时间后能够访问到更新后的数据即可。也就是说,如果一个操作 OP 往分布式存储系统中写入了一个值,遵循最终一致性的系统可以保证,如果后续访问发生之前没有其他写操作去更新这个值的话,那么,最终所有后续的访问都可以读取到操作OP 写入的最新值从 OP 操作完成到后续访问可以最终读取到 OP 写入的最新值,这之间的时间间隔称为“不一致性窗口”,如果没有发生系统失败的话,这个窗口的大小依赖于交互延迟、系统负载和副本个数等因素。
最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以进行如下区分
因果一致性。如果进程 A 通知进程 B 它已更新了一个数据项,那么进程 B 的后续访问将 获得进程 A 写入的最新值。而与进程 A 无因果关系的进程 C 的访问,仍然遵守一般的最终一致 性规则。
“读己之所写”一致性。可以视为因果一致性的一个特例。当进程 A 自己执行一个更新 操作之后,它自己总是可以访问到更新过的值,绝不会看到旧值。
会话一致性。它把访问存储系统的进程放到会话(Session)的上下文中,只要会话还存 在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话, 而且系统保证不会延续到新的会话。
单调读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在 那个值之前的值。
单调写一致性。系统保证来自同一个进程的写操作顺序执行。系统必须保证这种程度的一 致性,否则就非常难以编程了。
从NoSQL到NewSQL数据库
NoSQL 数据库可以提供良好的扩展性和灵活性,很好地弥补了传统关系数据库的缺陷,较好地满足了 Web 2.0 应用的需求。但是,NoSQL 数据库也存在自己的天生不足之处。由于采用非关系数据模型,因此它不具备高度结构化查询等特性,查询效率尤其是复杂查询方面不如关系数据库,而且不支持事务 ACID 四性。
在这个背景下,近几年,NewSQL 数据库开始逐渐升温。NewSQL 是对各种新的可扩展、高性能数据库的简称,这类数据库不仅具有 NoSQL 对海量数据的存储管理能力,还保持了传统数据库支持 ACID 和 SQL 等特性。不同的 NewSQL 数据库的内部结构差异很大,但是它们有两个显著的共同特点:
与传统数据库和NoSQL数据库之间的关系