NoSQL —— Not only SQL,不仅仅是SQL,不是一种具体的数据库,不是一个实实在在的产品,而是一个技术流派,其又细分为四种类型的数据库。
NoSQL的兴起,是因大数据与分布式系统而产生的,其是借助于分布式技术来应对大数据时代的数据存储与处理的技术,因为在大数据时代,大数据的4V特征,导致关系型数据库在应对大数据时能力上有点捉襟见肘,因而催生了NoSQL的兴起。
数据库及关系型数据库:
数据库的基本概念包括:
数据(Data):描述事务的符号,数据库中存储的基本对象,数据与数据的解释即数据的语义是紧密结合的。
数据库(DataBase,DB):按一定的数据模型组织、描述和存储的数据的集合。
数据库管理系统(DataBase Management System,DBMS):科学组织数据库中数据、高效获取和维护数据的系统软件。
数据库系统:数据库、数据库管理系统与计算机系统结合后形成数据库系统。通常由数据库、数据库管理系统、操作系统、开发工具、应用系统、数据库管理员及数据库用户组成。
数据模型:是用来抽象、表示和处理现实世界中的数据和信息,实现将现实世界中的具体事务转换为计算机能够处理的对象的一种工具。一般通过两个阶段的两种模型来实现:用概念信息来描述具体事务,即概念数据模型;将抽象的概念信息按照特定的结构转换并保存到数据库系统中的组织数据模型。
一个数据模型一般从数据结构、数据操作、数据约束三个方面进行描述。
概念模型(概念数据模型):通常采用实体-关系/联系(Entity-Relationship)方法表示,称为E-R图,具有三个要素,实体(Entity)、属性(Attribute)、联系(Relationship),实体之间的联系有1对1(1:1)、1对多(1:n)、多对多(n:n)。
组织模型(组织数据模型):是从数据组织方式的角度来描述信息,决定了数据在数据库中的组织结构,分为4种:层次模型、网状模型、关系模型、面向对象模型。
关系模型:是当前最重要的一种数据模型,是关系型数据库的理论基础。
数据结构:关系模型以二维表的方式组织数据,二维表由行和列组成,一行对应一个实体的实例,一列对应一个实体的属性。关系模型中,实体以及关系都是以二维表形式表示。关系模型中涉及术语有:关系、元组、属性、主码(主键)、外码(外键)、域、分量等。
关系完整性约束:实体完整性、参照完整性、用户定义完整性。
关系型数据库:采用关系模型的数据库系统称为关系型数据库。其主要功能:
- 数据定义:提供数据定义语言DDL,可以定义数据库的三级模式(外模式、模式、内模式)、两级映像(外模式/模式、模式/内模式),定义数据的完整性、安全性约束;
- 数据操作:提供数据操作语言DML,实现对数据库的操作,增删改查等;
- 数据库运行与控制:
- 数据库的建立与维护:
- 数据库接口:提供与其他软件进行交互、通信和操作的接口;
三级模式从用户视角到物理存储视角,形成三层抽象隔离,每层各司其职:
-外模式(用户级/子模式)
是用户能直接看到并操作的局部数据逻辑视图,是全局模式的子集。一个数据库可以存在多个外模式,不同业务用户、不同应用程序可以按需定制自己的视图,只暴露自己需要的字段和数据范围,同时天然实现了数据权限隔离,隐藏用户无权访问的敏感数据 。
-模式(概念级/全局模式)
是整个数据库唯一的全局逻辑结构中枢,由DBA统一定义,完整描述所有数据的表结构、字段类型、关联关系、完整性约束,完全不涉及任何物理存储细节,是所有外模式的公共数据集合 。
-内模式(物理级/存储模式)
是数据库最底层的物理存储细节描述,全库唯一,专门定义数据在磁盘上的组织方式:包括文件存储格式、索引类型、数据压缩策略、分区分布规则等,直接和硬件存储资源打交道,对上层用户完全透明 。
两级映像是三级模式之间的“翻译层”,通过映射规则实现两层之间的自动适配,最终达成两大核心数据独立性:
-外模式/模式映像→保障逻辑数据独立性
每个外模式都对应一个全局模式的映射规则,当全局模式发生变更(比如新增业务表、调整字段类型、修改表关联关系)时,只需要修改这个映像的映射规则,上层用户使用的外模式完全不需要改动,基于外模式开发的应用程序也无需任何修改,就可以正常运行 。
-模式/内模式映像→保障物理数据独立性
这个映像定义了全局逻辑模式和底层物理存储的对应关系,当内模式发生变更(比如更换存储磁盘、调整索引结构、切换存储引擎、数据冷热分离迁移)时,只需要调整这个映像的映射规则,上层的全局逻辑模式完全不受影响,所有业务应用更是感知不到底层存储的变化 。
传统的关系型数据库解决大数据高并发的方案:并行数据库,水平切分,分区查询
- 主从架构,一主(master)负责写,多从(slave)负责读,读写分离,但是写没有分离,且主从可能存在不一致性问题;
- 分库、分区结构,当规模再大时,施行分库结构,按垂直方式切分成不同的业务子集,形成不同的分库,或是对表进行分区,实现了写负载的分离,缺点是实现复杂、主从不一致问题、扩容困难,难以实现自动化。
ACID—— 数据库事务的四大核心特性,是保障数据可靠性、完整性的底层基石,分别对应原子性、一致性、隔离性、持久性,是所有关系型数据库事务机制的核心设计准则。
原子性(Atomicity):事务是不可拆分的最小执行单元,其中所有操作要么全部成功执行,要么全部失败回滚,绝对不会停留在“部分执行”的中间状态。底层实现依赖回滚日志(Undo Log)。
一致性(Consistency):事务执行前后,数据库的所有完整性约束完全不被破坏,数据始终处于符合预设规则的合法状态。数据库层面自动保障三类约束:实体完整性(主键非空且唯一)、参照完整性(外键关联合法无悬挂引用)、用户自定义完整性(字段非空、唯一、自定义校验规则),事务执行前后所有数据都必须完全符合这些规则 。
隔离性(Isolation):多个并发事务同时操作同一数据时,彼此之间完全隔离,互不交叉干扰,避免并发场景下的数据异常。数据库通过锁机制、MVCC多版本并发控制实现隔离,共定义了4个标准隔离级别:读未提交、读提交、可重复读、串行化,不同级别分别规避脏读、不可重复读、幻读三类并发异常 。
持久性(Durability):事务一旦提交完成,对数据的修改就永久生效,哪怕系统发生宕机、断电等硬件故障,数据也绝对不会丢失。 底层依赖重做日志(Redo Log)实现。
大数据问题及NoSQL:BigData
关系型数据库无法应对大数据:
- 无法满足海量数据的管理需求;
- 无法满足高并发的需求;
- 无法满足高扩展性和高可用性的需求;
web2.0时代,关系型数据库没有发挥作用的特性:
- web2.0通常不需要严格的数据库事务;
- web2.0通常不需要严格的读写实时性;
- web2.0通常不包含复杂的SQL查询;
NoSQL数据库管理系统:非关系模型、分布式、不支持ACID数据库设计范式
优点:简单数据模型、元数据和数据分离、弱一致性、高吞吐量、高的水平扩展能力和低端硬件集群、NoSQL数据库具有灵活的可扩展性和数据模型,可以与云计算紧密结合。
NoSQL数据库与关系型数据库的比较:
- 在数据库原理方面:关系数据库有完备的关系代数理论做基础,而NoSQL数据库缺乏理论基础;
- 在数据规模方面:关系数据库在数据规模方面的扩展性较差,而NoSQL数据库具有良好的水平可扩展性;
- 在数据库模式方面:关系数据库需要严格定义和遵守数据库模式,而NoSQL数据库的数据模型更加灵活。
- 在查询效率方面:关系数据库借助索引机制实现高效查询,而NoSQL数据库在面对复杂查询时性能不如关系数据库。
- 在事务一致性方面:关系数据库遵循强一致性,而很多NoSQL数据库只能保证最终一致性。
- 在数据完整性方面:关系数据库具有完备的数据完整性机制,而NoSQL数据库在这方面较为薄弱。
- 在可扩展和可用性方面:关系数据库的可扩展性和可用性较差,而NoSQL数据库在这两个方面表现较好。
- 在标准化方面:关系数据库有统一的标准,而NoSQL数据库缺乏统一的行业标准。
- 在技术支持方面:关系数据库可以获得强大的技术支持和服务,而NoSQL数据库的技术支持相对较弱。
- 在可维护方面:关系数据库的维护性较好,而NoSQL数据库的维护性较复杂。
关系型数据库的优势:具有完备的关系代数作为理论基础、有严格的标准、支持事务一致性、可以借助索引机制实现复杂高效的查询操作;
关系型数据库的劣势:可扩展性非常差、不具备水平扩展性,无法较好的支持海量数据存储、数据模型定义严格,无法满足新型web2.0的应用需求。
NoSQL数据库的优势:支持超大规模数据存储、数据模型非常灵活。
NoSQL数据库的劣势:缺乏底层基础理论、很多NqSQL数据库不支持事务的强一致性。
NoSQL的四大类型、NoSQL的三大基石:
四大类型NoSQL数据库:键值数据库(Key-Value Stores)、列族数据库(Wide-Column Stores)、文档数据库(Document Databases)、图数据库(Graph Databases)
列式模型:
应用场景:在分布式文件系统之上提供支持随机读写的分布式数据存储,适用于海量数据的分布式存储和管理,具有良好的扩展性和查找速度
典型产品:HBase、Hypertable、Cassandra
数据模型:以“列”为中心进行存储,将同一列数据存储在一起
优点:快速查询、高可扩展性、易于实现分布式扩展
文档模型:
应用场景:非强事务需求的应用,如web应用,是一种介于关系数据库和键值数据库之间的数据库类型,它的数据模型是一个键值数据库,其中的每一行记录都是一个文档。文档数据库具有自我描述的特性,可以对自己包含的数据类型和内容进行描述。
典型产品:MongoDB、ElasticSearch、CouchDB、CouchBase、MarkLogic
数据模型:键值模型,存储为文档
优点:数据模型无须事先定义,具有更好的并发性,可以高并发地对数据进行更新,而不需要锁定其他表
键值模型:
应用场景:内容缓存,适用于简单的数据模型和高写入性能、大量并行数据访问高负载场景
典型产品:DynamoDB、Riak、Redis
数据模型:基于哈希表实现的key-value
优点:查询迅速
图式模型:
应用场景:社交网络、推荐系统、关系图谱,基于图论的数据库类型,适用于处理具有高度相互关联关系的数据
典型产品:Neo4j、Infinite Graph
数据模型:图式结构
优点:适应于图式计算场景,优点是灵活性高,可以构建复杂的关系图谱
大数据的分析处理:本质就是并行处理,(各种大数据处理技术的不同,只是处理的粒度粗细不同而已) —— MapReduce框架
NoSQL数据库的三大理论基石:CAP、BASE和最终一致性
CAP理论是分布式系统设计中的重要理论,涉及到一致性、可用性和分区容忍性三个方面的性质。一致性(Consistency):指任何读操作都能读到之前完成的写操作的结果;
可用性(Availablility):指能够快速获取数据并响应请求,可以在确定的时间内返回操作结果,保证每个请求不管是成功还是失败都有响应;
分区容忍性(Partition tolerance):指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信时),剩余节点(或分离的系统)仍能正常运行。
CAP理论认为在分布式系统中无法同时实现一致性、可用性和分区容忍性,只能牺牲其中一个来成就其他两个。不同的数据库产品在设计时会根据业务需求选择不同的方向。如CA、CP、AP
BASE(BasicallyAvailableSoft state、Eventually consistency):英文意思“碱”。对应的关系数据库中有一个ACID(Atomicity、Consistency、Isolation、Durability),“酸”。
基本可用(BasicallyAvailable ):指的是当分布式系统的一部分发生问题时,其他部分仍然可以正常使用。也就是允许分区失败的情形出现。
软状态(Soft state):是指在一段时间内,不同节点之间可能存在不同步的情况,具有一定的滞后性。它对应的是硬状态,是指数据库的状态必须一直保持数据库一致性,就是在任意时刻数据必须是正确的。
最终一致性(Eventually consistency):是一种弱一致性,即在一段时间内可能存在不一致的情况,但最终会达到一致。
对于一致性,其有不同的类型,如强一致性、弱一致性,二者的不同在于高并发的数据访问操作下,后续操作是否能够获取最新的数据。对于强一致性,一般要求执行完一个更新操作后,后续的其他操作都能够读到更新后的最新数据;而弱一致性,则是在写入一个数据,后续的其他读写操作不能够保证马上读到刚写入的数据。最终一致性则是在一段时间内可能存在不一致的情况,但最终会达到一致。
最终一致性根据更新数据后各进程访问到的数据的时间和方式的不同,可以区分为:
因果一致性:如果进程A通知进程B,它已经更新了一个数据项,那么进程B的后续访问将获得进程A写入的最新数据。
“读己之所写”一致性:当进程A自己执行一个更新操作之后,它自己总是能够访问到更新过的值,不会看到旧值。
单调读一致性:如果进程已经看到过数据对象的某个值,那么任何后续访问,都不会返回在哪个值之前的旧值。
会话一致性:会把访问存储系统的这些进程,放到会话的上下文进程当中,这个时候只要这些会话存在,系统就可以保证读己之所写一致性。
单调写一致性:系统需要保证来自同一个进程的写操作都按顺序执行。
实现各种类型数据库的一致性:对一个分布式系统,为了实现可靠性,对数据进行冗余存储。
NWR理论 —— 假设:
N:数据冗余的份数
W:更新数据时需要保证写完成的节点数
R:读取数据时需要读取的节点数
W+R > N:强一致性,写节点和读节点重叠,如对于典型的一主一备同步复制的关系型数据库,当N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。
W+R <= N:弱一致性,例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据。
2PC(Two-PhaseCommit,两阶段提交法):是实现分布式事务强一致性原子提交协议,解决跨节点操作“要么全成、要么全败”的问题,核心目标是保证跨多个节点的事务操作原子性。
核心角色有:
- 协调者(Coordinator):唯一的决策中枢,负责向所有参与者发送指令、收集投票、最终做出提交/回滚决策。
- 参与者(Participant):负责执行本地事务的工作节点,完全听从协调者指令,完成本地事务的准备、提交或回滚。
完整执行流程:整个协议严格分为两个不可拆分的阶段:
第一阶段:投票阶段(准备阶段)
第二阶段:决策执行阶段
Vector Clock(向量时钟):是一种分布式逻辑时钟算法,核心解决分布式系统中无全局时钟的前提下,如何追踪事件的因果先后顺序、检测并发操作冲突的问题,是最终一致性 NoSQL 数据库的核心冲突检测技术。
NoSQL与NewSQL数据库的区别:
传统型的关系数据库在设计初期时期望实现一个可以满足所有业务场景需求的数据库模型,后来发现无法实现。因此,针对不同应用场景,出现了OldSQL用于支持事务型应用,NoSQL用于支持互联网应用,以及最新发展起来的NewSQL用于支持分析型应用。
NewSQL数据库充分吸收了关系数据库和NoSQL数据库的优点,采用关系数据模型提供强一致性,并借鉴了NoSQL数据库的水平可扩展性。NewSQL数据库可以支持事务查询,具备水平扩展性,可以在多个节点上安装,适用于大量数据存储。
关系数据库、MoSQL和NewSQL数据库产品分类图:
云数据库:
云计算是云数据库兴起的基础,云计算是通过网络以服务的方式为用户提供非常廉价的IT资源。
云计算有八大优势:按需服务、随时服务、通用性、高可靠性、极其廉价、超大规模、可扩展性、免维护。
虚拟化技术是云计算的基石。云计算分为三个层次,即IaaS、PaaS、SaaS。
云数据库是部署和虚拟化在云计算环境中的数据库,有的将其归类为PaaS层,有的归类为SaaS层,其具有动态可扩展、高可用性、较低的使用代价、应用性、免维护、性能优越和安全性好等优点。云数据库适用于大企业的海量数据存储需求、中小企业的成本控制需求以及企业动态变化的存储需求。云数据库与传统数据库的关系是云数据库采用了各种不同的数据模型,如关系模型、文档模型等,但没有自己的专有数据模型。云数据库并非一种全新的数据库技术,而只是以服务的方式提供数据库功能。
MPP数据库:Massive Parallel Processing
全称为大规模并行处理数据库,是面向超大规模数据分析场景设计的分布式数据库,核心通过无共享(Shared Nothing)架构实现计算能力的水平扩展,和传统单机/主从架构的关系数据库在设计目标、底层架构上存在本质差异。
MPP数据库的核心设计思路是分而治之,基于完全无共享的分布式架构实现全链路并行计算:
◆数据全量分片本地化:将TB~PB级的全量数据通过哈希、范围等策略均匀拆分到所有节点的本地磁盘,每个节点只持有自己分片的那部分数据,完全不依赖共享存储设备。
◆查询任务分布式拆解:协调节点收到用户的SQL请求后,会自动将复杂查询拆解为多个并行子任务,下发到所有数据所在的计算节点,每个节点只在本地执行自己分片数据的计算,避免跨节点大量数据搬运。
◆ 结果全局聚合返回:各节点完成本地计算后,将局部结果返回给协调节点,由协调节点完成最终的全局聚合、排序、去重,将最终结果返回给用户。
MPP数据库核心特点:
◆ 无共享架构无资源竞争:每个节点拥有独立的CPU、内存、磁盘,节点间仅通过高速网络通信,不存在共享存储的IO瓶颈,不会出现多任务抢占全局资源的问题。
◆近乎线性水平扩展:性能随节点数量增加近似线性提升,新增节点即可直接扩容计算和存储能力,无需升级昂贵的高端单机硬件。
◆ 面向OLAP场景深度优化:普遍采用列式存储引擎,针对海量数据的聚合、多表关联、批量扫描做了专属优化,单条复杂分析查询可并行调度上百个核心同时执行。
◆ 高容错性保障可用性:数据多副本冗余分布在不同节点,单节点故障时,其他节点可自动接管其任务,不会导致整个集群服务中断。
传统关系数据库是为一线业务的高频交易场景设计,保障每一笔事务的强一致性;而MPP数据库是为海量数据的离线分析场景设计,通过分布式并行计算,让原本需要数小时的亿级数据统计查询,在数秒到数分钟内就能返回结果。绝大多数主流MPP数据库都属于关系型数据库范畴,它是分布式技术与传统关系数据库理论深度结合的产物,完全兼容标准SQL、支持二维表结构、关系代数运算和分布式事务,只是将原本单机的关系型能力,通过无共享分布式架构扩展到了大规模并行场景下。
MPP数据库核心系统架构:MPP数据库普遍采用经典的协调节点+计算节点两层无共享(Share Nothing)分布式架构,所有节点完全独立,没有任何全局共享的存储或计算资源,从根本上避免了单点性能瓶颈:
1. 两大核心节点角色
◆ 协调节点(Coordinator Node):作为用户访问集群的唯一入口,它不存储任何业务分片数据,仅负责接收客户端SQL请求、生成分布式执行计划、调度任务分发、汇总各计算节点的局部结果,最终将完整结果返回给用户。生产环境中通常会部署多个协调节点,实现高可用和负载均衡,避免单点故障。
◆ 数据计算节点(Data Compute Node):集群的核心算力载体,每个节点拥有完全独立的CPU、内存、本地磁盘,互不抢占资源。所有业务数据通过哈希、范围等分片策略均匀分布在所有计算节点的本地磁盘上,收到协调节点下发的子任务后,直接在本地完成数据扫描、过滤、聚合等计算,无需跨节点访问其他节点的本地数据。
2. 架构核心分层组件,从底层到上层,完整架构分为四层:
◆ 存储层:普遍采用面向分析优化的列式存储引擎,数据按列连续存储在节点本地磁盘,针对海量数据批量扫描、聚合操作做深度优化,同时支持多副本冗余存储,保障单节点故障时数据不丢失。
◆ 分布式通信层:基于高速万兆/InfiniBand网络实现节点间的低延迟数据传输,支持Shuffle、广播等分布式数据交换操作,保障跨节点关联、排序等复杂操作的执行效率。
◆ 执行引擎层:基于MPP并行执行模型,将单条SQL拆解为上百个可并行执行的Pipeline子任务,调度到所有计算节点同时运行,最大化利用集群所有CPU核心的算力。
◆ SQL服务层:完全兼容标准ANSI SQL语法,支持复杂多表关联、窗口函数、分布式事务,对外提供和传统单机关系数据库完全一致的使用体验,业务侧几乎无需修改原有SQL即可直接迁移。
MPP是一种分析型数据库,分析型数据库最早是从交易型数据库(也称事务型数据库)衍生而来。分析型数据库已经经历了共享存储架构数据仓库、MPP数据仓库、数据湖三代的发展,目前正在往第四代智能湖仓方向演进。
MPP是一种并行数据库,是在数据库机PDB —— Parallel Database Machine(并行数据库机)技术基础上发展而来的,是MPP的技术源头,核心目标是通过专用硬件+并行架构,彻底突破传统单机数据库的性能天花板。PDB的硬件体系结构经过长期演进,最终形成三类标准分支,其中无共享架构成为现代并行数据库的绝对主流:
◆共享内存(SM,Shared Memory)架构:所有处理机共享同一份全局内存和全部磁盘资源,优势是编程简单,节点间数据通信延迟极低;但缺点是多节点抢占全局资源的冲突严重,节点数量扩展到一定规模后性能会急剧下降,无法支撑超大规模集群。SM结构又可称为完全共享型(Shared-Everything)
◆共享磁盘(SD,Shared Disk)架构:每个处理机拥有独立的私有内存,但所有节点都可以直接访问全部共享磁盘阵列。相比SM架构扩展性有所提升,但共享存储依然是全局IO瓶颈,无法实现性能的线性扩展。
◆无共享(SN,Shared Nothing)架构:所有节点完全独立,每个节点独占自己的CPU、内存和本地磁盘,没有任何全局共享资源,节点之间仅通过高速互连网络通信。Teradata DBC/1012、Tandem Nonstop SQL是这类架构的早期代表,也是当前所有主流MPP数据库的标准架构。
它完全消除了全局资源竞争,随着节点数量增加,系统性能和容量可以实现近乎线性的扩展,是目前工业界公认的最优并行数据库架构 。
文档数据库MongoDB入门:
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成,MongoDB文档类似于JSON对象,BSON(Binary jSON)。字段值可以包含其他文档,数组及文档数组。
数据库:
- 一个MongoDB中可以建立多个数据库;
- MongoDB的默认数据库为“db”,该数据库存储在data目录中;
- MongoDB的单个实例可以容纳多个独立的数据库,每个都有自己的集合和权限,不同的数据库也放置在不同的文件中;
文档:
- 文档是一个键值(key-value)对(即BSON),MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型;
集合:
- 就是MongoDB文档组,类似于RDBMS中的表格;
- 集合存在于数据库中,没有固定的结构,可对集合插入不同格式和类型的数据;
- MongoDB数据类型较多,有字符型、整型、布尔型、双精度型等;