0引言
当今越来越多的应用由于其规模和复杂性,需要在分布式系统中完成,而许多分布式应用都需要系统提供容错机制[1],例如航空交通管制、网上支付应用等,若没有容错措施,系统中任何一个环节的错误都可能造成巨大损失。而分布式系统各节点使用不同的操作平台和不同的通信协议,容错机制在系统不同层次上实现,对于每一个新的操作平台都要重新研究相应的容错机制,这样就大大降低了系统的可扩展性,并极大地增加了开发难度和开发成本。
公共对象请求代理体系结构(CommonObjectRequestBrokerArchitecture,CORBA)[2]是由对象管理组织(ObjectManagementGroup,OMG)提出的基于分布式对象的中间件规范,该规范中的接口定义语言(InterfaceDescriptionLanguage,IDL)描述了客户对象请求和对象执行接口,完整地定义了接口并说明每个操作参数。IDL实现了组件间交互无需考虑操作平台和通信协议的不同。将分布式系统与CORBA结合[3-4],并将容错机制交由CORBA实现能很好地解决上述问题。
容错CORBA(FaultTolerantCORBA,FTCORBA)介绍了一种基于冗余[5]的容错机制,但没有考虑网络分割的情况,当网络出现故障,形成两个或多个相互隔离的子网,各子网对象状态因为不能互通所以不能保持一致,从而大大限制了操作的执行。因此,研究一种新的能够应对网络分割情况的FTCORBA就显得非常必要了。
1体系结构
1.1CORBA体系结构及特性
客户端通过接入对象引用(ObjectReference)、了解对象类型和希望实现的操作来执行请求[6]。客户端可静态(访问特定对象的存根)或动态地建立请求。用动态和静态接口建立请求使用的是相同的请求语法,信息的接收方分辨不出请求是用哪种方式建立的。在执行一些功能时客户端也可直接与ORB交互。
ORB将对象执行(ObjectImplementation)相应的执行代码、传输参数和传输控制信息放入IDL骨架或动态骨架。骨架是与特定的接口和对象适配器相对应的。对象执行可通过静态IDL骨架或动态骨架来接收请求。在处理对象请求或其他情况下,对象执行可能会包含从对象适配器传来的ORB服务。当请求执行完成后,控制和执行结果将会返回给客户端。
客户端和对象执行是如何获悉接口和执行信息的呢,接口定义在OMGIDL或接口库中,这些定义将用于产生客户端存根和对象执行骨架;对象执行信息则是存储在执行库中。
1)创建对象组,实现对象冗余。
a)用户端应用调用resolve_initial_references()函数获取复制管理器引用。
b)用户端应用通过复制管理器里GenericFactory接口,调用create_object()函数提供type_id和the_criteria,然后返回对象组引用和factory_creation_id给复制管理器,其中factory_creation_id用于之后复制管理器调用GenericFactory接口函数delete_object()删除对象组。
c)参数管理器接口为对象组提供设置参数的操作,例如复制类型、成员类型、一致性类型、最小复制数、初始化复制数等。
d)复制管理器调用本地对象库,在合适的位置创建对象组,并且满足InitialNumberReplicas和MinimumNumberReplicas参数值,即对象组的初始对象数和执行过程中对象组包含的最小对象数。
e)复制管理器决定出对象组中的主对象,创建包含容错域对象代表的TAG_FT_GROUP组件,并允许其他组件访问主对象和对象组中各对象的状态版本;然后复制管理器创建对象组引用。
f)对每一个网关,复制管理器建立一个TAG_INTERNET_IOP文件,它包含网关内主机、端口和允许被访问的TAG_FT_GROUP组件;然后复制管理器在TAG_INTERNET_IOP文件中增加对象组地址。
g)复制管理器记录对象组引用。
h)对每一个成员,复制管理器将复制对象成员添加到对象组;根据复制类型激活成员;核对复制类型、故障监测类型和故障监测间隔,然后决定是否初始化该成员的故障监测功能;最后,复制管理器将自己或由它创建的对象登记到故障通知器,用来接收该成员的故障通知。
i)对于COLD_PASSIVE和WARM_PASSIVE复制类型,复制管理器决定对象组的主对象,将TAG_FT_PRIMARY组件包含到该对象的文件中,只有主对象才能执行调用到对象组上的方法。
j)复制管理器将对象组引用返回给应用。
2)故障监测和恢复。
a)复制管理器告知故障监测器开始监测对象。
b)故障监测器定期调用is_alive()函数作用于对象组内的主对象,主对象回复该请求。
c)若主对象出现故障,没有回复is_alive(),监测器等待超时,则向故障通知器报告主对象出现故障,然后故障通知器告知复制管理器主对象出现故障。
d)复制管理器确认对象组包含这个主对象和该对象组的复制类型,并从对象组中移除该主对象,并调用容错组件为对象组指定新的主对象。如果当前对象组的成员少于最小成员数,那复制管理器开始建立新的成员。
e)如果候补对象还没有进入工作状态,那么复制管理器激活该对象。 |