朱穎琪
摘 要:隨著信息化的不斷深入,企業(yè)內(nèi)部存在著各種各樣的異構(gòu)軟、硬件平臺,形成異構(gòu)數(shù)據(jù)源。當(dāng)各應(yīng)用系統(tǒng)間需要進行數(shù)據(jù)交流時,其復(fù)制數(shù)據(jù)效率及準確性、及時性必然受到平臺異影響。為了解決這一問題,通常利用數(shù)據(jù)庫數(shù)據(jù)實時同步進行交互。但是,當(dāng)各平臺數(shù)據(jù)量為PB級,數(shù)據(jù)交流時間較長,各種保護機制將中斷連接,導(dǎo)致之前的數(shù)據(jù)失效,因此有必要設(shè)置TCP探針防數(shù)據(jù)中斷。
關(guān)鍵詞:海量數(shù)據(jù)交互;異構(gòu)平臺;TCP探針
DOI:10.16640/j.cnki.37-1222/t.2017.20.112
當(dāng)同步數(shù)據(jù)過程中源數(shù)據(jù)長時間處于前期查詢處理,而不能即時將數(shù)據(jù)同步到目的數(shù)據(jù)庫,目的數(shù)據(jù)庫在一定時間內(nèi)檢測不到監(jiān)聽連接通道中有數(shù)據(jù)推送,就會默認為源數(shù)據(jù)庫數(shù)據(jù)已完成同步,隨后立即主動在TCP協(xié)議中向源數(shù)據(jù)庫發(fā)送FIN標志位,源數(shù)據(jù)庫在接收到FIN標志位后會主動斷掉監(jiān)聽連接通道,這樣的“假結(jié)束”造成數(shù)據(jù)同步失敗。因此將目的數(shù)據(jù)庫推遲發(fā)送FIN標志位是關(guān)鍵點。
1 原理說明
根據(jù)TCP面向連接的通信協(xié)議,采取在目的數(shù)據(jù)庫設(shè)置TCP探針調(diào)整超時參數(shù),使其與業(yè)務(wù)同步數(shù)據(jù)量相適應(yīng),保證在大數(shù)據(jù)量同步之前,不會立即發(fā)送FIN標志位結(jié)束數(shù)據(jù)同步傳輸。
沒有設(shè)置TCP探針前報錯如下:
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=172.**.**.**)(PORT=****))
TNS-00505: 操作超時
nt secondary err code: 60
nt OS err code: 0
ns secondary err code: 12560
nt main err code: 505
TNS-12535: TNS: 操作超時
Tracing not turned on.
Tns error struct:
ns main err code: 12535
VERSION INFORMATION: TNS for 32-bit Windows: Version 11.1.0.7.0 - Production Oracle Bequeath NT
Protocol Adapter for 32-bit Windows: Version 11.1.0.7.0 - Production Windows NT TCP/IP NT Protocol
Adapter for 32-bit Windows: Version 11.1.0.7.0 - Production
Fatal NI connect error 12170.
Oracle 11G有兩個參數(shù)SQLNET.INBOUND_CONNECT_TIMEOUT
和INBOUND_CONNECT_TIMEOUT_listenername;他們的默認值均為60s,這兩個參數(shù)負責(zé)登陸用戶與服務(wù)器驗證的超時時間,在Oracle 10G R2以前的版本默認是0s,為了防止Denial of Service (DOS)攻擊,在此后的版本中才設(shè)置為60s。如果在數(shù)據(jù)交互期間目的數(shù)據(jù)庫沒有收到源數(shù)據(jù)庫的同步數(shù)據(jù),那么將會在60后發(fā)送FIN標志位中斷數(shù)據(jù)同步通道并給出錯誤提示,對于數(shù)據(jù)量較大的同步作業(yè)這個超時時間顯然較短。
設(shè)置TCP探針后:
在目的數(shù)據(jù)庫Oracle數(shù)據(jù)庫設(shè)置INBOUND_CONNECT_TIMEOUT
參數(shù),按照Oracle官方文檔建議設(shè)為360s(實際參數(shù)值可根據(jù)不同業(yè)務(wù)需求進行設(shè)置)Oracle 11g has a problem that is session timeout problem. You can add a row to sqlnet.ora file and listener.ora file to resolve session timeout problem.
sqlnet.ora
Note : Add this line to below of sqlnet.ora file.
INBOUND_CONNECT_TIMEOUT=360
listener.ora
Note : Add this line to below of listener.ora file.
通過將INBOUND_CONNECT_TIMEOUT設(shè)置為360秒,可使目的數(shù)據(jù)庫延遲6分鐘發(fā)送FIN標志位。這樣便能保證數(shù)據(jù)同步成功,繼而保證應(yīng)用系統(tǒng)間需要進行數(shù)據(jù)交流時其效率及準確性。
2 成果實施效果
基于Oracle數(shù)據(jù)庫的TCP探針技術(shù)已在營銷、人資、財務(wù)等多個重要系統(tǒng)數(shù)據(jù)庫進行設(shè)置調(diào)整,至今未出現(xiàn)故障和隱患。取得如下效果:
(1)極大保障了應(yīng)用系統(tǒng)間數(shù)據(jù)同步準確性、完整性。
(2)減輕目的端數(shù)據(jù)庫的負載,不會因INBOUND_CONNECT_TIMEOUT參數(shù)設(shè)置過短在交互過程中頻繁的向源端發(fā)起FIN標志位請求,斷開數(shù)據(jù)傳輸通道。
(3)減少人力資源支出,數(shù)據(jù)量較大時,會花費很長時間,期間需派人員專門看守防止中途出現(xiàn)同步失敗。人力資源成本標準為平均每小時人力成本約為:112元。現(xiàn)在業(yè)務(wù)數(shù)據(jù)量巨大,平均500GB的數(shù)據(jù)至少需12小時完成。如果合理設(shè)置INBOUND_CONNECT_TIMEOUT參數(shù),同步數(shù)據(jù)時就不需要專人看守,一次同步500GB的數(shù)據(jù)量便可節(jié)約人力資源成本12小時 * 112元/每小時=1350元,重要業(yè)務(wù)數(shù)據(jù)一年同步96次,便可節(jié)約人力資源成本96次 * 1350次/元=129600元。如果涉及到的數(shù)據(jù)量共計10TB,那么年節(jié)資總額為:10TB/500GB*129600元=2592000元。
3 成果推廣前景
只要是通過Oracle數(shù)據(jù)庫之間的業(yè)務(wù)數(shù)據(jù)同步,均可使用TCP探針技術(shù)。對于后續(xù)其他重要業(yè)務(wù)系統(tǒng)數(shù)據(jù)的同步抽取有著重要支撐作用。
4 創(chuàng)新點總結(jié)
TCP探針技術(shù)根本上解決了數(shù)據(jù)交互通道中,在長時間沒有數(shù)據(jù)接收與發(fā)送的狀態(tài)下,目的端主動斷掉數(shù)據(jù)通道的問題,通過對TCP探針的設(shè)置能使數(shù)據(jù)的整個交互通道穩(wěn)定可靠,不會因為數(shù)據(jù)超時問題,提前結(jié)束數(shù)據(jù)交互,另外設(shè)置TCP探針技術(shù)還有助于提升連接超時時間,目的端設(shè)置TCP探針后會每隔一段時間向源端發(fā)送ACK標志位說明需要保持數(shù)據(jù)通道使用,因此連接超時時間便會提升。endprint