分布式数据库2

时间:2022-09-22 00:23:49

一、分布式数据库系统的设计

1.分片设计

在分布式数据库系统设计中,最基本的问题就是数据的分布问题,即如何对全局数据进行逻辑划分和实际的物理分配。逻辑划分成为分片,实际的物理分配则是分配内容。一般的设计策略我们有自顶向下和自底向上的两种形式。自顶向下有利于理解新鲜事物的内容,从最顶层,由最高点的抽象,逐层抽丝剥茧到最小单元。而自底向上则不同,是在理解事物的基础上,改进底层,逐渐由底层到顶层优化的过程。因此在分析时可以根据不同特点和要求采用不同的分析方法。

数据的分布设计包括分片设计和片段位置的分配设计,前者是对于全局模式的逻辑划分,后者则要映射到合适的物理站点上。也就是将具有“相同性质”的元组进行水平划分,将具有“相同性质”的属性进行垂直分片,没有分别放在一组,每组就组成了一个片段。分片有如下的优点:(1)减少网络传输量;(2)增大事务处理的局部性;(3)提供数据的可用性和查询效率(4)有利于负载均衡。

分片的分类有水平分类、垂直分类、混合分片、诱导分片等。分片的原则是满足完备性和可重构性和不相交性。完备就是全局必须被分配到某一个分片上;可重构,就是有所有分片可以重构出全局模式;不相交性,被划分的数据片段交集为空。因此分片要满足分片的原则。水平分片就是选择相同的关系模式,将元组进行分组,成为局部逻辑概念,同时通过分组合并又可以构成全局的模式。一般通过半连接来降低通信的信息量,结束资源。垂直分片则是对于属性进行选择投影,要求每个记录必须要包含的是其主键列,这样可以形成垂直分片。这样可以降低用户查询的代价,满足用户的要求,这一般通过聚类算法来实现。混合分片则是水平分片和垂直分片的混合分片过程。诱导分片则又叫做关系分片,他不是水平分片,但是利用水平分片进行诱导,分片的关系不是其本身的关系属性,而是另外一个与其有关联关系的属性来划分的。它是一种半连接,在自然连接的基础上完成对于一个关系的投影,或者将两个关系中相同属性先投影,然后再自然连接。对于分片的表示方法可以由图形表示法和分片树表示法,具有直观的优点。

2.分配设计

对于分配的设计,则是全局数据经过分片设计后,对于得到的各个划分的片段,片段到物理场地的存储映射过程。分配的类型包括非复制分配和复制分配两种,前者是非冗余的复制,后者是带有冗余的形式,而且后者又分为局部和全部的复制两种形式。采用复制分配可以增加只读事务处理的局部性,提供系统的可靠性和可用性,但会增加系统的运行和维护的开销;但是采用数据的全分割形式虽然可以使系统负载均衡,降低运行和维护的开销,但是反方面会降低系统事务局部性,及可靠性可用性。因此实际情况我们要进行一个综合折中。

分配要根据实际的数据自身特点、应用需求、场地存储和处理代价等几方面内容进行综合考虑。

二、分布式数据库查询和优化

1.分布式查询和优化

查询处理是数据库管理的主要内容。与集中式查询处理相比较,分布式查询处理的过程分为查询转换、数据局部化、查询存取优化及局部查询优化四个方面。对于查询代价的影响因素有网络传输时延、局部IO代价、CPU的计算代价,因此可以看出一般主要是网络代价和局部IO代价。远程的分布式数据库可能主要考虑通信时延,近的分布式数据库一般考虑IO代价等。

分布式数据库2

在优化查询的处理层次上可以分为全局控制和局部控制两块,全局控制里面又分为查询分解、数据局部化、查询存取优化三部分,局部控制则是局部查询优化和优化的本体执行策略。如图5所示。查询分解主要将查询转换为关系代数表达式,消除冗余表达,对查询进行本地化和就近化,其实主要是基于分片模式和分配模式的。这包括以下四个步骤:查询规范化、查询分析、查询简约、查询重写。查询局部化也就是数据本地化。该阶段包括全局查询和片段查询的优化,全局查询就是根据分片模式分解为分片进行查询;它的输出结果是转换后的查询,它是基于代价的查询存取优化的输入,也就是下一阶段的输入。全局优化的存取查询优化,主要考虑通信代价,也就是对于场地的选择。优化的片段上信息的关系代数查询,是基于数据库的统计信息。该步生成带有分片间通信操作符的查询侧罗。最后在局部查询优化,确定那个场地的副本后,对相应场地进行访问,并进行优化。这一步主要是使用集中式DB,方式进行的,基于局部模式上的逻辑查询计划选择最优的物理查询计划,使得局部查询的相应时间最小,局部IO最小。与集中式数据库比较起来,数据局部化这一步骤是分布式所独有的,它是基于分片和分配的,也是分布式数据库所要考虑的一个重点,是集中式所没有的。

分布式查询优化的影响效率的因素正如前面说的是网络通信代价、局部IO优化、CPU计算的代价。因此对于分布式优化主要就是对于通信代价和局部IO代价的优化。这也是我们查询处理的目标,后两个是集中式数据库系统查询的优化目标。因此在高速局域网中我们就可以只考虑类似于集中式数据库的性能约束因素;当在远程通信网中我们可能考虑的主要因素就是通信代价了。

对于分布式查询其分类可以有局部查询、远程查询和全局查询。分类的标准是查询站点的不同。


2.分布式查询的存取优化

由于分布式查询的重要性,这里再对于分布式查询的存取优化进行说明。分布式存取优化主要是生成带有分片间通信操作符的查询策略,设计到场地连接和通信传输方式等。主要的步骤就是:(1)从查询场地发出查询命令(2)从源场地获取数据(3)确定最佳执行场地(4)返回执行结果。重要的是源场地的选取和执行场地的选择。对于查询优化这里提到一些执行的策略:(1)确定物理副本,进行功能分别,优化性能,分摊成本。主要考虑的策略有本场地物理副本最小、数据量最小者优先;网络通信代价最小的物理副本优先;二元运算最好在本场地运行,减少数据的传输。(2)确定片段查询表达式中操作符的最有执行顺序,这样处理的好处就是减少数据量。(3)选择执行每一个操作符的方法,最优。因此分布式连接操作优化的两种趋势是在广域网中采用半连接,减少网络传输数据量,降低网络传输的费用;同时在局域网中采用直接连接减少局部处理的代价。

查询的代价模型,对于集中式和分布式的代价分别是,可见分布式其中有通信代价,有些时候通信代价并占主要成分。同时通信代价又包括,X为信息量,分别为初始化的信息数量和每次传输的信息数量,C为相应的传输代价。这就是分布式数据库系统查询代价模型。

对于优化方式有基于半连接的和直接连接的两种形式。半连接,在自然连接的基础上,进行投影,降低选择的数据量,虽然这样提供局部查询处理的能力但是这可能会增加数据通信的次数。以A和R的关系为例,其通信代价类似于这样的表达式:(缺少个公式) ,Length为元组的长度,投影属性长度和,Card为基数,类似于投影后元组的个数,但实际情况计算复杂。而基于直接查询的方法基于枚举法的嵌套循环连接算法、归并排序连接算法、散列连接算法和基于索引的连接算法等。这几种方法中,嵌套循环连接,将其中一个关系只读以此,另一个循环嵌套读取,然后进行连接或者按照属性排序后对元组进行顺序排序然后连接,快速有效,必须要选择数据量小的最为只读一次的关系。归并排序,将属性归并排序的同时进行归并连接,合并,即直接使用两个关系排序子表执行归并连接操作,节省以此对于关系的读写操作。散列法,则是对于两个关系同时用同一散列函数对于连接属性散列,在连接属性上具有相同的键值的属性会被放置到相同的桶中,对桶中元组连接。最有基于索引的形式是在关系间建立索引,通过索引优化速度。同时对于查询也用到一些人工智能或者计算智能方面的方法,如遗传算法、模拟退火、动态规划等等,对于提高系统的速度有很大的影响。


三 、分布式数据库事务处理、并发控制、错误控制

1.集中式的事务处理、并发控制、错误控制

事务是一系列操作的序列,这些操作要么全做,要么全部做,是一个不可分割的整体。对于集中式数据库的事务ACID,原子性、一致性、隔离性、持久性,同时还有可串行性。故障在类型上分为:事务故障、系统故障、介质故障和通信故障四类。事务故障又分为可预期的和不可预期的故障,主要进行恢复即可,日志加UNDO。对于系统故障重做或者UNDO。介质故障则解决方案是后备副本和日志文件恢复再加redo。通信故障主要包括网络分割和报文丢失。事务故障、系统故障和通信故障合起来成为软故障,而介质故障成为硬故障。而对于并发控制,主要跟对于数据库的不一致性而言的,采取的措施主要是*,其中涉及到对于资源占用的两种锁,如果操作不当会造成死锁的发生,如何避免解除这个问题,正是这部分研究的内容。

2.分布式事务管理、并发控制、错误控制

对于分布式的事务管理,事务的概念和特点和集中式的相同,当时又有着分布式所独有的特征。处理ACID特性外,分布式要保证全局事务和局部事务作用下全局和局部数据库的一致性;具有执行特性:穿件一个控制进程,协调者进程,协调各子事务的执行;操作特性:数据的存取操作序列外,还要有大量的通信原语;控制报文:增加控制报文,对各个子事务的操作进行协调。因此分布式数据库系统的局部事务管理程序LTM可以利用局部场地提供的事务管理机制实现分布式事务的原子性(相当于集中事务管理,事务恢复机制。)分布式系统的实现模型有进程模型和服务器模型两种。同时分布式的控制模型有主从模型、三角模型、层次模型等。分布式系统的事务管理目标就是要实现使事务具有较高的执行效率、可靠性和并发性。

对于分布式事务的提交协议普遍采用二段提交协议,2PC协议,同时还提供有非阻塞式事务提交协议,解决2PC中可能产生的阻塞等待。对于2PC,其中包括协调者和参与者,协调者事事务的各个代理中指定的一个特殊代理,负责决定所有子事务的提交和废弃;参与者则是除了协调者之外的其他代理,负责个个子事务的提交或者废弃。两段提交协议的基本思想是(1)决定表决阶段,由协调者向各个参与者发出预提交命令,然后等待回答,若所有子事务参与者都返回准备提交的应答,则该事件满足提交的条件。如果有一个参与者的子事务返回准备放弃,则该事务不能提交。(2)执行阶段,在事务具备提交的情况下,协调者向各个参与者发出提交命令,执行提交;否则协调者向所有的参与者发送废弃命令,执行废弃命令。无论提交还是废弃,参与者执行完成后都要向协调者发出确认信息。2PC的实现的方法有集中式方法、分布式2PC方法、分层式方法、线性方法等这几种,集中式简单是一种常用的分布式事务提交协议实现方法,主要是在协调者和参与者见传递消息,小时传输的代价随着参与者的数目的增加而成线性增长;分布式2PC,所有的参与者都是协调者,都可以决定事务的提交和放弃,类似于P2P,等价的(多端);其只需要一个阶段即提交阶段,由相互间通信获得各自状态,来共同决定准备提交还是准备放弃,每个参与者都可以自己决定,不需要协调者的同一命令,但不能传输大量相互的消息,适合小型系统;分层式方法又称为树状实现方法,树根为协调者,参与者构成中间节点或者叶子节点,树根向下层节点发命令,下层阶段向上传确认信息,因此分层2PC报文传输量较少,但由于分层效率低;线性方法可以构造一个线性表似的参与者链表,是一种链表迭代的准备提交和确认,提交的过程,废弃也是如此,线性2PC的报文传输数量也较少,但因为迭代使得响应的效率低,适合于通信代价较高的系统。

针对于2pc的提交协议,当一个参与者不能提交其子事务时,所有的局部的子事务都要终止,这样的效率变得不高,失去联系的参与者被动的等待,等待足够的时间,然后再放弃,并没有协同与其他参与者而进行共同的决策,处于阻塞状态。因此又提出一种3PC的非阻塞式的分布式事务提交协议。与2PC相比,3PC在投票表决和执行阶段中间又加了一个阶段准备提交阶段,同事在表决后、准备提交阶段、执行前如果有一个参与者与协调者失去联系,可以利用其余参与者的信息,通过了解其他参与者的状态来推断协调者的命令,并独立的运行。这里利用了相容矩阵。如表1.这种根据相互状态的相容性,就可以来判断出协调者的发出的命令,因此就可以判断出自已要进行的状态。这也是我们在其他方面设计时所可以借鉴的策略,比如有一个参与者状态是赞成提交,还有一个是提交状态,,其他都正常,因此我们只需要将赞成提交的状态改为准备就绪,通过状态相容原理,可以推断出提交,因为准备就绪和提交都与废弃不相容。

可以参考:http://blog.csdn.net/long636/article/details/51733358

参与者1\参与者2

赞成提交

准备就绪

提交

废弃

赞成提交

相容

相容

不相容

相容

准备就绪

相容

相容

相容

不相容

提交

不相容

相容

相容

不相容

废弃

相容

不相容

不相容

相容

3.分布式故障恢复

对于恢复模型,主要就是根据日志文件和后备副本,利用UNDO 和REDO的结合策略进行的。对于软故障一般先反向UNDO,然后正向REDO;对于硬故障,可以采用副本和日志文件结合的形式,故障之前的备份,导入,在导入点道故障点利用日志恢复即可。对于集中式数据库的故障恢复,我们的更新策略是(1)数据库中更新策略原地更新和异地更新,原地更新是将数据库更新操作直接修改数据库缓冲区中旧值,异地更新新值不代替旧值,但在另一个位置存储。(2)缓冲区的更新,固定/非固定,刷新/非刷新;前者是否要等局部恢复管理器发出命令才将缓冲区内容写入外存数据库;后者这是事务执行结束后,局部恢复管理器是否强制缓存中以修改数据写回外存数据库。第二种可以构成四种组合的固定刷新、固定非刷新、非固定刷新、非固定非刷新的形式,固定刷新可以将被提交的事务写入外存数据库,但废弃事务不会写入,废弃不做恢复;固定非刷新提交的事务可以写入,但废弃仍不可,因此对于已提交重做;非固定刷新提交的事务写入外存,但废弃的可以会部分写如,废弃部分反做;非固定非刷新需要反做和重做相结合。

对于分布式事务的故障恢复有2段提交协议和三段提交协议的方法。但主要都还是对于场地故障和通信故障的两种分类。场地故障般分为参与者场地和协调者场地两类的不同情况的恢复;通信故障里面包括报文丢失和网络分割两种。同事对于两段和三段提交协议,各种分类下情况也会有所不同,这都是针对于各自的特点所引起的。

分布式可靠协议,对于可靠性和可用性,这是一对矛盾的组合,可靠性在给定环境条件和规定的时间内,数据库系统不发生任何失败的概率。可用性则是在给定的时刻上,数据库系统不发生失败的概率。我们可以看出可靠性是一段时间,可用性则是一个时间点;可靠要求的是系统的正确性,可用则是系统的运行能力;可靠性从时间段上我们就可以看出提高很难,二可用性在某个时间点上提高容易。提高一者,必然要牺牲另一个为代价,因此在实际上我们需要对此根据实际情况进行折中。

4.分布式并发控制

并发控制是事务管理的基本任务之一,主要的目的就是保证分布式数据库的数据一致性。当分布式事务并发执行时,并发事务既要实现分布式事务的可串行性,又要保证事务具有良好的并发度,保证系统的良好性能。可串行性是并发执行的几个事务,其操作的结果应该以某种顺序串行执行这几个事务所得到的结果相同。这种可串行话的并行调度是由数据库的并发控制机制来完成的,保证数据库并发执行时数据库的一致性。可串行化调度就是等价于某种串行化的执行结果的并发调度。可以采用的技术有分布式锁(*)技术和分布式形式的技术。前者和集中式相同,主要采用共享锁和互斥锁的形式,访问资源先给资源加锁,以后进程访问的资源已经加锁,根据加锁类型,如果是排它锁,后续进程当要使用该资源时必须要等上个进程完成对该资源的访问,释放其排它锁,方可占用。分享锁简单些。但是这样如果,两个进程和两个资源,每个进程都先占用一个资源,加排它锁,但随后都需要彼此的资源,那么它们就陷入了死锁。如何避免死锁,可以有避免法和出现检测排除法两种形式,避免法则是资源排序,一次占用,或者顺序占用,避免发生死锁。出现检测排除法,可以允许发生死锁,但是如果等待超时后,可以自动进行资源的调度,检出死锁,可以利用图法检测。可以看出前者资源浪费严重,但可以保证不出现死锁;后者资源利用率高,但是调度和算法复杂。对于分布式数据库系统可以利用集中式的并行调度在各自站点上调度,同时也可以对于不固定主站点的形式采用主副式策略等。

对于并行协议,可以采用两段风俗按协议2PL实现,可以对于丢失修改错误、不能重复读错误、读脏数据错误等进行控制,同时可以采用更加严格的2PL协议对于提交或者废弃进行处理。同时对于并发控制算法可以采用悲观法和乐观法。悲观法如上面讲到的加锁法,时间戳法、混合法,而且加锁法还可以在分为集中式、分布式、主副本的加锁形式,时间戳也有分类等等。乐观法则是包括加锁法和时间戳法。可以说它们各有优缺点,选用时可以根据具体情况选择。


以上内容只是个人在学习过程中的总结报告。