同构分布式数据库:所有站点都使用共同的数据库管理系统软件,它们彼此了解,合作处理用户的需求。本地的站点放弃了作为其自治权一部分的更改模式或者数据库管理系统软件的权利。
异构分布式数据库:不同的站点具有不同的模式和不同的数据库管理系统软件。站点之间并不了解,在事务处理过程中,它们仅仅为合作提供有限的功能。模式的差别经常是查询处理中的主要问题,软件的差别成为访问多站点事务处理的障碍。
我们主要讨论同构分布式数据库。
在分布式数据库存储一个关系的方法:
如果关系r被复制,则在两个或两个以上的站点存在关系r的副本。最极端情况下采用全复制,这是每个站点都存有副本,优缺点:
对一个关系分片有两种模式:
分布式数据库系统的用户不需要知道数据的物理位置,或者如何访问某个特定本地站点的数据。该特点称为数据透明性,可以有以下形式:
数据项必须有为唯一的名字,在分布式数据库中,我们必须保证两个站点没有对不同数据项使用相同的名字。
解决方法:
但这样名字服务器可能成为性能的瓶颈,并且如果名字服务器崩溃,分布式系统的站点不可能允许下去。
每个站点都有自己的局部事务管理器,保证在该站点执行的事务的ACID特性。各个事务管理器协调执行全局事务。
其中每个站点包括两个子系统:
基本故障类型包括:
分布式系统总是可能发生消息的丢失或损坏,系统采用TCP/IP协议来处理这样的错误。如果两个站点A和B不直接相连,消息必须通过一系列的通信链路从一个站点到两一个。如果有一条链路故障,则通过该链路传送的消息必须重新路由。在某些情况下,故障可能导致某些站点之间没有连接。如果一个系统分成了两个彼此无任何连接的称为分区的子系统,我们说该系统被分割。
两阶段提交协议(2PC)是最简单且使用最广泛的提交协议之一。
考虑一个从站点Si发起的事务T,并设Si的事务协调器是Ci。
当T完成执行时(即执行T的所有站点都通知Ci已完成了T的执行),Ci启动2PC协议。
在向协调器发送ready T消息之前,执行T的站点可以在任何时候无条件中止。一旦ready T消息发出,则站点上的事务称为就绪状态。由于事务的提交需要全体一致,只要有一个站点回答abort T,事务T的命运就决定了。由于作为协调器的站点Si是执行T的站点之一,协调器可以单方面将T中止。
2PC的主要缺陷在于协调器可能导致阻塞。
当故障站点重启后,恢复过程必须对疑问事务进行特殊对待:疑问事务时发现有
当所有疑问事务的锁重新获取后,即使在疑问事务的提交-中止状态确定前,该站点的事务就可以开始。疑问事务的提交或回滚与新事务的执行时并发的。
3PC协议是对2PC的扩展,它在某种条件下可以避免阻塞问题。特别是,它假设没有网络分割发生,至多有k个参与的站点发生故障,这里的k是某个预定义的值。在假设下,协议加入额外的第三阶段避免阻塞。在该阶段,多个站点涉及提交的决定。协调器不是在持久存储中直接记录提交的决定,而是首先保证至少有k个其他的站点知道它将提交事务。如果协调器故障,剩下的站点首先选择一个新的协调器。新的协调器从剩下站点中检查协议的状态,如果协调器已经决定提交,那么其他k个被通知的站点至少有一个没有故障而同意提交决定。如果某个站点站点旧的协调器提交,那么新的协调器重新开始第三阶段。否则中止事务。
3PC在网络分割下同样会导致阻塞,并且由于其开销大没有被广泛使用。
持久消息:该模式将一个事务变成在不同的数据库运行的多个部分。如果发生该消息的事务提交,则持久消息保证传送给接收者仅仅一次,如果该事务中止,则持久消息保证不被传送。但可以消除阻塞。
持久消息的实现,持久消息在下面的协议中可以在不可靠的信息传递架构之上实现,这可能丢失消息或者把消息传送多次:
消息传送进程监控关系,当发现新消息,它将消息发送到目的地。通常数据库并发控制机制保证系统进程只在写消息的事务提交之后才能读取消息。如果事务中止,通常的恢复机制将从关系中删除消息。
消息传送进程在它收到目的站点的确认后才从关系中删除消息,如果没有收到,将在一段时间后重新发送直到确认。万一发生永久故障,系统将在一段时间后决定不再传送,然后调用应用程序提供的异常处理代码处理故障。
在许多消息系统中,随机的消息延迟很少发生但有可能发生。因此,为了安全,消息不会从received_messages中删除。删除消息将无法检测重复传送。但这导致特殊关系received_messages的无限增长。可以为每个消息赋予一个时间戳,如果一个接受的消息的时间戳比截止期旧,则消息丢弃。记录在特殊关系中的所有比截止期旧的消息都可以删除。
假设共享与排他两种封锁模式的存在。
在单一锁管理器下,系统维护位于选定的单一站点(如Si)上的单一锁管理器。所有加锁和解锁请求都在站点Si处理。
每个站点维护一个本地锁管理器,来处理存储在该站点上的数据项的加锁和解锁请求。
在数据项有副本时的封锁可选方法:
产生时间戳的两种方法:
在主从复制下,数据库允许在主站点更新,并自动将更新传播到其他站的副本。事务可以读其他站点上的副本,但是不允许对它们更新。
这种复制的重要特性是事务在远程站点上不能得到锁,为了保证运行在副本站点上看到一致的数据库视图,副本应该反映主站点上数据的事务一致性快照。副本应该反映按串行化顺序排列的先于某个事务的事务所做的更新,而不应反映按串行化顺序排在该事务之后的事务所做的更新。
数据库可能配置成在主站点发生更新之后,马上将更新传播到其他站点,或者只是周期性地传播。
主从复制对于分发消息特别有。
在多主副本更新的情况下,更新允许在数据项的任何副本进行,并且自动传播到所有副本。这种模式是用于管理分布式数据库副本的基本模式。事务更新本地的副本,系统透明地更新其他副本。
更新副本的方法是以两阶段提交来实现立即更新或使用有偏协议作为并发控制技术。
许多数据库提供一种“延迟传播”将更新传播到其他站点。以延迟传播为基础的模式运行事务处理(包括更新)即使在站点断开网络时仍能进行,因此提高了可用性。在使用延迟传播时,以下两种方法通常使用:
如果允许死锁发生并依赖于死锁检测,则分布式系统中的主要问题就是决定如何维护等待图。处理这个问题的技术要求每个站点维护一个局部等待图。
在集中死锁检测的方法中,系统在一个单独站点构造和维护一个全局等待图。
链路故障征兆:通过某链路的一个消息进行多次重传,却得不到确认。
网络分割征兆:网络试图为此消息寻找另一条路径,却无法找到。
区分网络链路故障和站点故障时不可能的,任何重构模式必须涉及成能够在网络分割情况下正确运行:
每一个数据对象都存储它的一个版本号来检测它最后一次写入的时间。每当一个事务写一个对象的时候要以如下方式更新版本号:
在事务处理期间的故障也可以容忍。
将单位权授予所有站点来实施有偏协议:设读的法定人数为1,设置写的法定人数为n(所以站点)。在这种情况下,不需要使用版本号。但是,主要容纳数据项的一个站点发生故障,对该数据项的写操作就不能进行。
为了使发生意外故障工作能够进行,我们使用读一个、写所有可用的协议。这样,事务管理器就不等待故障站点恢复而继续工作。
在可能发生网络分割的情况下,使用读一个、写所有可用的模式会导致不一致性。
将修复的站点或链路重建到系统必须小心。故障站点恢复后,必须发起一个过程来更新其系统表,使之能反映该站点停止工作后发生的变化。
一个简单的方法是故障站点重新连入后,暂时让整个系统停止,但是,在大多数应用中不可行。使用一些技术可以在对任意数据项授予读或写锁前,站点必须确保它已经更新称为最新的数据项。如果一个故障链路恢复,两个或更多分区就能重新连接起来。由于网络分割限制了部分站点或所有站点可允许的操作,应该将链路的恢复迅速通知所有站点。
使用远程备份系统时,操作在单一站点上执行,只有数据和日志记录复制到其他站点。特别地,远程备份系统有助于避免两阶段提交及其导致的开销。同时,事务只需和主站点联系,避免了在多个站点运行事务代码的开销。另一方面,通过具有多个可用副本并使用多数协议,复制可以提供更高的可用性。
备份协调器是一个可以在完成其他任务同时,还在本地维护足够信息,使它可以在分布式系统带来最小限度干扰的情况下担负起协调器角色的站点。所有直接发给协调器的消息都会被协调器及其备份收到。协调器和它的备份区别在于,备份不会采取任何影响其他站点的动作,这些动作由真实的协调器进行。
备份方法优点在于它能立即将处理继续下去的能力。避免了分布式系统从协调器故障恢复所需的大量延迟。其缺点在于协调器任务的重复执行带来的开销。
在缺少指定的的备份协调器或者为了处理多种故障时候,可以由那些活跃站点动态地选出新的协调器。选举算法可以使站点以分散的方式选出一个站点作为新的协调器。算法要求系统中每个活跃站点对应一个唯一的标识号。
用于选举的威逼算法:设站点Si的标识号为i。同时假设所选出的协调器总具有最大标识号的站点。当协调器故障时,算法必须选出具有最大标识号的活跃站点。该算法将高号码发送到系统的每个站点。另外,该必须提供一种能使从故障中恢复的站点辨认出当前协调器的机制。
假设站点Si发出的请求在预定时间T内没有得到协调器的回答,这时假设协调器发生故障,Si视图选举自己作为新协调器的站点。站点Si给每个据偶更大标识符的站点发一条选举信息。接着Si等待一个时间间隔T,等这些站点的任何一个回复,如果在时间站点T内没有收到,就假设具有大于i的号码的所有站点都发生故障,于是选举自己,并给具有小于i的标识号的所有站点发消息通知新协调器的站点。如果Si收到回答,就开始一个时间间隔T’来接收通知自己一个具有更大标识号的站点已被选中的消息。如果Si在T’时间内没有收到消息,就假设具有更大标识号的站点发生了故障,站点Si重新开始算法的执行。
当故障站点恢复后,马上开始执行相同算法。如果没有具有更大标识号的活跃站点,恢复后的站点就强迫具有较小数字的所有站点让自己成为协调器站点。如果出现网络分割,威逼算法在各分区选举出一个分离协调器。
代价:
考虑一个查询“找出关系r上所有元组”,关系r可能被分片,复制,也可能既被分片也被复制。如果关系r被复制,我们就需要对副本进行选择。如果所有副本都没有分片,我们就选择使用传输代价最小的副本。但是如果被分片了,需要进行连接算法或并算法来重构关系r。
假设三个关系连接,三个关系既没复制又没分片,且关系r存储在站点S1上,关系s存储在站点S2上,关系k存储在站点S3上。设S1表示提出查询的站点,系统需要在站点S1产生结果。三个策略:
没有一个策略是最好的。
我们假设希望计算表达式r1⋈ r2,其中r1和r2分布存储在站点S1和S2上。令r1和r2的模式分别为R1和R2。假设希望在站点S1上得到结果。如果r2中有许多元组不能和r1中的任何元组相连接,那么把r2送到S1会使我们必须传输对结果无贡献的元组。
一个可能的策略:
当r2中有相对很少的元组对连接有用时,这个策略你优势明显。
一个连接:r1⋈ r2⋈ r3⋈ r4 .
操纵位于异构分布式数据库中的信息需要在已有数据库系统上增加一个软件层。此软件层称为多数据库系统。这些局部的数据库系统可能采用不同的逻辑模型以及数据定义语言和操纵语言,可能在并发控制和事务管理机制上存在差别。多数据库系统构造了逻辑数据库集成的一个虚拟。
将异构系统完全集成为一个同构分布式数据库比较困难:
由于这些原因,多数据库系统带来的显著优势超出了开销。
由于多数据库系统应该要虚拟单一的、集成的数据库系统,必须使用一个公共数据模型。我们一般选择关系模型,并将SQL作为公共查询语言。
模式集成不是数据定义语言之间简单的直接转换。同一属性名可能出现不同的局部数据库但具有不同的意义,某一系统的数据类型可能在另一个系统不被支持,数据的物理表示不同,浮点表示不同,语义层不同。
这些区别必须正确记录到公共全局概念模式中,必须提供转换函数。
一些问题:
通过对每个数据源写包装可以简化任务,包装提供一种全局模式下的本地数据的视图。包装也将全局模式的查询翻译成本地模式的查询,并将执行结果翻译返回到全局模式。包装可以由个别站点提供,也可以分开作为多数据库系统的一部分。甚至用于非关系型数据源提供关系视图,如网页、平面文件、层次和网状数据库以及目录系统。
中介系统是指集成多个异构数据源,提供数据的一个集成的全局视图,并提供在全局视图上的查询工具的系统。不会干扰事务处理。
目录是关于一些类别的对象的信息列表。视为一个特殊形式的数据库,其中信息按照一种分层的形式组织,这种分层形式类型于文件系统中文件组织方式。目录可以分布到多个站点,提供对各个站点的自治。包含到其他目录的指点,有助于建立集成视图,借此查询发送到单个目录,在所有相关目录中透明地执行。
轻便目录访问协议(LDAP)使用最广泛。
为何使用特殊的协议用于访问目录信息:
目录也可以用于验证用户身份。
通常目录系统作为一个或多个服务器实现,它可以为多个客户服务。客户通过使用由目录系统定义的应用程序接口与目录服务器通信。目录访问协议也定义了数据模型和访问控制。
在LOAP目录上存储的是类似于对象的条目。每个条目必须有可区别名称,它唯一地标识了这个条目。DN是由相对可区别名称(RDN)序列组成。
条目也有属性,LDAP提供二进制、字符串和时间类型,还有为电话号码设计的tel类型,为地址设计的PostalAddress类型。与关系模型中属性不同,这里属性默认为多值。
LDAP允许定义带有属性名和类型的对象类,可以使用继承,可以指定条目属于一个或多个对象类。定义条目所属的一个最明确对象类是不必要的。
条目按照它们可区别名称组织成一个目录信息树。树中叶级条目通常表示特定对象。一个结点的孩子具有一个包含父结点所有RDN的DN,和一个或多个附加的RDN。
条目的可区别名称不必存储到条目中;系统可遍历条目的DIT,收集RDN=value成分以产生完整的DN的方式来产生一个条目的DN。
条目可以有多个DN。
LDAP定义了一个用于执行数据的定义和操纵的网络协议。LDAP的用户可以使用应用程序设计接口或者使用工具来执行数据的定义和操纵。LDAP也定义了一种LDAP数据交换格式(LDIF),用于存储和交换信息。
LDAP查询机制简单,只有选择和投影,而没有连接。查询必须指定以下几点:
一个组织机构信息可以分成多个DIT,其中每个DIT存储某些条目的信息。DIT的前缀是RDN=value对的序列,可用于识别DIT存储了什么信息,这些对连接到其余的由遍历从条目到根结点的路径所产生的可区别名称上。
在DIT中的结点可能包含指向另一个结点的引用。
原文:http://www.wzxue.com/archives/170