f)恢复机制调用set_state(),返回信息给新主对象。
3)容错机制。
a)设一致性类型为CONS_INF_CTRL,容错组件通过检查、日志、激活和恢复操作维持复制对象一致性。
b)日志机制定期调用get_state()获取主对象的状态和行为,并将其录入日志,当主对象出现故障时,可取出这些状态信息来恢复一个后补对象或建立一个新对象。
c)通常情况下采用大数表决法[5]来实现容错,表决器从参数管理器处获取对象组成员个数N,当主对象接收到N/2或N/3个相同消息,则判决该消息正确,无需等待其他消息到达,并丢弃掉与正确消息不同的对象。若全部消息都已到达,但仍没有接收到N/2或N/3个相同消息,则重启应用。
d)状态传输之后,一个对象组内的成员状态必须与主对象保持一致。
2.2FTCORBA缺点
由2.1节可以知道,系统中出现的错误,可通过对象冗余的方法解决,但上述FTCORBA有一个主要缺点,在网络分割的情况下,FTCORBA的可执行性大大降低甚至为零。网络分割[3]即当网络不稳定时,网络中的部分节点与其他节点间的所有网络连接同时发生故障,造成节点与节点间不能互通,形成两个或多个相互隔绝的子网,如图2,容错域3可能与容错域1和容错域2完全隔绝。这样就导致容错域3中的复制对象无法与容错域1或2中的对象组中的主对象保持一致,不同子网中的对象状态版本可能不同,如C3与C2和C1的状态因为网络故障无法保持一致。由于这些差异只有当网络故障被维护、系统恢复后才能监测得到,那么在网络分割的情况下就无法保持所有对象状态一致性,如果依照FTCORBA标准则会大大限制操作,降低系统的可行性。例如在2.1节中,出现网络分割时,2)中的b)、c)、d)和3)中的c)操作会反复执行,操作达不到对象组所要求的最少成员数,或使应用频繁地替换主对象,甚至重启,这样大大增加了网络负担,且操作不能继续往下执行。
3改进后的FTCORBA
本文在已有的CORBA架构添加协议组件,在出现网络分割时,根据协议执行额外的一系列操作来提高系统的执行能力,这种方法的最大优势在于不用改变ORB源码,且可移植性、可扩展性强。根据OMG颁布的FTCORBA,网络中各对象状态严格一致,当出现网络分割时,由于子网中各节点之间不能通信,因而无法满足标准FTCORBA中对象状态的完整一致性要求。本文将增加的针对网络分割的操作规范封装到协议组件[8]中。该协议允许对象状态在网络出现故障的情况下有差异;当系统恢复正常时,各对象状态又重新保持严格一致;在网络分割环境下系统已经做出的操作,根据应用的一致性等级采取不同的恢复措施。
出现网络分割的节点数是随机的,且节点恢复的顺序与产生分割的顺序是相互独立的。只有当网络连接恢复时,才能区分节点是出现故障还是网络分割,因此,将节点故障按照出现网络分割的情况处理。
下面将讨论改进后的容错机制,由于容错机制的复制和状态一致性机制的实现是通过在CORBA上添加中间件附件,协议内容由专门的协议组件来完成,所以无需改变已有的ORB源代码[8-9]。
3.1改进后的容错机制
本文提出的容错机制放宽了对象状态在网络分割时对对象状态一致性的要求,但当网络恢复正常时,对象状态又重新保持严格一致。
对象状态需满足所有约束条件操作才能继续往下执行,而约束条件则与具体的对象相关。标准FTCORBA要求所有对象状态都是最新的,即严格与主对象保持同步;同时,在操作执行前后对象状态要满足先决条件或者后决条件。例如网上购票系统,所有对象状态必须一致,如图2,不能出现在B1、B2对象上同一班次火车票为可购买,在B3对象上该次列车火车票为已售完;其次,在购票操作前,对象要满足先决条件,即一个用户最多购五张票;同时满足后决条件,即同一座位火车票只能被一人购买。
将对象一致性要求分为C1和C2级:C1级为严格的一致性要求,即要求各对象状态必须保持严格一致;C2级则允许对象间的状态存在差异。改进后的容错机制,在2.1节的3)中加入了以下操作:
1)如果无法连接上主对象,新的对象会被选出执行主对象的任务,但当该操作有C1级先决条件或后决条件时,就不能执行该操作。
2)如果在评估后决条件时,对象状态还没有更新,那么该对象回滚,即恢复到先前状态,然后重新执行操作。
3)如果对象状态没有及时更新,而对象一致性要求为C1级,操作将直接被丢弃;若一致性要求为C2,操作将保留。
4)网络恢复时,各对象状态恢复一致后,对操作的后决条件重新评估。
5)当操作包含需回滚的对象时,那么该操作不能继续执行。
仍以网上购票系统为例,先决条件可以设为C1级,即出现网络分割,由于主对象所在子网没能更新用户对象状态,用户实己购到五张票而显示不足五张,用户在此状态下购第六张票仍可继续执行且有效;后决条件同一座位只能被一人购买设为C1级,即网络分割条件下,主对象不能获取该座位最新状态是空闲还是已售出,则此操作将回滚。
3.2仿真验证
假设分布式系统包含100个节点,500个对象,每个对象有10个复制服务对象,所有对象的执行都没有约束条件。
图4为标准FTCORBA的分布式系统的可行度,纵坐标av表示系统可行度,横坐标pm为包含主对象的分割子网的节点数占全网节点数的百分比,设其余子网包含相同的节点数。由于产生其不可行的原因为分割子网的节点数达不到一个操作所需的最小复制数的要求及其在进行容错判决时对复制对象个数的要求,这里设子网节点数为系统总节点数的80%以上为满足以上两个要求。此外,操作直接调用对象在分割子网外也会造成操作失败。当子网节点数不满足最小复制对象个数和容错判决对象个数的要求时,系统的可行度为0。当满足临界条件时,系统可行度可表示为子网包含所有直接调用的对象的概率:
由于网络分割成子网的大小都是随机的,所以可行度会因为各子网大小的不同会有一些浮动,但由于本例是以将其中一个子网所占节点由1%遍历至100%,其余子网包含相同的节点数,基本涵盖了所有子网分割的特性,所以系统可行度总体趋势与图5相同。可见改进后的FTCORBA对网络分割有很好的适应性。 |