摘 要:针对敏感行业中分布式应用的容错需求问题,分析介绍Agent、多Agent系统和容错中间件技术,根据Agent和中间件特性结构上的相似性,对利用多Agent技术构建容错中间件作了尝试,并着重研究了失效检测与恢复系统;建立局部检测与全局检测互相结合的双层失效检测模型,提出融入定点恢复和异机恢复的改进型REDO失效恢复策略;最后给出基于JADE的一个系统实现。实验结果显示双层检测模型和改进型REDO恢复策略是可行的、高效率的。
关键词:多Agent系统(MAS);容错中间件;失效检测;失效恢复;JADE平台
容错中间件[1-2]是一个可为开发者提供分布式应用容错支持的开发平台。容错中间件将容错逻辑从应用逻辑中分离出来,为容错应用开发提供框架支持,简化业务应用开发,同时使开发过程变得清晰。目前,容错中间件的研究和实现主要是基于分布对象。国外主要产品有:基于JavaRMI的Arjuna系统,FilterFresh系统等;基于DCOM的COMERA系统;基于CORBA的OGS系统,Enteral系统等。国内方面主要有国防科学技术大学研发的分布应用容错计算平台StarFT。
中间件包括平台功能,自身具有自治性、自主性、隔离性、社会化、激发性、主动性、并发性、认识能力等特性,是近似于Agent的结构,因此利用Agent来建立容错中间件是一个不错的选择。
失效检测[3]与恢复是实现容错的核心问题。检测到失效是容错恢复的前提,因此,失效检测是实现容错不可或缺的一部分。失效恢复是容错的目标,也是容错技术提高系统效率的关键所在。
本文在分析介绍Agent[4]和多Agent系统[5-9]之后,给出了容错中间件中的失效检测模型和恢复策略,最后讨论了基于JADE[10-12]的系统实现。
1 相关技术
1.1 Agent的定义及其结构
Agent(代理)概念起源于人工智能领域,是指用于模仿人类能力的自主实体,驻留在某一环境下能持续、自主地发挥作用。Agent的基本结构如图1所示。
Agent一般具有自主性、反应性、交互性、协作性、主动性和智能性等特性。但在实际的系统中,Agent并不能保证具有以上的全部特性。
1.2 多Agent系统
多Agent系统是由多个Agent组成的一个社会整体,不同的Agent可以控制或影响环境的不同部分,多个Agent可以通过Agent通信语言进行交互,分工合作,实现更为复杂、单个Agent无法解决的问题。多Agent系统可以有效地解决数据、控制具有分布性的问题,并能提高系统的效率和鲁棒性。
1.3 容错技术
使得系统在部分节点失效或是部分对象崩溃的情况下仍能正常运行并得到预期结果的技术称为容错技术。软件容错借鉴硬件容错的成功经验,经常采用冗余技术进行处理。软件容错方法主要有错误回卷恢复、恢复块、N版本软件。
错误回卷恢复主要分为两大类:基于检查点的错误回卷恢复、基于日志的错误回卷恢复。基于检查点的错误回卷恢复的核心思想是任务执行过程中设置检查点,发现失效时不需要从头开始运行,而是直接从最后一个成功执行的检查点往下执行。基于日志的错误回卷恢复则是在判断失效发生后,利用发生失效前最近的检查点和日志信息完全重新运行作业的过程。
恢复块的主要思想是:系统被划分成若干恢复块,整个系统由这些恢复块组成。每个块包含一个首要执行模块和一些替换模块。若首要执行模块输出结果验收失败,则调用第二个模块;若再次失败,则继续调用另外的替换模块。重复该操作,直到所有模块均被调用,或超出时间限制。
N版本软件的方法与硬件容错的NMR方法类似。N(N>=2)个以不同方式实现的功能相同的模块同时执行,由表决器判定正确的结果,作为模块的结果。
2 失效检测
2.1 失效检测模型
本文设计的失效检测系统主要由两部分组成:局部检测Agent,LDA(Local Detector Agent)和全局检测Agent,GDA(Global Detector Agent)。LDA驻留在各节点,负责所驻留节点中实体的检测工作;GDA负责各LDA及其所驻留节点的检测工作。设计的检测模型如图2所示。
各部分详细描述如下:
检测对象:需要进行检测的实体,可以是一个应用程序对象、也可以是一个进程、甚至是一个Agent;任何检测对象在启动时均需向LDA注册。
LDA:每个工作中的节点均驻留有一个专属的LDA,负责所属节点中检测对象的检测及在发现失效时给出通告;任何LDA必须成功注册到GDA后才能开始工作。
GDA:整个系统只有一个GDA,GDA驻留在主控节点,主要负责对各LDA的失效检测、分类及通告的工作。
失效处理器:接收来自LDA或GDA的失效通告,对失效进行处理。
2.2 局部检测Agent
LDA必须成功注册到GDA后才能开始工作,若注册失败,允许重启,当重启次数超过设定阈值(比如3次)则给出警告,提请系统管理员介入,查看是否LDA程序出现错误。
任何检测对象在启动时都需要向该节点所属LDA注册,LDA根据各检测对象的注册信息建立并维护检测对象及其状态等信息的状态表。流程如图3所示。
LDA定时对状态表中各检测对象执行失效检测算法,然后更新状态表,并在发现失效对象时通告失效处理器。执行流程如图4所示。
失效检测主要有两种模式:心跳模式,或称“推”模式;轮询模式,或称“拉”模式。“推”模式的思想是:被检测实体定时向检测器发送心跳信息,检测器在一段设定的时间内没收到心跳信息,则判定实体失效;“拉”模式则为:检测器定时向被检测实体发送询问信息,被检测实体应答检测器以申明自己未失效,检测器在发出询问后一段设定的时间内没收到应答,则判定实体失效。本文采用的测试模式是“拉”模式,在一个检测间隔里完成对所有检测对象的询问及应答的接收或失效的判断。如果检测间隔太短,将无法正确处理对所有对象的检测;而如果检测间隔太长,则无法及时发现失效。因此,检测间隔的设定需要一个综合的折中考虑。
2.3 全局检测Agent
整个系统只有一个GDA,GDA驻留在主控节点,主要负责对各LDA及其所在节点的失效检测工作。如LDA维护检测对象的状态信息表一般,GDA根据各LDA注册信息创建并维护针对LDA的状态信息表。由于GDA与LDA一般驻留在不同节点,检测时需要进行远程通信,当发现LDA失效,需要进一步识别失效类型。主要失效类型有:LDA失效;通信失效;LDA所在节点失效。
3 失效恢复
3.1 恢复策略
本文主要采取的恢复策略是REDO策略,即检测对象失效时,由失效处理器根据接收到的失效通告重启该对象。在此基础上针对一些比较特殊的检测对象,执行更为符合其需求的恢复方法。
对于大数据量处理的对象,其执行可能涉及成千上万的数据库记录,如果只是简单的REDO,则已经处理过的记录将会全部被再次处理,造成性能的重大浪费。因此,可以建立该对象的执行日志,维护该对象成功处理的记录条数或是序号;当该对象需要被恢复时,根据执行日志直接从最后成功处理的记录往下执行,也就是对该对象进行定点恢复。采用定点恢复将大大的提高系统的性能,避免大量时间的浪费。
对于在同一节点多次失效的对象,则可以考虑在另外的节点重新启动,称为对该对象的异机恢复。
3.2 定点恢复、异机恢复
定点恢复很重要的一个方面是恢复点的记录,本文采用的是建立执行日志的方式。对于大量数据库记录处理的对象,假设需要处理1 000条记录,每10条记录设置一个恢复点,即当成功执行第10、20、30、……、1 000条记录时,执行日志将产生一行日志信息表示该条记录以及其之前的记录已成功执行。若对象在执行第901至910条记录时失效,恢复该对象时根据执行日志最后一行信息可以知道第900条以及之前的记录已成功执行,于是,可以直接从第901条记录开始处理,而不是从第1条记录开始。由此可见,运用定点恢复可以避免大量无谓的时间浪费,很大程度上提高系统的性能。
一个对象在同一个节点失效次数超过设定阈值(比如4次),无论是该节点机器兼容性问题还是资源抢占问题,单纯的在本机上的REDO已经不能解决问题。因此,可以考虑对该对象进行异机恢复,在另一个节点重启该对象。
对于只采取REDO恢复策略的对象,只需要在选定的节点上启动该对象,并在注册信息里修改该对象所在地址即可实现异机恢复。
对于已运用定点恢复策略的对象,异机恢复时可以不考虑其已执行情况,简单地在另一个节点重启;也可以结合异机恢复与定点恢复,将该对象执行日志复制到选定的节点,实现在异机上的定点恢复。
4 系统实现
4.1 基于JADE的系统实现
JADE中,任何Agent必须向AMS注册[11]。因此,对于检测对象是Agent的情形,其主要注册信息可由AMS获取,负责检测该Agent的LDA或者GDA只需记录该Agent的标识及其状态。
系统实现的各Agent按照职能不同分别驻留在主控节点和各计算节点上。主要有驻留在主控节点的容错Agent(FTA,Fault Tolerant Agent)、日志收集Agent(LCA,Log Collector Agent);驻留在各计算节点的局部检测Agent(LDA,Local Detector Agent)、日志Agent(LA,Log Agent)、恢复Agent(RA,Recovery Agent);检测对象为在各计算节点上提供服务的计算Agent(CA,Compute Agent)。各Agent相互关系如图5所示。
各Agent详细功能如下所述:
LDA:负责CA、LA、RA的检测工作。发现LA或CA失效时向RA发出本机恢复请求;必要时向FTA发出CA异机恢复请求;负责RA的本机恢复工作。(本文设定检测间隔为1 000 ms)
FTA:负责LDA、LCA的检测工作。发现LDA失效时向其所在节点的RA发出LDA恢复请求;接收来自LDA的CA异机恢复请求并将该请求转发到合适的节点;负责LCA的恢复工作。另外,FTA还负责LDA所在主机的检测及通报工作。
RA:接收来自LDA的本机恢复请求,并按照请求恢复本机的LA或CA;接收来自FTA的LDA恢复请求,并按照请求恢复本机上的LDA;接收来自FTA的CA异机恢复请求,并在本机上启动指定的CA,实现异机恢复;必要时对CA进行定点恢复。
CA:计算能力提供者,属于业务系统,本文所设计容错系统的服务对象。
LA:本机日志记录器;负责本机上各Agent运行情况的记录,并将必要的信息发送给日志收集器LCA;负责用于定点恢复CA所必须的CA执行日志的创建及维护。
LCA:日志收集器;负责收集各节点的日志信息(CA执行日志不在收集范围内);负责记录FTA的运行情况。
分析上述Agent详细功能,RA即为前述检测模型中的失效处理器(主要处理策略是REDO,即重新启动);LDA除去本机检测工作外,还负担了一部分失效处理器的工作(RA的恢复);FTA主要表现为前述模型中的全局检测器GDA,此外,也负担了一部分失效处理器的工作(LCA的恢复;LDA恢复请求、CA异机恢复请求的转发)。
4.2 容错Agent
容错Agent(FTA)在系统中起着极其重要的作用,负责全局检测工作与恢复请求的调度。为检测各LDA,FTA需要维护一张记录LDA信息的状态表。由于LDA作为一个Agent,其主要信息均可从AMS获取,FTA实际需要维护的信息仅仅是LDA标识(AID)及LDA状态(是否正常)。本文选用HashMap
定义一个TickerBehaviour负责周期性的更新LDA状态表和LDA的失效判断与处理工作。周期设定为1 000 ms。LDA失效判断与处理算法如下描述:
(1)从AMS获取Agent描述信息AMSAgentDescription;
(2)遍历LDA状态表,与AMSAgentDescription进行比对,更新状态表;
(3)若所有LDA状态均为true,则算法结束;否则,转到(4);
(4)对状态为false的LDA,通过AMSAgentDescription找寻与该LDA同节点的恢复Agent(RA);若该RA存在,则转到(5);若不存在,则ping该节点地址,然后转到(6);
(5)标识失效类型为LDA失效并请求该RA恢复其节点所属LDA,然后转到(7);
(6)若ping该节点有响应,则标识失效类型为节点系统失效并给出警告;若无响应,则标识失效类型为节点主机失效并给出警告;
(7)若全部状态为false的LDA均处理完毕,则算法结束;否则,取下一个状态为false的LDA,然后转到(4)。
5 实验结果
系统主控节点的计算机配置如下:Windows 7(32位)操作系统;Intel(R)Core(TM)i3-2120 CPU@3.30 GHz;4 GB内存。
系统计算节点(3台)的计算机配置如下:Windows 7(32位)操作系统;Intel(R)Core(TM)2 Quad CPU Q8400@2.66GHz 2.67GHz;4.00 GB内存。
5.1 系统测试
台风预报系统[13]中的相似路径计算是一个分布式、多Agent的计算过程,其计算节点的失效将导致整体计算结果的不可靠,故为其提供容错是必要的。在此背景下,本文以在台风预报系统中提供相似路径计算服务的计算Agent为系统检测对象,对系统进行功能和性能上的测试。主控和各计算节点启动、各功能Agent加载后,可在主控节点RMA控制界面查看详细信息。
Main_Container(主容器)包含维持JADE平台功能的3个服务:ams、df和rma;masterContainer(主控节点容器)包含3个Agent:容错Agent(FTA)、日志收集Agent(LCA)和主控Agent(MA),MA属于台风预报系统的业务处理Agent,主要负责计算任务的分发,不是本文研究重点,故不进行详细叙述;之后是3个computeContainer(计算节点容器),每个computeContainer里包含有计算Agent(CA)、局部检测Agent(LDA)、日志Agent(LA)、恢复Agent(RA)以及负载平衡Agent(LBA),LBA负责计算各计算节点的负载值和计算能力值,为MA分发任务和FTA申请异机恢复时选择节点提供参考。为方便操作,特制定Agent命名规则如下:(XXXXAgent)_(IP)_(端口号)。如:
recoverAgent_218.193.124.101_1013@Softlab-C-PC:1099/JADE
其中,“@”之前为本文系统指定的Agent名,“@”之后则为JADE平台自动添加的标识。
5.2 结论
经过比较大量的测试,各Agent本机恢复均可在1 s内完成;异机恢复花费时间较长,在2 s到3 s之间。系统功能和性能上均符合本文前述内容的要求。由此印证本文提出的两层失效检测模型和改进行的REDO恢复策略真实可行。
Agent所表现出来的自主性、反应性、交互性、协作性、主动性和智能性等特性,为构建容错中间件提供了一种新的技术途径。采用两层的失效检测模型,局部检测Agent与全局检测Agent等多Agent分工合作,能够较好地协作完成失效检测的工作。定点恢复的采用大大的提高了系统的效率。基于多Agent的容错中间件融合了Agent技术、容错技术与中间件技术,能够为分布式容错应用开发提供框架支持,提供自主的、协作的失效检测和恢复服务,简化业务应用开发过程,提高系统的效率和鲁棒性。
参考文献
[1] 张龙,孟庆鑫.基于中间件的容错服务的研究[J].计算机与网络,2009(12):62-64.
[2] 裘方敏.分布式系统容错中间件的研究与实现[D].长沙:中南大学,2007.
[3] 雷燕,丰雁.分布式系统失效检测器模型的研究[J].河南科学,2011(5):586-590.
[4] 毛新军,常志明.面向Agent的软件设计模式[J].计算机工程与科学,2011(6):72-78.
[5] TOM?魣?譒EK M. Architecture of Multi-Agent System[C]. International Conference on Emerging eLearning Technologies and Applications. High Tatras, Slovakia, 2012.
[6] Jiang Guorui, Wu Lin. Research on Method of Multi-Agent Negotiation Strategy Selection[C]. ICCGI 2010:110-115.
[7] 张伟.多Agent系统协商模型研究与设计[D].石家庄:河北经贸大学,2011.
[8] 王俊,郑笛,吴泉源.一种基于Agent的多粒度负载平衡中间件[J].计算机工程与科学,2007(9):143-146.
[9] SYLVAIN D, GUESSOUM Z, ZIANE M. Adaptive Replication in Fault-Tolerant Multi-Agent Systems[C]. International Conferences on Web Intelligence and Intelligent Agent Technology, 2011.
[10] 刘汉雷.基于Jade的多Agent图像检索系统[D].武汉:华中科技大学,2011.
[11] 于卫红.基于JADE平台的多Agent系统开发技术[M].第一版.北京:国防工业出版社,2011:35-61.
[12] JADE PROGRAMMER′S GUIDE[DB/OL].http://jade.tilab.com/doc/programmersguide.pdf.
[13] 邹宇,郭朝珍.台风综合预报GDSS的研究[J].计算机与现代化,2010(2):11-14.