NORADLE鲁棒性设计
2016-01-15李勇
李勇
摘要:NORADLE实现了nodes和oracle的互连,但是要用在生产环境中,必需能够经受各种异常的影响,能够连续不断的运行、自动的恢复、确保资源得到回收,为了确保基于NORADLE的系统能够7*24小时不间断运行,NORADLE针对各种风险做出了全面而有效的设计。
关键词:Robustness;risk;NORADLE:Oracle;nodejs:driver:dispatcher
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)18-0068-02
1.NoRACLE的基本网络结构
NORADLE服务的基本过程:OSPs主动连接到dispatcher进行注册,作为请求响应备用通道。clients可以并行的发送多个请求的帧到dispatcher,dispatcher为每个请求分配空闲的OSP用于处理该请求,处理完成后释放OSP供其他新的请求使用。
2.面临的运行风险
1)由于可能遇到未捕获的异常、误杀进程、进程占用资源超限等各种原因造成进程意外退出,和由此带来的节点间socket中断
2)请求一响应数据包闭环由于客户端中断请求、各个节点的异常、各个节点间socket中断、oracle servlet异常、oracle server异常导致不能正常完整完成,导致过程中的client/dispatcher的通道号不能完成回收,导致通道配额泄漏,最终可导致无逻辑通道可用,服务被锁死
3)节点间由于NAT的存在,或由于TCP系统配置的原因,会导致节点间的连接长时间空闲,造成socket被中断,而两端都无法知道。
4)一旦服务进程遇到ORACLE的ora-600/ora-7445内部错误,再次接受请求处理,往往还会遇到相同的异常,而这个应用代码无关。按照NORADLE尽量分配刚处理完请求的oracleserver process连续处理新请求已尽量减少进程切换的策略,这类内部错误很容易连续发生,造成持续的严重问题。
5)ORACLE server process长时间运行,或者处理大量的请求后,可能会有相当的进程私有资源(如各种功能内存区域)不能得到及时释放,最终因为系统资源占用不断增长造成系统运行变慢或者出现不能分配资源的异常
6)任何服务端节点的正常退出过程中,该节点上会存在活动请求,直接退出节点进程,这些活动请求注定发生异常
7)传统的客户端获取数据库连接后,从连接对象上发起请求,但是如果socket异常,客户端程序必须重启才能恢复正常,这样的又会造成应用状态的丢失、处理过程的中断
为了实现基于NORADLE开发的系统的高可用性,高鲁棒性,NORADLE做了如下精巧的设计。
3.自动保持OSP的数量
NORADLE的进程监控后台进程K-PMON会间隔性的检查启动的OSP的数量,从1编号的任何一个slot上的OSP如果不存在,K_PMON会马上启动。这样,系统管理员可以根据数据库硬件配置特别是CPU内核数量,设定保持一定数量的OSP进程。技能防止传统连库模式下大量客户端请求大量的OSP造成进程数量过载性能不升反降的问题,同时又能随时以和硬件能力匹配的服务进程数量来随时接受处理请求,不管因为何种原因某OSP退出,NORADLE都无需认为干预,重新启动对位的OSP。
4.OSP自重启对抗资源(内存)泄露
每个OSP会自己记录进程启动时间和累计处理请求数,当超过设定阀值后,OSP会安全退出,并被K_PMON自动重启,这就完全避免了ORACLE侧的进程内存泄漏,保障系统长期稳定运行。
5.支持OSP安全退出
OSP需要退出重启的时候,socket上可能正好在发送新请求,从而导致请求处理失败。为了防止这种情况发生,OSP在希望退出前,会向dispatcher发送控制帧,通知其要退出。如果dispatcher登记该OSP处于未被占用状态,dispatcher立即发送控制帧给该OSP,告诉其立即退出;如果dispatcher已经征用该OSP用于请求处理,那么当该请求的对应响应完整收到后,dispatcher会立即发送控制帧给OSP,告诉其立即退出。该机制确保了OSP永远不会在可能有请求发送过来的情况下直接退出,而是一定会尽快的安全退出。
6.Dispatcher支持安全退出和重启
由于维护的需要等原因,需要重启dispatcher进程,直接退出进程会导致当前承载的活动请求异常。NORADLE采用安全退出机制,进程会退出捕获退出信号,但先不立即退出,而是向其他所以连接到自己的clients/OSPs进程发送控制帧,告诉对端自己要退出,这样所有客户端就不会再在该连接上发送新的数据帧,并且在已有的在途请求全部结束后,立即关闭连接;而每个OSP也会在在途请求处理完毕后(如果不是空闲的话)立即关闭连接。而dispatcher会在所有对端主动关闭连接后,安全的退出。这种机制,确保了不会有任何的在途请求一响应会因为鲁莽的进程退出而发生异常。
7.连接关闭自动恢复机制
客户端和OSP一旦发现到dispatcher的socket连接关闭,就会立即重新连接进行恢复,如果尝试连接失败,将会按一定时间间隔不短重复尝试,直到成功。应用程序永远不用考虑遇到连接关闭需要如何应对,NORADLE自动确保所有连接的及时自动恢复。
8.防止网络层静默清除连接
通常,防火墙等网络设备对于长时间空闲的TCP连接会进行清除,并且不会通知连接的两端,最终造成通信双方永远等不到希望的数据,同时永远发不成功数据而造成不断的重试。NORADLE设计了keep alive ping/pong机制,对于非在途的请求,dispatcher间隔一段时间会发送ping控制包,OSP接受到的话,会立即返回ping响应控制包,只要该时间间隔小于网络设备的TCP socket超时清理时限,就可以确保连接在这种复杂的网络环境中一直保持。
9.请求过程中异常处理确保在途处理资源得到回收
客户端发出请求后,可能自己取消请求,dispatcher和OSP进程都可能意外退出,后端服务器可能意外宕机,OSP在执行servlet过程中也可能发生系统级别的异常。在NORADLE中,上述异常产生的事件被捕获后,都会模拟出一个异常响应帧和紧跟的一个响应结束帧,从而用统一的方式最终通知到客户端异常事件信息,从而确保了请求所占用的并发访问通道资源得到回收,完成“请求/响应”闭环。
10.超时机制发现无事件可检测的异常
通常,进程退出时,操作系统网络层会对进程持有的TCP连接发送fin包,通知对端连接关闭,对端通过检测该事件能够及时应对。但是,如果节点不能检测到对端的异常事件,就会误认为对端依然正常,从而陷人处理的无限等待状态而不能自拔。NORADLE会对各类型节点启用超时检测机制,如果在超过keep alive帧间隔时长片刻没有发现ping包或者没有接受到pong响应,就可以认为对端已经死掉,从而重置资源。对于当前进行中的请求,如果响应长时间没有接收到,也认为OSP出现异常,从而进行资源回收处理。
11.ORACLE内部错误的规避
当OSP遇到ORA-600或0RA-7445这类不可恢复的异常后,将生成包括异常信息的响应,然后直接退出进程,并自动启动新的健康状态的替代进程,从异常状态中及时恢复。
12.总结
NORADLE为了实现高可用性高稳定性,节点间连接采用自动连接自动恢复的方式,节点进程的退出前先通过控制帧通知对端节点确保安全优雅的退出,内建的keep alive ping/pong和超时检测机制确保复杂网络环境下节点间通路的正常,对于请求处理过程中的各种异常都能够确保完成闭环来回收访问通道资源,OSP自动保持充分而合理的数量、OSP自动退出和重启机制确保OSP整体上可以长期健康提供并发服务。因此,NORADLE作为一款创新的新型信息系统开发架构,依靠其高可用性高稳定性的精心设计,可以非常有信心的运行大型7*24小时的关键业务信息系统。