第七章分布式系统中容错技术Word格式文档下载.docx
- 文档编号:20854132
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:39
- 大小:68.84KB
第七章分布式系统中容错技术Word格式文档下载.docx
《第七章分布式系统中容错技术Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第七章分布式系统中容错技术Word格式文档下载.docx(39页珍藏版)》请在冰豆网上搜索。
高可维护性的系统意味着具有高的可用性。
对于高可维护性系统来说,要求它具有自动检测错误和自动修复的能力。
(5)保密性(security)。
保密性要求系统资源不被非法用户访问。
这方面的内容已经在第四章中作了介绍。
系统失效指的是系统不能提供它所固有的服务功能。
例如,分布式系统是为用户提供一系列服务的,但其中某一个服务或某些服务功能不能完全正确提供时,就说系统失效了。
一般来说,从错误的时间特性来看,错误可分为暂时性的(transient)、间歇性的(intermittent)和永久性的(permanent)。
暂时性的错误一旦发生之后就会消失,当相关的操作重复执行之后,错误就消失了。
间歇性的错误是一会儿出现,一会儿又消失的错误,这种错误是十分令人烦恼的一种错误,因为它十分难于诊断。
永久性错误是一种持续性错误,这种错误一旦出现,将会长时间存在,直到出现错误的部件被修复为止。
像集成芯片被烧坏、软件缺陷、磁盘磁头损坏等都是永久性错误。
7.1.2基本的故障模型
一个处于故障中的系统不能胜任它所应当提供的服务。
在分布式系统中,系统不能胜任它所提供的服务意味着系统中的服务员,通信信道,或者二者都不能完全胜任它们所应当具有的服务功能。
在分布式系统中,错误的检测往往很困难并且很复杂。
例如一个失效的服务员可能不是由这个服务员本身的故障造成的。
如果一个服务员只有依赖于其他的服务员才能充分提供它所具有的服务功能,当一个服务员不能提供它所具有的某项服务或某几项服务时,错误可能是由该服务员本身造成的,也可能是由其他服务员间接引起的。
分布式系统中的各部件的相互依赖性是很普遍的,例如一个硬盘错误可能会导致文件服务员不能提供正常的文件服务。
如果这个文件服务员是一个分布式数据库系统的一个组成部分,那么这个数据库系统的正常工作就处于危险之中,可能会导致数据库系统中只有一部分数据是可以访问的。
所以,了解分布式系统中常见的错误类型是十分必要的。
按照不同的标准,有不同的划分故障类型的方法,Cristian、Hadzilacos和Toueg将分布式系统中故障划分为如表7.1.1所示的几种类型[CRISTIAN,1991;
HADZILACOS,1993]。
表7.1.1分布式系统中故障类型
故障类型
说明
崩溃性故障
服务员停机,但是在服务员停机之前工作是正常的
遗漏性故障
接收性遗漏
发送性遗漏
服务员对输入的请求没有响应
服务员未能接收到输入报文
服务员未能发送出输入报文
时序性故障
服务员对请求的响应不是按特定的时间间隔进行的
响应故障
值错误
状态转换错误
服务员的响应是错误的
服务员给出了错误的响应值
服务员背离了正确的控制流程
随意性故障
服务员在随意的时刻产生了一个随意的响应。
崩溃性故障(crashfailure)一般发生在服务员过早地停机。
正常的情况下,一个服务员停机之前需要发送一些通告性信息,使得系统能够做一些相应的处理,例如重新启动例外一个服务员替换该服务员的服务等。
如果一个服务员在没有发出任何提示信息的情况下突然停机,就会带来一系列的错误。
例如在电源掉电和操作系统的死机的情况下都可以导致崩溃性故障。
通常所提到的节点故障就是属于这种类型。
遗漏性故障(omissionfailure)发生在虽然服务员是活着的,但是对某个服务请求没有响应。
遗漏性故障的第一种情况是服务员收不到输入请求,例如一个服务员在处理某个请求的时候,服务员没有一个线程用来侦听到达的服务请求。
接收性遗漏故障不会改变服务员的当前状态,因为它没有意识到有请求报文发送给它。
发送性遗漏故障发生在服务员对所收到的服务请求进行了服务,但是在发送响应报文的时候出现了故障。
例如,服务员在发送响应报文时,发送缓冲区溢出,而服务员没有处理这种情况的措施。
上述两种遗漏性故障属于我们通常所说的通信故障。
另一种遗漏性故障与软件错误有关而与通信无关,如服务员进入死循环,或者是由于不适当的内存管理,使得服务员程序长时间被挂起。
时序故障(timingfailure)是一种与定时有关的故障。
时序故障发生在服务员对请求的响应超过了特定的时间间隔,特别是在实时系统中,服务员对服务请求的响应太迟缓。
响应故障(responsefailure)是一类比较严重的故障,这类故障是指服务员对顾客的服务请求给出了不正确的响应。
一般来说,响应故障分为两类。
一类是响应值出现错误,即服务员给服务请求的回答信息是不正确的。
例如,我们使用一个搜索引擎在Internet上搜索信息,返回的结果却与我们所给出的搜索引擎无关,这是出现了值故障(valuefailure),即服务员给出了错误的响应值。
另一类响应故障时状态转换错误(statetransitionfailure),当服务员对所收到的服务请求做出了不符合期望的反应时,就会出现状态转换错误。
例如,当一个服务员接收到一个它不能识别的报文,而程序中并没有确定如何处理这样的报文,这时就容易出现状态转换错误。
实际中最严重的一类错误是随意性故障(arbitraryfailure),即我们所熟知的拜占庭故障(Byzantinefailure)。
随意性故障是一种随机性的故障,在正常情况下,服务员不会出现故障,在某些不明因素的影响下,服务员偶尔会对服务请求给出错误的结果,这种错误很难被检测出来。
当一个出错的服务员和其他的服务员一起协同工作时,出错的服务员会影响其他服务员而做出错误的决定。
容错是建立在冗余的基础上的,冗余是设置超过正常系统操作所需要的信息、资源或时间。
下面是典型的四种冗余类型:
(1)硬件冗余。
附加额外的处理器、I/O设备等。
(2)软件冗余。
附加软件模块的额外版本等。
(3)信息冗余。
如使用了额外位数的错误检测代码等。
(4)时间冗余。
如用来完成系统功能的额外时间。
有些研究者将冗余分为三类,即物理冗余、信息冗余和时间冗余[JOHNSON,1995]。
物理冗余可以用硬件冗余的方式或软件冗余的方式来实现,因为硬件和软件在逻辑上是等同的。
信息冗余的一个例子是海明码(hammingcode),使用海明码技术可以纠正信息在传输中产生的错误。
时间冗余的典型例子是原子操作和原子事务处理,原子操作和原子事务处理在执行中如果出现故障,相当于它们没有被执行,系统的状态保持不变,所以它们可以重新执行,只是需要额外的时间。
故障的基本处理方法有三种,它们是:
(1)主动复制。
所有的复制模块协同进行,并且它们的状态紧密同步。
(2)被动复制。
只有一个模块处于动态,其他模块的交互状态由这一模块的检查点定期更新。
(3)半主动复制。
是主动复制和被动复制的混合方法。
此种方法所需的恢复开销相对较低。
主动复制用到了错误屏蔽(failuremasking)的概念,即隐藏出现的故障或防止故障造成错误。
被动复制,又称为动态方法,通过从系统中检测错误的存在,并采取一定的措施移去错误部件来达到容错。
在这一方案中,通过定期检查、自检循环和监视时钟等手段来检测错误。
系统层错误诊断(system-levelfaultdiagnosis)是研究在系统中识别错误部件的方法,对于分布式系统来说,这是一个十分困难的研究领域。
失效的检测可分为外部检测和内部检测两类。
外部检测是指将检测节点失效的职责赋予被检测节点的外部附件。
例如,用另外一个节点A来检测节点B。
如果节点A正常,则假设通过预期的动作节点A能够检测节点B的任何偏差。
如果A出现错误,则其诊断结果是随机的。
内部检测将节点的失效检测机制置于该节点内部,通常检测部件被假定为一个可以完全信赖的“硬核”(hardcore)。
通过内部检测和外部检测的联合应用可以得到有效的错误检测方案,例如编码技术就是这样的错误检测方案,它为数据总线、存储器和寄存器提供了低成本的错误检测方法。
7.2容错系统的基本构件
容错系统的基本构件有三种:
坚固存储器(stablestorage)、故障—停止处理器和原子操作。
7.2.1坚固存储器
坚固存储器(stablestorage)是对一个可以经受系统失效的特定存储器的逻辑抽象,也就是说,坚固存储器里的内容不会被一个失效所毁坏。
系统失效之后需要恢复到以前的状态,以前的状态信息需要能够安全地存储,以便需要的时候能够恢复。
这里的安全意味着恢复信息能够在发生进程崩溃、节点实效、甚至是存储介质发生各种失效的情况下,也能够生存下来。
坚固存储器在分布式系统的恢复中担当着重要的角色。
存储器按坚固性分为三类。
第一类是RAM,它在掉电和机器崩溃的情况下会丢失所存信息。
第二类是磁盘存储器,它在掉电和机器崩溃的情况下,能够维持已经保存的信息,但是当磁头损坏时,会丢失所存信息。
最后一类是坚固存储器,除非发生诸如洪水、地震等灾难性的事件,它所保存的数据可以在发生其他任何事故的情况下生存下来。
坚固存储器可以用一对普通磁盘来实现。
实际的磁盘在进行读和写操作时可能崩溃,而且,即是一个磁盘块被正确地写好之后也有一种很小的可能性使这块数据遭到破坏。
这种自发的块污染在预先给定的时间T内出现两次的概率更小,可以忽略。
在处理实际磁盘时,系统软件必须能指出所读的块是否有效,这可用检查和或者其他办法做到。
坚固存储器中的每一个块由两个独立的磁盘块组成,分别位于不同的驱动器上,使得它们同时由于硬件故障受到损坏的机会最小。
坚固存储器的算法保证至少有一块总是有效的。
每一块进行写操作时,都紧跟一个读操作验证写得是否正确。
两块中有一个出错或失效时,则由另一块修正或代替。
上述实现坚固存储器的技术称为磁盘镜像(diskshadowing)技术。
另一种实现坚固存储器的方法是使用廉价磁盘冗余阵列(redundantarraysofinexpensivedisks-RAID)。
RAID是通过运用位交错技术将数据分布到多个磁盘中,从而提供高I/O性能。
可以用一个或几个磁盘来检测或屏蔽错误,RAID与传统磁盘相比有显著的优点,并可承受多个失效[ALVAREZ,1997]。
7.2.2故障—停止处理器
当一个处理器失效,最可能的是它不进行任何不正确的操作,并且简单地停止运行。
这样的处理器被称为故障—停止处理器[SCHLICHTING,1983]。
当出现一个故障时,故障—停止处理器会有以下效果:
(a)处理器停止运行;
(b)易失性存储器的内容丢失,而坚固存储器不受影响;
(c)任何其他处理器均可以检测到故障—停止处理器的失效状态。
如果一个处理器不是故障—停止处理器,我们可以通过一个仔细设计的程序使它变成故障—停止处理器[SCHNEIDER,1984]。
假如现有一个可靠的坚固存储器、一个可靠的存储处理器(控制存储媒介的处理器)以及k+1个处理器,将它们转变成故障—停止处理器的方法如下:
k+1个处理器中的每一个都运行同样的程序并通过存储处理器访问同一个坚固存储器。
如果任何一个请求是不同的,或者任何一个请求没有在指定的期间到达,则意味着检测到一个失效事件,因而应该丢弃所有请求。
因为系统表现为一个故障—停止处理器,这一方法产生一个k—故障—停止处理器,除非系统中k+1个或更多的部件失效。
7.2.3原子操作
一个原子操作就是由硬件独立执行的一系列动作。
也就是说,每一个动作或者被完全彻底地执行,或者所有的动作根本没有执行,系统的状态保持不变。
原子操作中的每一个动作都是孤立的,当执行这一动作时,在进程中感觉不到外界活动的存在,也意识不到外界状态的变化。
与此相似,任何外界的进程均感觉不到一个孤立的原子操作的内在状态的变化。
这就是所谓的原子操作的“全有或全无”的性质,即一个原子操作要么全部完成,要么在执行过程中出现错误的时候相当于根本没有执行。
在第八章中对原子操作进行了详细描述。
7.3节点故障的处理
节点故障的处理的基本方法有基于软件的和基于硬件的两种方案。
由于软件和硬件在逻辑上是等同的,这里仅讨论基于软件的方案。
在基于软件的方案中,一系列同样的进程被复制并被分配到不同的处理器中执行。
冗余的类型取决于故障的处理方法和故障的特性。
对于永久性的故障,常用硬件冗余的方法来屏蔽;
而对于暂时性的故障,常通过时间冗余的方法进行重试。
当使用主动复制的方法时,通常使用N-模块化冗余(NMR)。
例如在3-模块化冗余(TMR)中,同样的进程被复制三遍来对输出结果做出整体表决。
如果其中的一个处理器出现故障,则其余的两个拷贝在执行整体表决时就会屏蔽故障处理器的结果。
然而,在分布式系统中使用主动复制的方法相对比较昂贵。
在被动复制中可以使用向前式恢复和向后式恢复。
在向前式恢复中,假定可以完全准确地得到系统中的故障和损失的性质,这样就有可能去掉这些故障从而使得系统继续向前执行。
向后式恢复适用于系统的故障无法预知和去掉的情况,在这种情况下,要定时地存储系统的状态,这样当失效导致系统处于不一致的状态时,系统可以恢复到从前没有发生故障的状态,在此状态下重新执行。
7.3.1向后式恢复
尽管向前式恢复比向后式恢复简单,但它的要求十分苛刻。
向后式恢复的通用性使它向分布式系统提供了一个通用的恢复机制。
在向后式恢复中进程被恢复到一个先前的正确的状态。
进程执行中的一些点被称为“检查点”(checkpoint),在以后发生错误的情况下,进程可以被恢复到这些点。
当一个活动模块为一个进程或一个处理器时,有两种方法来保存检查点:
(1)每一个检查点被组播到每一个被动模块;
(2)每个检查点被存储在它的本地坚固存储器中。
通常检查点被存储在坚固存储器中。
由于坚固存储器保证存储在其中的信息的稳定性和永久性,所以其中的信息不会丢失。
当进程正确地从一个旧的检查点运行到一个新的检查点时,旧的检查点就要被新的检查点替换。
当进程执行到两个检查点之间时发生错误,那么进程应该卷回到旧的检查点处重新执行。
当使用新的检查点替换旧的检查点的过程中,系统也会发生失效。
这可以通过检查点的原子更新过程来解决,也就是说,在检查点的更新中,要么旧的检查点被新的检查点替换,要么旧的检查点被完整地保留。
Sequoia中通过使用两个检查点库来实现检查点的原子更新[BERNSTEIN,1988]。
假设系统状态最初被存储在内存中,并将被复制到坚固存储器中。
有两种检查点库:
在检查点更新的过程中,A库用于存放旧的检查点,B库用于存放新的检查点。
A库中检查点更新完毕后,进行B库中检查点的更新。
当整个检查点更新过程完成后,A库和B库中的内容都被新的检查点取代。
在后面的操作中,这两个库的角色可以轮换。
在刷新之前和刷新之后,在库中各写入一个固定的时间戳(刷新前:
A库Ta1,B库Tb1;
刷新后:
A库Ta2,B库Tb2)。
由于这四个时间戳是顺序写入的,通过不同的时间戳就描述了一个失效。
表7.3.1表示了如何通过这四个时间戳来描述一个失效。
很明显,如果这四个时间戳相等,则在形成检查点的过程中没有失效发生。
如果只写下了Ta1,则失效发生在向库A刷新的过程中;
也就是说,在库A中的新的检查点是不完整的。
在这种情况下,必须将B库中的检查点拷贝到库A中,那么恢复的进程将重新运行到旧的检查点。
当处理器出现永久性故障时,就需要对这些故障处理器进行替换。
通常有一套后备的处理器,叫做“后备组”(backupgroup)。
在被动复制中每一个活动模块都至少配备了一个后备的处理器[ZHANG,1990],一个n-后备组在所有时间里都保持有n个后备处理器。
如果该后备组发现它的处理器的数量不足,它将补充新的后备处理器。
在这一方案中,通过坚固存储器,每一个被动模块单位在一个活动模块崩溃后,都将从坚固存储器中获得检查点。
表7.3.1识别在检查点更新过程中发生的失效
条件
失效
措施
Ta1=Ta2=Tb1=Tb2
没有
Ta1>
Ta2=Tb1=Tb2
在刷新库A的过程中失效
将库B复制到库A中
Ta1=Ta2>
Tb1=Tb2
库A刷新完成之后,库B开始刷新之前失效
将库A复制到库B中
Ta1=Ta2=Tb1>
Tb2
在刷新库B的过程中失效
当处理器出现暂时性故障时,就不需要对这些处理器进行替换。
在系统恢复过程中,每个进程均需要重新记录到它最近的检查点上,进程修改的数据也要重新记录到适当的状态。
在这种情况下,进程仍在同一处理器下运行。
向后式恢复除了使用检查点方案外,还有一个基于影像页面技术的方案。
在基于影像页面技术的方案中,当进程需要修改一个页面时,系统复制该页并保留在坚固存储器中。
系统中每个页面都有两个拷贝,当进程在执行的过程中,只有其中的一个拷贝被进程修改,另一个拷贝就作为影像页面。
如果进程失效,则丢弃被修改的拷贝,系统根据影像页面进行恢复。
如果进程成功运行,则每一份影像页面被相应的修改后的页面替换。
7.3.2向前式恢复
因为在主动复制中,大多数分布式算法都是非确定性的,一个进程的所有拷贝均需要以一种可识别的方式解决其非确定性。
向前式恢复方案[AVIZIENIS,1985;
PRADHAN,1992]是半主动复制的一个特例。
在这个方案中,通过对两个活动模块的不匹配比较,或通过一个3—模块冗余(TMR)在三个活动模块中表决启动一个确认步骤,就可以检测半主动复制的失效位置[HUANG,1998]。
然而,所有参与的处理器都继续执行进程,只用一部分空余来检测这些具有分歧的处理器中哪一个结果是正确的。
一个向前式恢复策略是一种回卷的前瞻性运行。
一个进程或任务的初始拷贝由不同的处理器来运行。
这些版本的结果在检查点进行表决或比较,如果表决结果是成功的,则可以获得一个储存在坚固存储器中的正确结果。
在这个结果的基础上,再执行下一项任务的拷贝。
另一方面,如果表决结果是失败的,就基于以前任务的每一个结果执行下一项任务的拷贝,与此同时,对以前的任务进行一次回卷执行。
也就是说,在后备处理器上再运行以前的任务,目的是获得正确的结果。
通过这种方式避免了在回卷运行上浪费时间。
尽管在所有版本都失效(所有结果都不正确)或者重新运行以前的任务也不能获得正确结果的情况下,回卷运行是不可避免的,但由于利用了现存的正确结果而不必从头重新开始,还是节省了回卷时间。
图7.3.1(a)显示了由Pradhan和Vaidya提出的向前式恢复方案[PRADHAN,1992]。
其中Ii,Ii+1和Ii+2是检查点间隔。
两个进程X和Y均运行一个进程的同一个版本。
在每一个检查点之前,需要对它们的结果进行比较并确认是否正确。
S代表对两个间隔Ii和Ii+1进行验证的后备处理器。
有以下四种可能的情况:
(1)没有并发重试。
X和Y都在间隔Ii正确运行。
(2)有非回卷的并发重试。
这种情况发生在当单个处理器(X或Y)有错误但在连续的两个检查点间隔中没有错误的情况下。
也就是说,在Ii中出现了错误,但在两个合法的检查点间隔Ii+1和Ii+2中间没有错误。
(3)在一次并发重试的间隔后进行回卷。
该情况下重试不成功,系统卷回到Ii的开始处。
这种情况对应于在Ii中当两个进程均在同一个检查点间隔Ii处有错误的情况(尽管S的Ii确实发生在X和Y的Ii之后)。
注意,在该情况下X和Y均通过两个检查点间隔回卷,并且是发生在当后备处理器完成了一个合法的检查点间隔之后。
如果我们用(Xi,Yi,Si)代表在间隔Ii之中X、Y和S的状态,并且用0代表错误,1代表正确,d代表没有关系(也就是说,或者错误或者正常),那我们就得到三种情况:
(1,0,0),(0,1,0),(0,0,d)。
这三种情况是在一次并发重试的间隔后进行回卷。
(4)在并发重试的两次间隔之后回卷。
该情况下在检查点间隔Ii+1处出现了一个额外的错误,系统卷回到间隔Ii+1的起始处。
如果我们用(Xi,Yi,Si,Xi+1,Yi+1,Si+1)代表在间隔Ii和Ii+1中X、Y和S的状态,这种情况对应于以下描述的四种情形:
(1,0,1,d,d,0),(1,0,1,0,d,d),(0,1,1,d,d,0),(0,1,1,d,0,d)。
在该情况下,在当后备处理器完成了两个合法的间隔之后,X和Y均通过两个间隔点回卷到Ii+1。
X
Ii+2
Ii+1
Ii
Y
S
验证间隔2
验证间隔1
(a)
副本
验证间隔
图7.3.1两个向前式恢复方案:
(a)有两个验证间隔,(b)有一个验证间隔
图7.3.1(b)显示了由Long、Fuchs和Abraham提出的向前式恢复方案[LONG,1992]。
在此方案中,在Ii之后的发散处理器自身在X和Y的间隔Ii+1中间进行二重复制,用以确保两个处理器继续被二重复制。
在S的Ii的验证步骤的结尾,对二重复制的拷贝进行比较,用以确保在X和Y的间隔Ii+1中间没发生错误。
在Pradhan和Vaidya的方案中,用第三个处理器来执行验证步骤。
因为在验证步骤中,运算没有进行二重复制,所以处理器X和Y可能发生分歧。
所以,自身可能在间隔Ii中发生错误的后备处理器必须进行第二次验证(S的Ii+1)。
这个验证是在间隔Ii之后,检验正确的处理器X或Y在间隔Ii+1的正确性。
与Long、Fuchs和Abraham的方案中提出的在一个验证期间使用5个处理器相比,Pradhan和Vaidya的方案中提出的在两个间隔验证期间使用3个处理器。
Hang、Wu和Fernandez通过在n个版本中进行表决,而不是在两个版本之间进行比较,从而扩展了向前式恢复检查点的概念[HUANG,1998],并讨论了可靠性优化的问题。
一般说来,一个(n,m)-图代表正常运行的n-版本和进行验证的m-版本。
Long、F
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 分布式 系统 容错 技术