2 x% Y$ n, |, a* N7 b5 o 9 B6 V7 h, F [% r2 ?
在路由器启动后,两块处理器均属于初始状态,这时尚未确定active和standby。首先仅在一条心跳线上启动主备协商机制。要求主备协商机制要简约,因为在这里没有必要设计复杂的算法选出主用。因而采取比较两处理板IP地址大小的判决方法,通过互发心跳探测报文,比较IP ADDR值,较小的为主处理器,进入active状态;较大的为备用处理器,进入standby状态。+ m" w% F( N+ Z' a. [1 e
在确定了主备用地位的同时,向对方通告自己的身份。这时启动双心跳线,备用一方发送心跳探测报文监控主用的工作是否正常;主用收到探测报文进行回复。备用在工作时要根据主用发送回复的周期值,计算出系统最合适的心跳探测频率,后文将详细介绍。为了避免由于心跳线发生故障造成的误判,如果备用只收到来自一条心跳线的回复报文,则由故障判别机制来确认主用工作正常。: n# a5 I. \9 {8 ]7 g, f4 Q/ g4 ~. L
报文类型:00为主备协商报文,DATA域携带处理器IP地址;01为主备确定报文,DATA域携带裁决结果;10为心跳探测报文,standby→active,要求active给确认;11为心跳回应报文,active→standby,告诉standby自己正常。) x8 P% R; a9 M 2.1 双心跳网络探测机制及故障辨别机制9 h2 U" K, G7 \
分别由两个进程各自控制两条心跳线路上的心跳数据发送,由故障判别机制判断处理器的工作状态。例如,若从处理器收到来自两条链路的心跳信息,则判断主处理器为正常工作状态;若从处理器只收到一条链路上的心跳信息,则判断主处理器工作正常,且心跳线故障,不触发主备切换模块;若从处理器未收到任意一条线路的心跳信息,则判断主处理器失效,触发主备切换模块。此设计虽然增加了实现的复杂性,但却解决了实际工程中接口松动等问题造成的系统误判和不必要的消耗。双心跳网络探测机制如图2所示。
( K0 E* B S3 x9 n- o
" c& b) f3 G8 j- p# o0 o& D' _" M* o. I. T ! p# A$ L1 b0 A- c; t 在功能实现上,故障判别机制和传统定时器的作用是相同的。对于传统定时器方式:在处理器未收到对方的心跳信息时,启动定时器,在所设置的时间内仍没有收到信息,判断为处理器失效,这时由于等待deadline可能已经延误了主备切换的时间。 , d9 I* E" _! B1 h. H 由于本方案采取冗余心跳网络,对于一条心跳链路来说,如果处理器未收到心跳信息,则进入故障判别模式,询问另一条心跳线是否收到心跳信息;如果结果一致,则迅速启动主备切换。这样可以减少不必要的等待时间,也可以避免由于线路拥塞造成的误判。6 l' G% p1 [- n, I5 }# i, X* J% D. ~ 2.2 分级的自适应周期设计; a& X3 k/ w$ J4 b
针对心跳周期难以设定的问题,采用了一种自适应周期的设计。其原理是:首先设定高、中、低三种心跳信任级别的周期:1s、3s、5s。心跳频率调节原理如图3所示,通过最近发生的N次心跳求其平均值Tr与三个级别相比较,以确定其下一阶段采用的心跳频率。这样可以根据实际网络运行的情况实现高可用性。 - i8 {; b9 A. z7 E5 b/ }& h
& R9 S9 D# F& x
: A7 |% f9 D; Q; G' c 2.3 基于网络层的心跳传输机制设计 6 V- G, n7 l/ O8 d- \ 由于以往的心跳传输基本采用TCP或UDP方式,在实现中必须遵从TCP/IP协议信息处理的层次流程,使实时性的要求无法保证。为了缩短处理时经过的层次,设计了一种基于网络层的心跳传输方式。) Y, R8 S& _$ \+ J
心跳模块工作层次结构图如图4所示。心跳模块与上层应用完全分隔开,它处于链路层和网络层。通过在链路层对帧头的类型字段的检查,区分出心跳报文与IP报文。如果是IP报文,则送入上层协议栈;如果是心跳报文,则进入心跳报文队列,并触发一个中断,通告心跳模块进行处理。以往通过应用层的心跳信息必须通过插口层再到应用层进行处理,这个过程要经过路由、选径、报文确认等一对一地心跳传输中所不必要的步骤,增加了网络的开销,更降低了传输效率。' m( H' Q1 K' e$ a, S
4 J9 F& k- o0 y3 N ?
- [' J* D, s- w6 G% \7 e$ v5 J# F7 z
以上设计的方案在ACR路由器的主控支撑软件主备切换模块中,已成为心跳探测机制工作中关键的一环。实践证明,此方案不仅在发现故障上实现了最低延迟,同时将误判率降至最低,为主备切换做好了基础性工作。从而为保证系统可靠性提供了前提。但在实现时增加了系统的复杂性,因此如何设计一个高效、准确且实用的心跳协议仍是双机热备系统设计中需认真考虑的关键问题之一。5 J9 x! Y H1 k+ g2 X" U6 q7 { 参考文献7 ^4 k6 V6 r( a( s; L& b) e [1] 尹康凯,王明伟,李善平.高可用性机群中多个节点的心跳模型研究.计算机工程,2005. 3 g# n& [9 }4 T1 y# t" U$ d[2] David Patterson,Aaron Brown, Pete Broadwell. Recovery oriented computing(ROC): motivation,definition,techniques,and case STUDIES[R].Technical Report CSD-02-1175,UC Berkeley,2002.4 s$ A4 S+ {% P/ N O/ Z+ L
[3] Sameer Srivastava. Redundancy management for network devices. 2003. IEEE & R2 \2 e: K' s2 ^7 r+ k[4] Evan Marcus,Hal Stern. 高可用性系统设计.北京:清华大学出版社,2005.: ^$ X; v) z! Z$ m
[5] John L H, David A P. Computer architecture: A quantitative approach[M].北京:机械工业出版社, 2002.