前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:相当硬核,黑皮书《数据库系统概念》读书笔记,讲解:
1.数据库系统的基本概念(数据库设计过程、关系型数据库理论、数据库应用的设计与开发…)
2.大数据分析(大数据存储系统,键值存储,Nosql系统,MapReduce,Apache Spark,流数据和图数据库等…)
3.数据库系统的实现技术(数据存储结构,缓冲区管理,索引结构,查询执行算法,查询优化算法,事务的原子性、一致性、隔离型、持久性等基本概念,并发控制与故障恢复技术…)
4.并行和分布式数据库(集中式、客户-服务器、并行和分布式,基于云系统的计算机体系结构…)
5.更多数据库高级主题(LSM树及其变种、位图索引、空间索引、动态散列等索引结构的拓展,高级应用开发中的性能调整,应用程序移植和标准化,数据库与区块链等…)
🌰 文章简介:概述在服务器系统上运行的数据库系统的体系结构,这些体系结构用于集中式和客户-服务器体系结构中。然后概述并行计算机体系结构,以及为不同类型的并行计算机设计的并行数据库体系结构。最后概述分布式数据系统构建中的体系结构问题。
文章目录
- 1.概述
- 2.集中式数据库系统
- 3.服务器系统体系结构
- 3.1 事务服务器体系结构
- 3.2 数据服务器与数据存储系统
- 3.3 客户端高速缓存
- 4.并行系统
- 4.1 并行数据库的动机
- 4.2 并行系统的性能度量
- 4.3 互连网络
- 4.4 并行数据库体系结构
- 4.5 共享内存
- 4.5.1 共享内存体系结构
- 4.5.2 高速缓存一致性
- 4.6 共享磁盘
- 4.7 无共享
- 4.8 层次
- 5.分布式系统
- 6.并行和分布式系统中的事务处理
- 7.基于云的服务
- 7.1 云服务模型
1.概述
最早的数据库是在单台支持多任务的物理机器上运行的,这种集中式的数据库系统仍然在被广泛使用,如今在集中式数据库系统上运行的企业级应用可能拥有成千上万的用户,数据库的规模从兆字节到数百G字节不等。
并行数据库系统(paraller data system)是上世纪80年代末开始开发的,用在大量计算机上并行执行任务,它是为处理高端企业应用而开发的,用于在大量计算机并行执行任务。
并行数据存储系统(paraller data storage system)主要被设计用于存储和检索基于码的数据,与并行数据库不同,数据库存储系统通常对事务提供非常有限的支持,而且它们缺乏对声明性查询的支持。另外,这样的系统能够在非常多的机器(成千上万)上并行运行,这是大多数并行数据库无法处理的规模。
此外,数据通常在不同的数据库上生成和存储,从而需要跨多个数据库执行查询和更新事务,这导致了分布式数据库系统的发展。分布式数据库环境中开发的容错技术在确保大规模并行数据库和数据存储系统的可靠性和可用性。
2.集中式数据库系统
集中式数据库系统是运行在单个计算机系统上的系统,这些数据库系统应用很广,既有单用户系统,又有多用户系统。集中式数据库系统广泛应用于企业级应用。
使用计算机通常有两种方式:作为单用户系统和作为多用户系统。智能手机和个人电脑属于第一类。典型的单用户系统(single user system)是由单个人使用的系统,通常只有一个处理器(一般有多个核)、一个或两个磁盘。典型的多用户系统有多个磁盘、多个处理器和大量内存。这种系统为大量与远程用户连接的用户服务,因此被称为服务器系统(server system)
为单用户系统设计的系统一般不提供多用户数据库系统所提供的的许多功能,特别是,它可能只支持非常简单的并发控制方案,因为对数据库进行高并发访问基本是不太可能的。支持弱的故障恢复(更新前备份)或者不支持。可能不支持SQL,而是提供用于数据访问的API。因为通常被设计来链接到单个应用程序,只能从该应用程序访问,因此,这些系统被称为嵌入式数据库
多数据库系统支持之前章节学习到的全部事务特性,被称为服务器。
如今我们使用的大多数通用计算机系统都有几个多核处理器(通常是1-4个),每个多核处理器有几个核(通常是4-8个)。主存在所有处理器之间共享。具有这样少量的核和共享内存的并行被称为粗粒度并行(coarse-grained parallelism)
在单处理器系统上运行的操作系统支持多任务,允许多个进程以分时方式运行在同一个处理器上,因此,不同进程的动作可能是交错的。为单处理器机器设计的数据库长期以来一直被设计为允许多个进程或线程并发访问共享的数据库结构。因此,在处理真正并行运行的多个进程时的许多问题(例如对数据的并发访问)已经有为单处理器机器设计的数据库解决。其结果是,为分时的单处理器机器设计的数据库系统可以相对容易的在粗粒度并行系统上运行。
在粗粒度并行机器上运行的数据库通常不会尝试将单个查询划分给多个处理器,而是将每个查询运行在单个处理器上,允许多个查询并发执行。因此,这样的系统支持更高的吞吐量,也就是说,允许每秒运行更多的事务,尽管单个事务不会运行得更快。近年来,甚至连移动电话都开始支持多核,粗粒度并行系统也在不断演进,以支持对单个查询的并行处理。
细粒度并行(fine-grained parallelism)的机器拥有大量的处理器,在这类机器上运行的数据库系统视图对用于提交的单个任务(例如查询)进行并行化。
总的来说,并行性已经成为软件系统设计的一个关键问题,第4节将介绍并行数据库系统的体系结构。
3.服务器系统体系结构
服务器系统可以大致分为事务服务器和数据服务器。
3.1 事务服务器体系结构
事务服务器系统也被称为查询服务器,它提供接口,客户端通过向该接口发送请求来执行操作,服务器将执行结果返回给客户端。迄今为止,相对于数据服务器系统结构,事务服务器体系结构应用更加广泛。
当今典型的事务服务器系统有访问共享内存的多个进程组成,如下图,构成数据库系统的组成部分的进程包括。
- 服务器进程。该进程接收用户的查询(事务),执行结果并返回。查询可以来自用户视图或者运行嵌入式SQL的用户进程,也可以是通过JDBC或者ODBC将其提交到服务器进程。有些数据库对每个用户使用一个单独的数据库进程,有些数据库会对所有用户使用一个数据库进程,但是使用多个线程来让查询并发执行。许多数据库系统使用混合体系结构,具有多个进程、每个进程运行多个线程。
- 锁管理进程。实现锁管理功能,包括锁授予、锁释放和死锁检测。
- 数据库写进程。一个或者多个进程不断地将修改过的缓冲块输出到磁盘。
- 日志写进程。服务器进程会将日志简单的输出到日志缓冲区,如果需要强制输出日志,日志写进程会将日志记录从缓冲区输出到稳定的存储器。
- 检查点进程。定期执行检查点操作。(检查点:实现介质恢复时将以最近的checkpoint为执行事务前滚的参照点)
- 进程监控进程。
共享内存包含所有的共享数据。 - 缓冲池
- 高速缓存的查询计划。它在同一个查询再次被提交时可以复用。
- 锁表。
- 日志缓冲区。包含待输出到稳定存储器上的日志记录。
由于多个进程可以访问数据库,必须设计一种机制确保互斥,即同一时刻最多有一个进程来修改共享内存中的数据结构,且当数据结构被写时不能有进程读。
可以通过操作系统的信号量实现互斥,但是使用计算机硬件所支持的原子操作指令(atomic instruction)开销更小。比如compare-and-swap或者test-and-set。
原子指令的实现机制一般是在cpu的互联网络中实现一个全局的原子寄存器,所有cpu对这个原子寄存器的访问是互斥的。cpu使用原子指令申请访问原子寄存器时,互联网络会对所有CPU进行仲裁,确保只有一个cpu可以获得对原子寄存器的访问权;如果有cpu获得了原子寄存器访问权,其他cpu必须等待该cpu释放权限才能继续执行。
原文链接:https://blog.csdn.net/qianniuwei321/article/details/124817265
注意原子操作指令可以用于互斥,但是这仅相当于支持排它锁,不支持共享锁,不能够直接用于实现数据库中通用的锁,但是原子操作指令可以用于实现短时间的锁,也称为闩(shuuan)锁,以用于数据库中的互斥。
共享锁与排它锁
1.共享锁,又称之为读锁,简称S锁,当事务对数据加上读锁后,其他事务只能对该数据加读锁,不能做任何修改操作,也就是不能添加写锁。只有当数据上的读锁被释放后,其他事务才能对其添加写锁。共享锁主要是为了支持并发的读取数据而出现的,读取数据时,不允许其他事务对当前数据进行修改操作,从而避免”不可重读”的问题的出现。
2.排它锁,又称之为写锁,简称X锁,当事务对数据加上写锁后,其他事务既不能对该数据添加读写,也不能对该数据添加写锁,写锁与其他锁都是互斥的。只有当前数据写锁被释放后,其他事务才能对其添加写锁或者是读锁。写锁主要是为了解决在修改数据时,不允许其他事务对当前数据进行修改和读取操作,从而可以有效避免”脏读”问题的产生。
为了避免消息传递带来的开销,许多数据库系统直接更新共享内存的锁表(锁表如下图),而不是向锁管理器进程发送锁消息。
进程必须保证对锁表访问互斥,这通常是通过获取锁表上的互斥锁完成的,方法是在代表锁表的锁的内存位置上使用test-and-set
或compare-and-swap
指令。
通过直接更新共享内存中锁表的方式,可以按以下步骤执行希望获得锁的事务。
1.获取锁表上的互斥锁(闩锁)
2.检查是否可以分配请求的锁,如果可以,则更新锁表以表示已分配锁,否则,更新锁表以表示锁请求在该锁的队列中
3.释放表上的互斥锁。
如果由于锁冲突而无法立即获取锁,则事务可以定期读取锁表,检查是否有锁释放可以将锁分配给它。这个过程是:
1.获得锁表上的互斥锁
2.对于即将被释放的锁,从锁表中删除其记录项。
3.如果有任何其他挂起的锁请求该数据项,且锁可以分配给该请求,锁表将被更新以将这些请求标记为已分配。
4.释放表上的互斥锁。
为了避免对锁表进行不必要的重复检查,锁请求代码可以使用操作系统的信号量来等待锁授予的通知,然后,锁释放代码必须使用信号量机制通知等待事务其锁已经被授予。
即使系统是通过共享内存来处理锁的请求的,也仍然使用锁管理器进程进行死锁检测。
3.2 数据服务器与数据存储系统
数据服务器系统允许客户端以文件、页面或对象发送读取或更新数据的请求,从而与服务器进行交互。例如,文件服务器提供一个文件系统接口,客户端可以在其中创建、更新、读取和删除文件。同时,数据服务器系统提供对于小于文件大小的数据单元的支持,比如页面元组或者对象。还提供索引工具和事务工具,以保证数据在客户端或者进程故障时数据不会处于不一致的状态。数据服务器系统被广泛应用于处理网络规模的流量。
数据服务器最初是允许程序员使用面向对象数据库访问设计而开发的,面向对象允许程序员使用允许创建、检索和更新持久对象的编程语言。
面向对象数据库的许多目标应用都需要对检索到的设计软件进行大量的计算,比如CAD软件可以存储计算机芯片或者建筑物的模型,进行仿真等,这在CPU上的代价是很大的。
如果将所有计算都放在服务端,那么服务器就会过载。相反,这种情况下将数据存储在单独的数据服务器上,在需要时将数据提取到客户端,由客户端执行计算,将更新后的数据存储回服务器。
已经开发了许多并行数据存储系统来处理大量的数据和事务。这样的系统不必支持SQL,而是仅仅用于存储、检索和更新数据项的API。存储在此类系统的数据项可以是元组,也可以是JSON或XML等格式表示的对象,甚至可以是文件或文档。
我们使用术语数据项来指代元组、对象、文件或文档,也交替使用术语数据服务器和数据存储系统。
早期存储系统中的数据服务器支持页面传送,如今不再支持,因为存储系统不应该向客户端公开底层的存储布局。
3.3 客户端高速缓存
客户端与服务端通信相比本地内存引用的时间代价是很高的。
客户端可以采取优化策略来减少网络延迟(network-latency,指在网络上发消息得到响应的时间)的影响。数据库系统也可以采取同样的策略。
- 预取。当一个数据项被请求时,同时发送可能在不久的将来使用的其他数据项。
- 数据高速缓存。在单个事务范围内或者事务完成后,都可以将数据缓存在客户端。但是高速缓存一致性(cache coherecy)是一个值得关注的问题,可能服务器的数据已经被其他客户端更新了,而本地客户端与其不一致。
- 锁高速缓存。如果数据的使用主要是在客户端之间进行划分的,而客户端很少请求其他客户端也请求的数据项,可以将锁也在客户端高速缓存。假设客户端在高速缓存中找到一个数据项,并且它还找到访问该数据项所需要的锁,那么就可以在不与服务器进行任何通信的情况下继续进行该访问,但是服务器必须跟踪被高速缓存的锁,如果客户端向服务器请求锁,服务器必须从高速缓存该锁的任何其他客户端回调数据项上的所有冲突锁。如果考虑机器故障,此任务变得更加复杂。
- 自适应锁粒度。如果一个事务需要对事务中的多个数据项加锁,并且获取每个锁都需要与数据服务器进行往返通信,则该事务在锁的获取上会浪费大量时间。这种情况下可以使用多粒度锁来避免多重请求。例如,一个页面中存储了多个数据项,那么单个的页面锁较于多个数据项锁更敏捷。但是锁争用较多的情况下,获取粗粒度锁会显著影响并发度。锁降级是在出现高争用是自适应降低锁粒度的方式。
4.并行系统
4.1 并行数据库的动机
万维网发展创造了许多网站,浏览器收集到的数据越来越多,过去的集中式数据库系统已经不足以处理此类应用。
4.2 并行系统的性能度量
数据库系统的衡量指标主要是两个:
- 吞吐量。
- 响应时间。
对应地,并行研究的两个重要问题是:加速比(更短时间运行一个任务)和扩展比(并行运行更多的任务数)。
如下图,为执行一个大型任务扩展cpu、磁盘等资源,假如资源增长N倍。其并行性也增长N倍,则称为线性加速比,否则称为亚线性加速比。
同样地,如果给定N倍的任务规模,扩大N倍的资源,其执行任务时间不变,则称为线性扩展比,否则为亚线性扩展比。
根据对问题规模的度量方式不同,并行系统的扩展比分为两种:
- 批量型扩展比。数据库的任务是运行时间依赖于数据库规模的大型作业。比如扫描与数据库规模成比例的关系。
- 对事务型扩展比,数据库的事务提交率增加,并且数据库规模的增长与事务率称正比。这类扩展比适用于的事务是小更新类的事务处理系统,比如银行的存款和取款。
下面这些因素影响并行操作的效率,并且可能同时降低加速比与扩展比。
- 串行计算,有些任务必须要串行执行。
- 干扰,并行系统中进程经常访问共享资源,因此当它们竞争共同持有资源时(如系统总线、共享磁盘、甚至锁),会使速度降低。
- 倾斜。将单项任务分解为多个并行步骤来减少平均步骤的规则,很难分成均等部分,运行速度会取决于最慢的步骤的服务时间。
- 启动代价,进程初始化需要相对应的启动代价。
4.3 互连网络
并行系统包括一套组件(处理器、存储器和磁盘),这些组件通过互连网络(interconnenction network)进行通信,下图显示了常见的互连网络类型。
- 总线。如图a,所有组件通过一根通信总线来收发数据。早期把它用于多个节点的互连,但总线在同一时间只能够处理一个组件的通信,这太不利于扩展了,现在甚至单个节点都采用环或网格互连机制了,因此总线方式不太主流了。
- 环。组件按环状互连。这样彼此之间可以并发通信,但是可能一个消息需要通过n/2个链接,而且节点越多,传输延迟越大。
- 网格。组件通过网格互联,图c是二维网格,一个组件最多与四个组件相连,对三维网格来说,一个组件最多与六个组件相连。网格互连用于将处理器中的多个核或单台服务器中的多个处理器相互连接。早期网格互连还用于节点互连,但是由于其节点越多,传输消息的链接也越多,现在网格也不用与节点互连了。
- 超立方体。每个组件采用二进制编码,如果节点的二进制编码差一位,则互连。因此,n个组件采用超立方体连接,每个组件将与log(n)个节点互连。超立方体的通信延迟显著低于立方体的通信延迟。
- 树形拓扑。组件之间按照树形拓扑互连。图中e是三层树形拓扑(tree-like topolopy)结构。
基本的树形拓扑是,同一机架的数十台机器通过机架顶部交换机互连,机架顶部交换机与聚合交换机相连接,以便多组机架之间可以进行互连,聚合交换机依次连接到核心交换机。这被称为三层树拓扑(tree topolopy)。
组织机构的内部的局域网通常采用这种基本的树形结构,不过如果一个机架中的多台机器试图与来自其他机架的机器进行大量数据的通信,那么机架之间的可用带宽就会不够。
为了避免树形结构的带宽瓶颈,数据中心通常将每个机架顶部(边缘)交换机连接到多个聚合交换机,每个聚合交换机依次链接下一层的多台核心交换机。这被称为树形拓扑(tree-like topolopy),这种结构增强了带宽,并且使网络具有容错性。
三层树形拓扑可以处理具有数万台机器的集群。三层树形拓扑及其变体在现在得到了广泛的应用,数据中心中复杂的互连网络被称为数据中心网络。
网络性能特别关键,网络性能的一个关键是用于单个链路的网络技术,流行的有:
- 以太网。当前网络连接的主流技术是以太网技术,主要是1GB以太网和10GB以太网。
- 光纤通道。光纤通道协议标准被设计用于存储系统和计算机之间的高速互连。
- 无限带宽。无限带宽标准为与数据中心的互连而设计,是专门为需要高带宽低延迟的高性能计算应用而设计的。
什么是以太网技术?
以太网技术提供的规则允许网络连接的设备相互通信,而无需相互通信。在口头对话中,当两个人同时说话时,每个人都可能难以理解对方在说什么。例如,当 10 个人同时说话时,这种情况就会被放大。想象一下一次 100 或 1000 个。
数据网络也是如此。如果共享网络上的两个或多个连接的设备尝试同时传输数据包,则会发生数据包冲突。构成数据包的电脉冲或光子在通过共享铜缆或光缆同时发送时重叠。
以太网旨在解决数据包冲突问题。它为网络设备提供了一套规则,基本上是说:“在你说话之前,确保没有其他人在说话。如果你在说话时听到有人说话,停下来,听,等谈话结束再说话。
关于无限带宽技术可以参考:Infiniband技术简介
一种用于降低延迟的重要技术是允许应用程序绕过操作系统直接与硬件接口,来收发消息。这会大大减少通信延迟。还可以采用远程直接内存访问(Remote Direct Memory Acess,RDMA),一种允许一个节点的进程直接读取另一个节点的内存的技术减少延迟。
4.4 并行数据库体系结构
并行数据库有若干种体系结构模型,其中下图是最重要的几种,其中M表示内存,P表示处理器,圆柱体表示磁盘。
- 共享内存。所有处理器共享一个公共的内存
- 共享磁盘。一组节点共享一组公共的磁盘,每个节点都有单独的处理器和内存,共享磁盘系统有时候又被称作集群。
- 无共享。一组节点既不共享公共的内存,也不共享磁盘。
- 层次。这种模型是前三种的混合,是当前使用最广泛的模型。
4.5 共享内存
在共享内存体系结构中,处理器可以访问公共内存,这使得进程间通信变得特别高效,因为只需要把内容写到共享内存其他进程就可以“看到”。磁盘也被共享。
多核处理器现在迅猛发展,一个芯片上可以有若干个处理器,为了与传统意义上的处理器区分开,我们将片上处理器称为核。低成本多核处理器使得共享内存的并行处理越来越重要。
4.5.1 共享内存体系结构
早期的共享内存体系结构通过总线将处理器和内存互连。
这样无疑会造成扩展上的瓶颈。现代内存共享结构每个处理器都有本地连接的内存,并且可以访问其他处理器关联的内存。由于访问本地内存和其它处理器内存的速度差异,被称为非统一内存体系结构(Non-Uniform Memory Architecture,NUMA)。
由于共享内存体系需要在核与核之间和处理器之间互连,其规模限制为最多几百个核。
由于高速缓存比主存快的多,因此共享内存体系也加入了高速缓存,如果需要对不在高速缓存中的数据项访问,需要从主存提取,称为高速缓存未命中(cache miss).
许多处理器体系结构支持超线程(hyper-threading),或称为硬件线程(hardware threading)的功能,其中单个物理核可以划分为多个逻辑核,当一个逻辑核缓存未命中时,同一物理核的其他逻辑核可以开始工作,不至于等待从主存中提取数据而陷入空闲状态。
典型的多核处理器具有多级缓存,其中L1最快,但也最小,其他级别同理。L1,L2为核的本地缓存,L3被多核共享。数据以高速缓存行(cache line,通常为64个连续字节)为单位读写到高速缓存。
4.5.2 高速缓存一致性
只要存在多个核或者多处理器,每个核拥有自己的本地高速缓存,就可能出现高速缓存不一致(cache coherency)的问题。比如core0的本地缓存更新,但是core2中维护的还是同一内存地址的旧值。因此,当内存位置发生更新时,要确保该内存位置的副本都失效。
许多处理器体系结构中,内存失效从传输到执行会存在延迟,可能导致从一个处理器写入,但是在另一个处理器中读时无法读到更新。
这会导致问题,现代处理器支持内存屏障(memory barrier)指令,它确保了屏障之前的加载/存储操作与屏障之后的加载/存储操作之间的特定顺序。用通俗的话解释就是,它可以保证在之前的高速缓存失效前,让处理器等一等,直到确保接收到的作废消息已经被应用。
值得高兴的是,写程序是不需要包含任何额外的代码来处理高速缓存的一致性,只需要在访问数据之前获取锁,在访问数据之后释放锁即可。因为锁的获取与释放过程中就包括了所需的内存屏障指令。各种语言支持的同步原语也在内部执行内存屏障指令。
许多处理器体系还支持硬件级别的共享锁和排他锁来确保高速缓存的一致性,这比软件更高效,其中MESI协议是一种广泛使用的协议。缓存一致性协议通过监控独立的loads和stores指令来监控缓存同步冲突,并确保不同的处理器对于共享内存的状态有一致性的看法。当一个处理器loads或stores一个内存地址a时,它会在bus总线上广播该请求,其他的处理器和主内存都会监听总线(也称为snooping)。
MESI原理可以参考:缓存一致性协议(MESI)——缓存加锁协议
原则上,可以确保基于这种锁的高速缓存一致性协议具有"强"的高速缓存一致性,从而使得内存屏障指令冗余,然而,许多实现包含一些加速处理的优化,例如允许延迟传递无效的消息,但代价是不保证高速缓存的一致性,因此许多处理器体系结构需要内存屏障指令来确保高速缓存的一致性。
4.6 共享磁盘
共享磁盘系统模型中,一组节点共享一组公共的磁盘,每个节点都有单独的处理器和内存。这种体系结构有两个优点。共享磁盘系统可以扩展比共享内存系统更多的处理器。其次,它提供了一种经济的容错(fault ):如果一个节点发生故障,其他节点可以接管这个节点的任务,因为数据库驻留在所有节点都可以访问的磁盘上。
我们可以使用RAID来使磁盘子系统本身具有容错性,即使单个磁盘发生故障,系统也可以正常工作;RAID还提供了一定程度的并行性。
存储区域网SAN是一种高速局域网,可以将多个物理上磁盘阵列抽象称一个逻辑磁盘,隐藏物理磁盘的复杂细节。逻辑磁盘还可以随时扩展物理磁盘,处理节点可以像访问本地磁盘一样访问磁盘。
存储区域网通常具有冗余,例如节点之间有多条路径,因此诸如链接或到网络的连接这样的组件故障,网络还可以继续工作。
存储区域网非常适合构建共享磁盘系统。适用于对并发要求低但是对可靠性要求高的应用。
与共享内存系统相比,共享磁盘系统可以扩展更多的处理器,但是其网络通信较慢。
共享磁盘系统到网络连接的带宽小于本地存储器的可用带宽,因此存储器的访问可能成为瓶颈,限制了可扩展性。
4.7 无共享
无共享系统。一组节点既不共享公共的内存,也不共享磁盘。节点之间通过高速互连的网络进行通信。由于无共享模型的磁盘访问由本地磁盘提供,克服了所有I/O通过单个互连网络的缺点。
此外,无共享系统的互连网络(如树形互连网络),通常被设计成为可扩展的,因此其传输容量会随着节点的增加而增加,因此,无共享网络更具有可扩展性,并可以轻松支持大量的节点。
无共享系统的主要缺点是本地磁盘和通信的成本更高、由于具有很高的扩展性,无共享体系结构被广泛用于处理非常大的数据量,支持对数千个节点或者极端情况下甚至数万个节点的可扩展性。
4.8 层次
层次模型是前三种的混合,是当前使用最广泛的模型。在顶层,系统由通过互连网络的无共享节点组成,因此其顶层是无共享体系结构。每个节点实际上是一个共享内存结构。或者可以是三层结构,顶层是无共享结构,底层是共享内存结构,中间还有一层是共享磁盘的体系结构。
当今的并行数据库系统通常运行在层次体系结构上,其中每个节点都支持共享内存的并行性,多个节点以无共享方式互连。
5.分布式系统
在分布式数据库系统中,数据存储在节点中,节点分布在地理上分散的站点上,它们不共享内存和磁盘,其结构如下。
无共享的并行数据库和分布式数据库的主要区别如下。
- 分布式数据库具有在地理位置上分散的站点,因此分布式的网络连接具有更低的带宽,更高的延迟和更大的故障概率。
- 并行数据库无法保证诸如自然灾害等导致数据中心故障时的系统可用性,但分布式可用。
- 分布式数据库可以单独管理,每个站点具有一定的自主权。许多分布式数据库其实是通过集成多个数据库构建的,这样可以允许查询和事务跨数据库边界。不过为了跨地理站点而构建的分布式数据库可能是集中式管理的。
- 分布式数据库中的节点往往在规模和功能上差异更大。
- 分布式数据库区分局部事务和全局事务,局部事务是仅从启动事务的节点访问数据的事务,全局事务要么从启动节点外的单个节点访问数据,要么则跨多个节点访问数据。
如今的web级应用运行在数据管理系统上,结合了并行性和分布式的支持,并行性保证高负载的支持,分布式则保证高可用。这种系统的一个特点是集中式管理。
相反,通过集成现有数据库系统构建的分布式数据库具有一些不同的特性。
- 共享数据。比如一个校园中的用户可以访问另外一个校园中的数据。
- 自治。
在同构分布式数据库系统中,节点共享一个通用的全局模式,所有节点都运行同一个分布式数据库管理软件,并且节点在处理事务和查询时积极合作。相反地,将多个已经存在的数据库系统链接在一起构成分布式数据库,每个数据库系统都有自己的模式,自己的数据库管理系统,称为联邦数据库系统或异构分布式数据库系统
分布式数据库的节点通过广域网进行通信,带宽昂贵且低速。网络故障可能会导致节点无法通信,即网络分区,影响系统的可用性。
6.并行和分布式系统中的事务处理
事务的原子性是构建并行和分布式数据库系统时的一个重要问题。如果事务跨两个节点,可能出现一个节点上提交事务,另一个节点上弃用事务的不一致情行。事务提交协议用来避免这样的情况,其中2PC(two-Phase commit Protocol)是最广泛的协议。
2PC协议的核心思想是,每个节点执行事务,直到事务进入部分提交状态,此时选择一个节点作为决策节点,该节点进入ready
状态,当所有节点都ready
以后,同一执行事务的提交,如果有节点出现故障,则决策节点同一执行中止或者恢复提交策略。
并发控制是并行和分布式系统的另一个关键问题,多个节点的事务管理器可能需要跨节点合作,如果使用封锁,可以在包含被访问数据项的本地执行封锁,但是涉及原子多个节点的事务也可能出现死锁。因此,死锁检测需要跨多个节点进行。
分布式的故障更常见,因为除了计算机故障,网络还可能故障。数据项的复制是分布式数据库在发生故障时运行的关键。这会使得并发控制进一步复杂化。
当要执行的任务很复杂,涉及到多个数据库和与人的多次交互时,可以使用工作流管理系统。
7.基于云的服务
对很多企业来说,自己管理服务器很贵而且很麻烦,因此近几年云计算变得很流行了,直接从云服务上购买云服务,包括硬件,甚至包括诸如数据库等软件。
7.1 云服务模型
利用云计算的方式有几种,下图是一个基础设施即服务的模型。
- 基础设施即服务模型
- 平台即服务模型
- 软件即服务模型