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