李勇
摘要:NORADLE實現(xiàn)了nodes和oracle的互連,但是要用在生產(chǎn)環(huán)境中,必需能夠經(jīng)受各種異常的影響,能夠連續(xù)不斷的運行、自動的恢復、確保資源得到回收,為了確?;贜ORADLE的系統(tǒng)能夠7*24小時不間斷運行,NORADLE針對各種風險做出了全面而有效的設計。
關鍵詞:Robustness;risk;NORADLE:Oracle;nodejs:driver:dispatcher
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)18-0068-02
1.NoRACLE的基本網(wǎng)絡結構
NORADLE服務的基本過程:OSPs主動連接到dispatcher進行注冊,作為請求響應備用通道。clients可以并行的發(fā)送多個請求的幀到dispatcher,dispatcher為每個請求分配空閑的OSP用于處理該請求,處理完成后釋放OSP供其他新的請求使用。
2.面臨的運行風險
1)由于可能遇到未捕獲的異常、誤殺進程、進程占用資源超限等各種原因造成進程意外退出,和由此帶來的節(jié)點間socket中斷
2)請求一響應數(shù)據(jù)包閉環(huán)由于客戶端中斷請求、各個節(jié)點的異常、各個節(jié)點間socket中斷、oracle servlet異常、oracle server異常導致不能正常完整完成,導致過程中的client/dispatcher的通道號不能完成回收,導致通道配額泄漏,最終可導致無邏輯通道可用,服務被鎖死
3)節(jié)點間由于NAT的存在,或由于TCP系統(tǒng)配置的原因,會導致節(jié)點間的連接長時間空閑,造成socket被中斷,而兩端都無法知道。
4)一旦服務進程遇到ORACLE的ora-600/ora-7445內部錯誤,再次接受請求處理,往往還會遇到相同的異常,而這個應用代碼無關。按照NORADLE盡量分配剛處理完請求的oracleserver process連續(xù)處理新請求已盡量減少進程切換的策略,這類內部錯誤很容易連續(xù)發(fā)生,造成持續(xù)的嚴重問題。
5)ORACLE server process長時間運行,或者處理大量的請求后,可能會有相當?shù)倪M程私有資源(如各種功能內存區(qū)域)不能得到及時釋放,最終因為系統(tǒng)資源占用不斷增長造成系統(tǒng)運行變慢或者出現(xiàn)不能分配資源的異常
6)任何服務端節(jié)點的正常退出過程中,該節(jié)點上會存在活動請求,直接退出節(jié)點進程,這些活動請求注定發(fā)生異常
7)傳統(tǒng)的客戶端獲取數(shù)據(jù)庫連接后,從連接對象上發(fā)起請求,但是如果socket異常,客戶端程序必須重啟才能恢復正常,這樣的又會造成應用狀態(tài)的丟失、處理過程的中斷
為了實現(xiàn)基于NORADLE開發(fā)的系統(tǒng)的高可用性,高魯棒性,NORADLE做了如下精巧的設計。
3.自動保持OSP的數(shù)量
NORADLE的進程監(jiān)控后臺進程K-PMON會間隔性的檢查啟動的OSP的數(shù)量,從1編號的任何一個slot上的OSP如果不存在,K_PMON會馬上啟動。這樣,系統(tǒng)管理員可以根據(jù)數(shù)據(jù)庫硬件配置特別是CPU內核數(shù)量,設定保持一定數(shù)量的OSP進程。技能防止傳統(tǒng)連庫模式下大量客戶端請求大量的OSP造成進程數(shù)量過載性能不升反降的問題,同時又能隨時以和硬件能力匹配的服務進程數(shù)量來隨時接受處理請求,不管因為何種原因某OSP退出,NORADLE都無需認為干預,重新啟動對位的OSP。
4.OSP自重啟對抗資源(內存)泄露
每個OSP會自己記錄進程啟動時間和累計處理請求數(shù),當超過設定閥值后,OSP會安全退出,并被K_PMON自動重啟,這就完全避免了ORACLE側的進程內存泄漏,保障系統(tǒng)長期穩(wěn)定運行。
5.支持OSP安全退出
OSP需要退出重啟的時候,socket上可能正好在發(fā)送新請求,從而導致請求處理失敗。為了防止這種情況發(fā)生,OSP在希望退出前,會向dispatcher發(fā)送控制幀,通知其要退出。如果dispatcher登記該OSP處于未被占用狀態(tài),dispatcher立即發(fā)送控制幀給該OSP,告訴其立即退出;如果dispatcher已經(jīng)征用該OSP用于請求處理,那么當該請求的對應響應完整收到后,dispatcher會立即發(fā)送控制幀給OSP,告訴其立即退出。該機制確保了OSP永遠不會在可能有請求發(fā)送過來的情況下直接退出,而是一定會盡快的安全退出。
6.Dispatcher支持安全退出和重啟
由于維護的需要等原因,需要重啟dispatcher進程,直接退出進程會導致當前承載的活動請求異常。NORADLE采用安全退出機制,進程會退出捕獲退出信號,但先不立即退出,而是向其他所以連接到自己的clients/OSPs進程發(fā)送控制幀,告訴對端自己要退出,這樣所有客戶端就不會再在該連接上發(fā)送新的數(shù)據(jù)幀,并且在已有的在途請求全部結束后,立即關閉連接;而每個OSP也會在在途請求處理完畢后(如果不是空閑的話)立即關閉連接。而dispatcher會在所有對端主動關閉連接后,安全的退出。這種機制,確保了不會有任何的在途請求一響應會因為魯莽的進程退出而發(fā)生異常。
7.連接關閉自動恢復機制
客戶端和OSP一旦發(fā)現(xiàn)到dispatcher的socket連接關閉,就會立即重新連接進行恢復,如果嘗試連接失敗,將會按一定時間間隔不短重復嘗試,直到成功。應用程序永遠不用考慮遇到連接關閉需要如何應對,NORADLE自動確保所有連接的及時自動恢復。
8.防止網(wǎng)絡層靜默清除連接
通常,防火墻等網(wǎng)絡設備對于長時間空閑的TCP連接會進行清除,并且不會通知連接的兩端,最終造成通信雙方永遠等不到希望的數(shù)據(jù),同時永遠發(fā)不成功數(shù)據(jù)而造成不斷的重試。NORADLE設計了keep alive ping/pong機制,對于非在途的請求,dispatcher間隔一段時間會發(fā)送ping控制包,OSP接受到的話,會立即返回ping響應控制包,只要該時間間隔小于網(wǎng)絡設備的TCP socket超時清理時限,就可以確保連接在這種復雜的網(wǎng)絡環(huán)境中一直保持。
9.請求過程中異常處理確保在途處理資源得到回收
客戶端發(fā)出請求后,可能自己取消請求,dispatcher和OSP進程都可能意外退出,后端服務器可能意外宕機,OSP在執(zhí)行servlet過程中也可能發(fā)生系統(tǒng)級別的異常。在NORADLE中,上述異常產(chǎn)生的事件被捕獲后,都會模擬出一個異常響應幀和緊跟的一個響應結束幀,從而用統(tǒng)一的方式最終通知到客戶端異常事件信息,從而確保了請求所占用的并發(fā)訪問通道資源得到回收,完成“請求/響應”閉環(huán)。
10.超時機制發(fā)現(xiàn)無事件可檢測的異常
通常,進程退出時,操作系統(tǒng)網(wǎng)絡層會對進程持有的TCP連接發(fā)送fin包,通知對端連接關閉,對端通過檢測該事件能夠及時應對。但是,如果節(jié)點不能檢測到對端的異常事件,就會誤認為對端依然正常,從而陷人處理的無限等待狀態(tài)而不能自拔。NORADLE會對各類型節(jié)點啟用超時檢測機制,如果在超過keep alive幀間隔時長片刻沒有發(fā)現(xiàn)ping包或者沒有接受到pong響應,就可以認為對端已經(jīng)死掉,從而重置資源。對于當前進行中的請求,如果響應長時間沒有接收到,也認為OSP出現(xiàn)異常,從而進行資源回收處理。
11.ORACLE內部錯誤的規(guī)避
當OSP遇到ORA-600或0RA-7445這類不可恢復的異常后,將生成包括異常信息的響應,然后直接退出進程,并自動啟動新的健康狀態(tài)的替代進程,從異常狀態(tài)中及時恢復。
12.總結
NORADLE為了實現(xiàn)高可用性高穩(wěn)定性,節(jié)點間連接采用自動連接自動恢復的方式,節(jié)點進程的退出前先通過控制幀通知對端節(jié)點確保安全優(yōu)雅的退出,內建的keep alive ping/pong和超時檢測機制確保復雜網(wǎng)絡環(huán)境下節(jié)點間通路的正常,對于請求處理過程中的各種異常都能夠確保完成閉環(huán)來回收訪問通道資源,OSP自動保持充分而合理的數(shù)量、OSP自動退出和重啟機制確保OSP整體上可以長期健康提供并發(fā)服務。因此,NORADLE作為一款創(chuàng)新的新型信息系統(tǒng)開發(fā)架構,依靠其高可用性高穩(wěn)定性的精心設計,可以非常有信心的運行大型7*24小時的關鍵業(yè)務信息系統(tǒng)。