NoSQL 数据库也即非关系型数据库,它是在大数据的时代背景下产生的,它可以处理分布式、规模庞大、类型不确定、完整性没有保证的“杂乱”数据,这是传统的关系型数据库远远不能胜任的。
NoSQL 数据库并没有一个统一的模型,两种不同的 NoSQL 数据库之间的差异程度,远远超过两种关系型数据库之间的不同。可以说,NoSQL 数据库各有所长,一个优秀的 NoSQL 数据库必然特别适用于某些场合,在这些场合中会远远胜过关系型数据库或者其它 NoSQL 数据库。
随着互联网技术的发展,数据库系统管理的数据及其应用环境发生了很大的变化,主要表现为应用领域越来越广泛,数据种类越来越复杂和多样,而且数据量剧增。
在大数据时代的场景下,传统的关系型数据库已无法满足用户需求,NoSQL 数据库应运而生。
在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。
数据库技术是研究数据库的结构、存储、设计、管理和使用的一门科学。数据库系统(Database System,DBS)是采用数据库技术的计算机系统,它是由计算机硬件、软件和数据资源组成的系统,能实现有组织的、动态的存储大量关联数据,并方便多用户访问。
数据库系统由用户、数据库应用程序、数据库管理系统(DataBase Management System,DBMS)和数据库(DataBase,DB)组成。 如图所示。
数据库是长期存储在计算机内的、有组织的、统一管理的、可以变现为多种形式的、可共享的数据集合。
在这里:
数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户所共享。
在数据库技术中,用数据模型(Data Model)的概念描述数据库的结构和语义,对现实世界的数据进行抽象。数据库根据不同的逻辑模型可分成三种:层次型、网状型和关系型
。
数据库管理系统(DBMS)
是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。DBMS 是一个庞大且复杂的产品,几乎都是由软件供应商授权提供的,如 Oracle 公司的 Oracle 和 MySQL、IBM 公司的 DB2、Microsoft 公司的 Access 和 SQL Server,这些 DBMS 占据了大部分的市场份额。
DBMS 对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过 DBMS 访问数据库中的数据,数据库管理员也通过 DBMS 进行数据库的维护工作。DBMS 允许多个应用程序或多个用户使用不同的方法,在同一时刻或不同时刻去建立、修改和询问数据库。
DBMS 的主要功能如下。
数据定义语言(Data Definition Language, DDL
),供用户定义、创建和修改数据库的结构。DDL 所描述的数据库结构仅仅给出了数据库的框架,数据库的框架信息被存放在系统目录中。数据操纵语言(Data Manipulation Language, DML
),实现用户对数据的操纵功能,包括对数据库数据的插入、删除、更新等操作。DBMS 是数据库系统的核心,是管理数据库的软件。DBMS 是实现把用户视角下的、抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了 DBMS,用户可以在抽象意义下处理数据,而不必考虑这些数据在计算机中的布局和物理位置。
应用程序
数据库系统还包括数据库应用程序。应用程序最终是面向用户的,用户可以通过应用程序输入和处理数据库中的数据。
例如,在学校选课系统中,管理员用户可以创建课程信息,学生用户可以修改课程信息,应用程序将这些操作提交给 DBMS,由 DBMS 将这种用户级别的操作转化成数据库能识别的 DDL。
应用程序还能够处理用户的查询,比如学生查询星期一有哪些课程,应用程序首先生成一个课程查询请求,并发送给 DBMS,DBMS 从数据库中查询结果并格式化后返回给用户。
关系型数据库建立在关系型数据模型的基础上,是借助于集合代数等数学概念和方法来处理数据的数据库。
在关系型数据库中,实体以及实体间的联系均由单一的结构类型来表示,这种逻辑结构是一张二维表。
关系型数据库以行和列的形式存储数据,这一系列的行和列被称为表,一组表组成了数据库。
属性说明:
关系型数据库的核心是其结构化的查询语言(Structured Query Language, SQL),SQL 涵盖了数据的查询、操纵、定义和控制,是一个综合的、通用的且简单易懂的数据库管理语言。同时 SQL 又是一种高度非过程化的语言,数据库管理者只需要指出做什么,而不需要指出该怎么做即可完成对数据库的管理。
SQL 包含以下四个部分。
数据定义语言(DDL
)数据查询语言(Data Query Language, DQL
)SELECT FROM 表名1,表2
where 查询条件 #可以组合 and、or、 not、 =、between、and、in、like 等;
group by 分组字段
having (分组后的过滤条件)
order by 排序字段和规则;
数据操纵语言(Data Manipulation Language, DML
)数据控制语言(Data Control Language, DCL
)关系型数据库的优点
关系型数据库的缺点
随着各类互联网业务的发展,关系型数据库难以满足对海量数据的处理需求,存在以下不足。
NoSQL 数据库类型多样,可满足不同场景的应用需求,因此取得了巨大的成功。
NoSQL 数据库基本理念是以牺牲事务机制和强一致性机制,来获取更好的分布式部署能力和横向扩展能力,创造出新的数据模型,使其在不同的应用场景下,对特定业务数据具有更强的处理性能。
其主要优势如下。
分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。
分布式数据库是数据库技术与网络技术相结合的产物,它通过网络技术将物理上分开的数据库连接在一起,进行逻辑层面上的集中管理。
在分布式数据库系统中,一个应用程序可以对数据库进行透明操作,数据库中的数据分别存储在不同的局部数据库中,由不同机器上不同的 DBMS 进行管理,其的体系结构如下图所示。
它处理数据的基本特点如下。
CAP 理论是针对分布式数据库而言的,它是指在一个分布式系统中,一致性(Consistency, C)、可用性(Availability, A)、分区容错性(Partition Tolerance, P
)三者不可兼得。
一致性(C)
一致性是指“all nodes see the same data at the same time”,即更新操作成功后,所有节点在同一时间的数据完全一致。
一致性可以分为客户端和服务端两个不同的视角:
从客户端角度来看,一致性主要指多个用户并发访问时更新的数据如何被其他用户获取的问题;
从服务端来看,一致性则是用户进行数据更新时如何将数据复制到整个系统,以保证数据的一致。
一致性是在并发读写时才会出现的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。
可用性(A)
可用性是指“reads and writes always succeed”,即用户访问数据时,系统是否能在正常响应时间返回结果。
好的可用性主要是指系统能够很好地为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。在通常情况下,可用性与分布式数据冗余、负载均衡等有着很大的关联。
分区容错性(P)
分区容错性是指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
分区容错性和扩展性紧密相关。在分布式应用中,可能因为一些分布式的原因导致系统无法正常运转。分区容错性高指在部分节点故障或出现丢包的情况下,集群系统仍然能提供服务,完成数据的访问。分区容错可视为在系统中采用多副本策略。
CAP 理论认为分布式系统只能兼顾其中的两个特性,即出现 CA、CP、AP 三种情况,如图所示。
总结
在实践中,可根据实际情况进行权衡,或者在软件层面提供配置方式,由用户决定如何选择 CAP 策略。
CAP 理论可用在不同的层面,可以根据 CAP 原理定制局部的设计策略,例如,在分布式系统中,每个节点自身的数据是能保证 CA 的,但在整体上又要兼顾 AP 或 CP。
ACID 是关系型数据库的事务机制需要遵守的原则
。事务是一个一致和可靠计算的基本单元,由作为原子单元执行的一系列数据库操作组成。数据库库一般在启动时会提供事务机制,包括事务启动、停止、取消或回滚等。
关系型数据库支持事务的 ACID 原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
,这四种原则保证在事务过程当中数据的正确性,具体描述如下。
原子性(A)
一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
一致性(C)
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
隔离性(I)
主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
持久性(D)
一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。
从事务的四个特性可以看到关系型数据库是要求强一致性的,但是这一点在 NoSQL 数据库中是重点弱化的机制。原因是当数据库保存强一致性时,很难保证系统具有横向扩展和可用性的优势,因此针对分布式数据存储管理只提供了弱一致性的保障,即 BASE 原理。
BASE 理论是针对 NoSQL 数据库而言的,它是对 CAP 理论中一致性(C)和可用性(A)进行权衡的结果,源于提出者自己在大规模分布式系统上实践的总结。其核心思想是无法做到强一致性,但每个应用都可以根据自身的特点,采用适当方式达到最终一致性。
基本可用(Basically Available)
基本可用指分布式系统在出现故障时,系统允许损失部分可用性,即保证核心功能或者当前最重要功能可用。
对于用户来说,他们当前最关注的功能或者最常用的功能的可用性将会获得保证,但是其他功能会被削弱。
软状态(Soft-state)
软状态允许系统数据存在中间状态,但不会影响系统的整体可用性,即允许不同节点的副本之间存在暂时的不一致情况。
最终一致性(Eventually Consistent)
最终一致性要求系统中数据副本最终能够一致,而不需要实时保证数据副本一致。例如,银行系统中的非实时转账操作,允许 24 小时内用户账户的状态在转账前后是不一致的,但 24 小时后账户数据必须正确。
最终一致性是 BASE 原理的核心
,也是 NoSQL 数据库的主要特点,通过弱化一致性,提高系统的可伸缩性、可靠性和可用性。而且对于大多数 Web 应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是多数分布式数据库产品的方向。
最终一致性可以分为客户端和服务端两个不同的视角。
从客户端的角度看
从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题,最终一致性有以下 5 个变种。
上述最终一致性的不同方式可以进行组合,例如,单调读一致性和“读己之所写”一致性就可以组合实现。从实践的角度来看,这两者的组合读取自己更新的数据,一旦读取到最新的版本,就不会再读取旧版本,对基于此架构上的程序开发来说,会减少很多额外的烦恼。
从服务器的角度看
从服务端来看,如何尽快地将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验度非常重要的方面。
分布式数据系统有以下特性:
如果 W+R>N,写的节点和读的节点重叠,则是强一致性。例如,对于典型的一主一备同步复制的关系型数据库(N=2, W=2,R=1),则不管读的是主库还是备库的数据,都是一致的。
如果 W+R≤N,则是弱一致性。例如,对于一主一备异步复制的关系型数据库(N=2,W=1,R=1),如果读的是备库,则可能无法读取主库已经更新过的数据,所以是弱一致性。
对于分布式系统,为了保证高可用性,一般设置 N≥3。设置不同的N、W、R 组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。
如果N=W 且 R=1,则任何一个写节点失效,都会导致写失败,因此可用性会降低。但是由于数据分布的 N 个节点是同步写入的,因此可以保证强一致性。
如果 N=R 且 W=1,则只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。在这种情况下,如果 W<(N+1)/2,并且写入的节点不重叠,则会存在写冲突。
关系型数据库产品很多,如 MySQL、Oracle、Microsoft SQL Sever 等,但它们的基本模型都是关系型数据模型。NoSQL 并没有统一的模型,而且是非关系型的。
常见的 NoSQL 数据库包括键值数据库、列族数据库、文档数据库和图形数据库,其具体分类和特点如表所示。
NoSQL 数据库并没有一个统一的架构,两种不同的 NoSQL 数据库之间的差异程度,远远超过两种关系型数据库之间的不同。
可以说,NoSQL 数据库各有所长,一个优秀的 NoSQL 数据库必然特别适用于某些场合或者某些应用,在这些场合中会远远胜过关系型数据库和其他的 NoSQL 数据库。
常见的 NoSQL 数据库分为以下几种。
1) 键值数据库
这一类数据库主要会使用到一个散列表,这个表中有一个特定的键和一个指针指向特定的数据。
键值模型对于 IT 系统来说,其优势在于简单、易部署。键值数据库可以按照键对数据进行定位,还可以通过对键进行排序和分区,以实现更快速的数据定位。
2) 列族数据库
列族数据库通常用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,如图所示。
此列族数据库表中由两行组成,每一行都有关键字 Row Key,每一行由多个列族组成,即 Column-Family-1 和 Column-Family-2,而每个列族由多个列组成。
3) 文档数据库
文档数据库的灵感来自 Lotus Notes 办公软件,它与键值数据库类似。该类型的数据模型是版本化的文档,文档以特定的格式存储,如 JSON。
文档数据库可以看作键值数据库的升级版,允许之间嵌套键值,如图所示。
文档数据库比键值数据库的查询效率更高, 因为文档数据库不仅可以根据键创建索引,同时还可以根据文档内容创建索引。
4) 图形数据库
图形数据库来源于图论中的拓扑学,以节点、边及节点之间的关系来存储复杂网络中的数据,如图所示。
这种拓扑结构类似 E-R 图,但在图形模式中,关系和节点本身就是数据,而在 E-R 图中,关系描述的是一种结构。
内存数据库主要是把磁盘的数据加载到内存中进行相应操作。
与直接读取磁盘数据相比,内存的数据读取速度要高出几个数量级,因此,将数据保存在内存中能够极大地提高应用的性能。
内存数据库改变了磁盘数据管理的传统方式,基于全部数据都在内存中的特点重新设计了体系结构,并且在数据缓存、快速算法、并行操作方面也进行了相应的升级,因此,其数据处理速度一般比传统数据库的数据处理速度快几十倍。
内存数据库的最大特点是其应用数据常驻内存中,即活动事务只与实时内存数据库的内存进行数据交流。
常见的内存数据库有 Memcached、Redis、SQLite、Microsoft SQL Server Compact 等。
Redis 是一个开源的、高性能的、键值对内存数据库。它通过提供多种键值数据类型来满足不同场景下的存储需求,并借助许多高层级的接口使其可以胜任如缓存、队列系统等不同的角色。
前面探讨了 NoSQL 数据库的相关技术,NoSQL 数据库能够很好地应对海量数据的挑战,为用户提供可观的可扩展性和灵活性,但是它也有缺点:
NoSQL 数据库不支持 ACID 特性, 在很多场合下,ACID 特性使系统在中断的情况下也能够保证在线事务的准确执行;
大多数 NoSQL 数据库提供的功能比较简单,这就需要用户在应用层添加更多的功能;
NoSQL 数据库没有统一的查询语言,不支持 SQL 查询,这也在一定程度上增加了开发者的负担。
为了解决上述难题,NewSQL 数据库应运而生。NewSQL 数据库不仅具有 NoSQL 数据库对海量数据的存储管理能力,同时还保留了传统数据库支持的 ACID 和 SQL 特性。
NewSQL 是一类新的关系型数据库, 是各种新的可扩展和高性能的数据库的简称。
http://c.biancheng.net/nosql/