通用的基于递归微重启技术的快速自恢复方法

文档序号:6460670阅读:193来源:国知局
专利名称:通用的基于递归微重启技术的快速自恢复方法
技术领域
本发明涉及一种计算机任务关键系统的快速自恢复方法,尤其是基于重启技 术的任务关键系统快速自恢复方法。
(二)
背景技术
随着任务关键系统功能的R益强大,其结构也越来越复杂,不可避免的bug (程序缺陷)也越来越多。完全消除bug已成为不可能,但是人们对任务关键系 统不间断运行的要求却并没有降低。因此,如何在系统失效后快速得恢复已成为 学术界与业界的研究的重点。
'系统恢复方法有很多,而其中最简单有效的非重启莫数。而传统的宏重启无 论系统出现什么故障,都对整个系统进行重启,耗费很多无谓的资源与时间。在 宏重启的基础上,George Candea等人在ROC (面向恢复计算)框架下提出了微 重启的概念。微重启是这样定义的当系统发生失效时,只重启失效的组件,若 未能解决问题,则根据递归恢复图逐层扩大重启范围,直至问题解决或宏重启。 这种方法只重启失效的组件,而避免了宏重启中需要同时重启健康组件需花费的 额外开销,降低了系统的平均恢复时间,提高了系统的可用性。
微重启提出至今已经有八年时间,但是国内外相关研究并不多。比较有代表 性的文章只有《Improving availability with recursive microreboots: a soft-state system case study》(Performance Evaluation, v 56, n 1-4, March, 2004, p 213-248),(译《应用微重启提高可用性 一个软状态系统案例研究》 (性能评价期刊第56巻,l-4期,213-248页,2004年3月))以及《JAGR: An Autonomous Self-Recovering Application Server》 (Proceedings of the Autonomic Computing Workshop. Fifth Annual International Workshop on Active Middleware Services. AMS 2003, p 168-77)(译:《JAGR: —种自治自 恢复的应用服务器》(自律计算会议第五次关于现役中间件国际会议。AMS2003, 168-77页))两篇提出了具体的微重启方法。但是,前者提出的微重启方法只 适用于具体的系统,不具有通用性,且未实现递归微重启,对每个失效组件只执行单次的重启动作。而JAGR文章中提出的方法需修改jboss服务器(一种开源 的J2EE应用服务器),依赖于jboss服务器的特性实施重启,且只对部署于jboss 服务器的java应用程序有效。其他的文章都是针对现有方法提出的一些系统模 型和约束条件等。目前文献可考的微重启实验有Merxury卫呈地面接受站系统, JAGR项目和RUBiS (—个模仿eBay的拍卖网站)实验。实验数据表明,微重启 技术可以使系统从瞬时失效中快速恢复,降低了系统平均恢复时间。微重启只是 一种概念,其实现方法并不唯一,现有的微重启方法仍有很多缺点。如对目标系 .统的限制较多,要求目标系统组件化,组件无状态,并且组件间松耦合;只针对 java编写的软件或j2ee服务器实施,不具备跨语言的通用性;实现方法较复杂, 如需修改jboss服务器等。
发明内容
本发明的目的在于提供一种具有跨语言通用的、对目标系统基本无限制的、 简单实用的通用的基于递归微重启技术的快速自恢复方法。
本发明的目的是这样实现的
本发明形式化的表述为一个四元组R=(S,E,C, W),其中SHs,,S2…,5 }是指 系统中可微重启元素的集合;E—E,,E2,…,EJ是各可微重启元素所有能触发微重 启行为的异常集合;C={T, Nr)是指微重启执行条件判定的集合,包括执行时间 T和重启次数Nr; W是指微重启中的相应动作,W: SXEXC—W;其工作流程
如下 ,,
a) 将系统中可能产生异常的地方包装成可微重启元素Si;
b) 若可微重启元素在执行过程中发生异常e,若eEEi,其中 Ei= (exc印tioriii, exceptioni2,…,exceptionin}是该元素i所定义的微 重启触发异常的集合,则捕获异常e,对该元素进行重启操作;
c) 设该元素正常执行时间为Tn,取系统最大容忍执行时间SysTime=A Tn, 其中A为正整数,用户可根据需求自行定义A,若该元素执行时间 Te〉SysTime,则认为该元素响应缓慢,对其执行释放资源操作;取用户 最大容忍执行时伺USerTirae= & Tn,其中^为正整数,用户可根据需 求自行定义&,若该元素执行时间TeH)serTime,则释放资源,重启该 元素,其中&〉 A;d) 若可微重启元素重启次数Nr〉A,其中A为正整数,若用户可根据需求自 行定义A仍未解决问题,则将异常抛向上层,进行更大范围重启,转步 骤a),依次递归;若重启至宏重启层次仍未解决,则通知管理员;
e) 若该元素正常执行完毕,则程序正常向下执行。
本发明的基于微重启的任务关键系统快速自恢复方法适用于有异常捕获机 制的语言编写的任务关键系统,而不论其面向过程或是面向对象。可用该方法对 现有系统进行改造使其具有可微重启特性,也可作为规则直接丌发具有可微重启 特性的系统。
相对于现有微重启方法,本发明的优点有(1)本方法适用于所有提供异常 处理机制的语言编写的任务关键系统,实现了跨语言的通用性(已成功实验于 vb6. O平台,vb. net平台,jdkl. 5和vc6. 0平台),而现有方法只针对Java编 写的系统;(2)不同于现有的微重启方法,不依赖于具体的应用服务器,在(1) 的基础上,可应用于各种层次和形式的任务关键系统。现有方法中,mercury实 验中的方法只针对特定系统有效,JAGR实验中的方法需依赖于jboss服务器的 特性,且只对部署于jboss服务器上的应用程序有效;(3)不同于现有的微重启 方法,不要求系统组件化,不要求组件间松耦合,对系统限制较少;(4)现有微 重启方法只实现了无状态组件的微重启,本方法可只用较少开销完成可微重启元 素间的状态传递。
(四)


图1为示例程序的重启树。 图2为本方法的流程图。
具体实施方式
下面结合附图举例对本发明做更详细地描述
本发明是一种通用的基于递归微重启的任务关键系统快速自恢复方法,针对 系统瞬时失效,不需人为干预地对失效元素进行重启恢复。本方法可以形式化的 表述为一个四元组R=(S,E,C, W),其中S^&,S2…,sJ是指系统中可微重启元素 的集合;E^E,,E2,…,EJ是各可微重启元素所有能触发微重启行为的异常集合; C={T, Nrl是指微重启执行条件判定的集合,包括执行时间T和重启次数Nr; W 是指微重启中的相应动作,SXEXC—W。其工作流程如下f) 将系统中可能产生异常的地方包装成可微重启元素S,,其形式类似于 Java中置于无限循环中的try-catch-finally结构,具体方法将结合代 码与附图详细说明;
g) 若可微重启元素在执行过程中发生异常e,若eEEi,其中 Ei= {exceptionu, exception",…,exception^是该兀素i所定义的微 重启触发异常的集合,则捕获异常e,对该元素进行重启操作;
h) 当可微重启元素较大时,可能会发生该元素执行时间过长,造成系统运 行缓慢的问题。设该元素正常执行时间为Tn,取系统最大容忍执行时间 SysTime=A, Tn (其中A为正整数,用户可根据需求自行定义A,),若该 元素执行时间Te〉SysTime,则认为该元素响应缓慢,对其执行释放资源 操作;取用户最大容忍执行时间UserTime= & Tn (其中^为正整数, 用户可根据需求自行定义&),若该元素执行时间Te〉UserTime,则释放 资源,重启该元素,其中&〉 A/;
i) 若可微重启元素重启次数Nr〉A(其中A为正整数,在重启时可微重启元 素可能会有资源尚未同步准备好,所以重启一次不一定能解决问题,用 户可根据需求自行定义《仍未解决问题,则将异常抛向上层,进行更 大范围重启,执行a) d),依次递归;若重启至宏重启层次仍未解决, 则通知管理员;
j)若该元素正常执行完毕,则程序正常向下执行;
所述的基于微重启的任务关键系统快速自恢复方法适用于有异常捕获机制 的语言编写的任务关键系统,而不论其面向过程或是面向对象。可用该方法对现 有系统进行改造使其具有可微重启特性,也可作为规则直接开发具有可微重启特 性的系统。
面向对象的可微重启元素Java示例部分代码如下 num=0;
while(true){ try { num++;
if(num==5) break;begin=System. currentTimeMillis(); 〃采用计时器框架对元素进行周期性监视 timer = new Timer(true); timer, schedule(new Java. util. TimerTask() { public void run() {new CheckTime (finish, begin) ; } }, 200,20); ……〃功能代码块; f inish=true;if (release) 〃代码段执行时间若大于系统最大容忍值则抛出异常throw new OverflowTimeException(); if (restart) 〃代码段执行时间若大于用户最大容忍值则抛出异常 throw new Exc印tion(); break:catch(OverflowTimeException ote) {//超出系统最大容忍时间 释放资源操作; break;catch(Exception e) { continue;finally {……〃一些必须执行的操作,如关闭数据库连接,关闭输入流,输 出流等。timer, cancel (); restart二false; release=false; finish二false; if(num==5) {throw new E)(c印tion();〃重启至限定次数,将异常抛向外层以下为java示例中的监视器代码:public static class CheckTime{public CheckTime(boolean finish, long begin) long now二System. currentTimeMillis0 ; if ((now-begin) <=Use:rMaxTinie) { if(finish) {if ((now-begin)〈SysMaxTime) return; else release二true;〃释方文资源else { restart二true;〃重启以下为面向过程的Vb6. 0代码示例:Sub example 0num 二 0restart: On Error GoTo err finish = False release = False restart 二 False If num 〉 0 Then EndCountEnd Ifnum = num + 1 If num = 5 ThenGoTo err—OUT '重启至限定次数,将异常抛向外层 End Ifbegin = GetTickCount'采用计时器框架对元素进行周期性监视ITimelD = timeSetEvent (20, 0, CheckTime, 1, 1) ……'功能代码块 finish = TrueIf release = Ture Then '代码段执行时间若大于系统最大容忍值则抛出 异常……'超出系统最大容忍时间释放资源操作 End IfIf restart = Ture Then '代码段执行时间若大于用户最大容忍值则抛出 异常GoTo err End If End Subgit:……'一些必须执行的操作,如关闭数据库连接,关闭输入流,输出流 等Resume restart err_0UT: Resume restart_0UT ,抛向夕卜层Sub CheckTime()'监视器函数 now = GetTickCountIf (now - begin) <二 UserMaxTime Then If finish = Ture ThenIf (now - begin) 〈 SysMaxTime ThenReturn Elserelease = True '释方夂资源 End If End IfElserestart 二 True '重启 End If End Sub下面为可微重启元素的0++示例代码void checktime (bool finish, long begin) {//监视器函数 long now 二 GetTickCount0 ; if((now-begin) <二 UserMaxTime){ if (finish){if((now-begin) 〈 SysMaxTime) return;6lS6release 二 true;〃释方夂资源else {restart = true;〃重启else {restart=true;DWORD WINAPI TimerProc( 〃监视器线程 LP丽D lpPar謙ter ) { Sle印(200); while(true){ Sle印咖;checktime(finish, begin); return 0;num=0;while(true){ try {restart=false; release=false; finish=false;-num++;if(num==5) break; begin=GetTickCount(); 〃对元素进行周期性监视 HANDLE hTreadl;hTreadl=CreateThread(NULL, 0, TimerProc, NULL, 0, NULL);〃创建新线程……〃功能代码块; finish=true;if (release) 〃代码段执行时间若大于系统最大容忍值则抛出异常throw OverflowTimeExc印tion();常i f (restart) 〃代码段执行时间若大于用户最大容忍值则抛出异throw Exception(); break;catch(OverflowTimeExc印tion ote) { 〃超出系统最大容忍时间 释放资源操作; break;catch(Exception e) { if (n,二二5) {throw new Exc印tion();〃重启至限定次数,将异常抛向外层continue;以上为本方法的java、 vb6.0以及(^++代码实现,其中可微重启元素的正常 时间为200毫秒,系统最大容忍时间设为300毫秒,用户最大容忍时间设为500 毫秒。以上示例的完整代码都已经过实验验证,证明本方法可以实现不同语言编 写的软件系统的递归重启恢复,证明了本方法的通用性,以及本方法可以提高系 统的自恢复性能及可用性。
权利要求
1、一种通用的基于递归微重启技术的快速自恢复方法,其特征是其形式化的表述为一个四元组R=(S,E,C,Ψ),其中S={s1,s2…,sn}是指系统中可微重启元素的集合;E={E1,E2,…,En}是各可微重启元素所有能触发微重启行为的异常集合;C={T,Nr}是指微重启执行条件判定的集合,包括执行时间T和重启次数Nr;Ψ是指微重启中的相应动作,ΨS×E×C→Ψ;其工作流程如下a)将系统中可能产生异常的地方包装成可微重启元素si;b)若可微重启元素在执行过程中发生异常e,若e∈Ei,其中Ei={exceptioni1,exceptioni2,…,exceptionin}是该元素i所定义的微重启触发异常的集合,则捕获异常e,对该元素进行重启操作;c)设该元素正常执行时间为Tn,取系统最大容忍执行时间SysTime=k1·Tn,其中k1为正整数,用户可根据需求自行定义k1,若该元素执行时间Te>SysTime,则认为该元素响应缓慢,对其执行释放资源操作;取用户最大容忍执行时间UserTime=k2·Tn,其中k2为正整数,用户可根据需求自行定义k2,若该元素执行时间Te>UserTime,则释放资源,重启该元素,其中k2>k1;d)若可微重启元素重启次数Nr>k,其中k为正整数,若用户可根据需求自行定义k仍未解决问题,则将异常抛向上层,进行更大范围重启,转步骤a),依次递归;若重启至宏重启层次仍未解决,则通知管理员;e)若该元素正常执行完毕,则程序正常向下执行。
全文摘要
本发明提供的是一种通用的基于递归微重启技术的快速自恢复方法。其形式化的表述为一个四元组R=(S,E,C,Ψ),ΨS×E×C→Ψ;其工作流程包括将系统中可能产生异常的地方包装成可微重启元素s<sub>i</sub>;若可微重启元素在执行过程中发生异常e,若e∈Ei,则捕获异常e,对该元素进行重启操作;设该元素正常执行时间为Tn,取系统最大容忍执行时间SysTime=k<sub>l</sub>·Tn,若该元素执行时间Te>SysTime,对其执行释放资源操作,若该元素执行时间Te>UserTime,则释放资源,重启该元素;若可微重启元素重启次数Nr>k,则将异常抛向上层,进行更大范围重启;若重启至宏重启层次仍未解决,则通知管理员;若该元素正常执行完毕,则程序正常向下执行。本发明提高了系统可用性,同时降低了系统平均恢复时间。
文档编号G06F11/14GK101320343SQ20081006494
公开日2008年12月10日 申请日期2008年7月18日 优先权日2008年7月18日
发明者吕宏武, 王慧强, 董玺坤 申请人:哈尔滨工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1