[伍運珍 劉順坤]
海量數(shù)據(jù)上傳的技術(shù)研究與實現(xiàn)
[伍運珍 劉順坤]
首先介紹海量數(shù)據(jù)上傳的背景、上傳的流程,然后比較不同的數(shù)據(jù)上傳方式,主要包括Dblink方式和GoldenGate方式,最后闡述可以保證數(shù)據(jù)讀寫效率的關(guān)鍵技術(shù),包括動態(tài)分區(qū)管理技術(shù)、并行度優(yōu)化技術(shù)以及管道通信技術(shù)。
海量數(shù)據(jù) 創(chuàng)新應(yīng)用 動態(tài)分區(qū) 并行度優(yōu)化 管道通信
伍運珍
計算機工程師,碩士,現(xiàn)任職于中國電信股份有限公司廣東研究院,長期從事電信IT支撐系統(tǒng)的設(shè)計與研發(fā)工作。
劉順坤
資深軟件工程師,本科,現(xiàn)任職于亞信科技(中國)有限公司,長期從事電信IT支撐系統(tǒng)的設(shè)計與研發(fā)工作。
移動互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展的趨勢及特點要求提供更為及時、更為豐富的服務(wù),只有服務(wù)能夠得到快速響應(yīng),才有好的客戶感知。當(dāng)前,中國電信的數(shù)據(jù)分散在各省IT系統(tǒng),要提供統(tǒng)一的對外服務(wù),首先需要通過統(tǒng)一平臺與各省的接口獲取數(shù)據(jù),然后才能對外提供服務(wù)。這樣的方案流程長,時效性低,因此,將各省的海量數(shù)據(jù)集中存儲到全國統(tǒng)一的數(shù)據(jù)平臺,然后通過統(tǒng)一平臺對外提供服務(wù)是高效、快捷的方式。
數(shù)據(jù)集中存儲,需要各省將數(shù)據(jù)上傳到統(tǒng)一平臺,那么數(shù)據(jù)該如何上傳?對于海量數(shù)據(jù),上傳的流程和方式的選擇非常重要;數(shù)據(jù)上傳后如何更快地刪除舊數(shù)據(jù)、寫入新數(shù)據(jù)?對于耗時的數(shù)據(jù)庫操作,如何避免因超時被斷開連接?本文針對海量數(shù)據(jù)的上傳以及上傳后的入庫中遇到的各種問題進行了分析和研究。
分布在各省的數(shù)據(jù)上傳到統(tǒng)一平臺,但是各省的數(shù)據(jù)不一定與統(tǒng)一平臺的主數(shù)據(jù)和元數(shù)據(jù)一致,而數(shù)據(jù)要可用,主數(shù)據(jù)必須一致,因此統(tǒng)一平臺必須先定義好元數(shù)據(jù)和主數(shù)據(jù),各省進行數(shù)據(jù)轉(zhuǎn)換后再上傳。各地數(shù)據(jù)在轉(zhuǎn)換過程中,由于源數(shù)據(jù)本身有問題或者轉(zhuǎn)換程序的不完備,會出現(xiàn)一些不符合要求的數(shù)據(jù),不同省的數(shù)據(jù),也可能存在著數(shù)據(jù)沖突,因此,統(tǒng)一數(shù)據(jù)平臺的數(shù)據(jù)要真正可用,需要將數(shù)據(jù)進行清洗之后再進入統(tǒng)一平臺的數(shù)據(jù)庫。
基于上述考慮,海量數(shù)據(jù)的上傳流程中應(yīng)通過中間表來進行,各省數(shù)據(jù)在上傳前,先轉(zhuǎn)換到本地中間表,然后再從本地中間表上傳到統(tǒng)一數(shù)據(jù)平臺的中間表,最后,統(tǒng)一平臺再進行數(shù)據(jù)入庫。流程如圖1。
圖1 海量數(shù)據(jù)上傳流程
(1)在各省數(shù)據(jù)庫中,通過配置生成需增量上傳的關(guān)鍵信息ID表(如客戶ID、資產(chǎn)ID等),統(tǒng)一平臺和各地約定每個批次數(shù)據(jù)提取間隔時間以及批次生成規(guī)則,如5分鐘生成一個批次,各省根據(jù)關(guān)鍵信息ID表,采用程序(或存儲過程)方式從各數(shù)據(jù)庫表中獲取相關(guān)信息,將本批次數(shù)據(jù)入增量上傳信息中間表,在本批次各個對象都入到增量上傳信息中間表后,在批次結(jié)束表中插入相應(yīng)的批次信息以及本批次業(yè)務(wù)對象信息;
(2)各省根據(jù)數(shù)據(jù)入庫先后順序,將省增量上傳信息中間表和批次結(jié)束表的內(nèi)容復(fù)制到統(tǒng)一平臺中間表中;
(3)統(tǒng)一平臺從批次結(jié)束表獲取已同步的批次號,然后根據(jù)批次對平臺側(cè)中間表數(shù)據(jù)進行校驗并入庫到統(tǒng)一庫的數(shù)據(jù)表中,統(tǒng)一平臺生成每個批次的校驗應(yīng)答數(shù)據(jù),各省遠程獲取校驗應(yīng)答信息進行處理。
各省的中間表數(shù)據(jù)上傳到統(tǒng)一平臺的中間表,常規(guī)有3種方式:第一,程序接口的方式;第二,Dblink方式;第三,GoldenGate方式。對于海量數(shù)據(jù),如果通過接口方式上傳,接口壓力會非常大,因此,一般采用Dblink方式以及GoldenGate方式。下面我們先介紹下這兩種方式,然后再對這兩種方式進行比較。
3.1 DBlink方式
DBlink 即DATABASE LINK,如果有兩臺不同的數(shù)據(jù)庫服務(wù)器,需要從一臺數(shù)據(jù)庫服務(wù)器的一個用戶讀取另一臺數(shù)據(jù)庫服務(wù)器下的某個用戶的數(shù)據(jù),這種情況就可以使用dblink。dblink和數(shù)據(jù)庫中的view類似,建dblink的時候需要知道待讀取數(shù)據(jù)庫的ip地址,ssid以及數(shù)據(jù)庫用戶名和密碼。
3.2 GoldenGate方式
GoldenGate軟件是一種基于日志的結(jié)構(gòu)化數(shù)據(jù)復(fù)制軟件,它通過解析源數(shù)據(jù)庫在線日志或歸檔日志獲得數(shù)據(jù)的增量變化,再將這些變化應(yīng)用到目標(biāo)數(shù)據(jù)庫,從而實現(xiàn)源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫同步。
GoldenGate 可以在異構(gòu)的IT基礎(chǔ)結(jié)構(gòu)(包括幾乎所有常用操作系統(tǒng)平臺和數(shù)據(jù)庫平臺)之間實現(xiàn)大量數(shù)據(jù)亞秒級的實時復(fù)制,適合在應(yīng)急系統(tǒng)、在線報表、實時數(shù)據(jù)倉庫供應(yīng)、交易跟蹤、數(shù)據(jù)同步、集中分發(fā)、容災(zāi)等多個場景下應(yīng)用。同時,GoldenGate可以實現(xiàn)一對一、廣播(一對多)、聚合(多對一)、雙向、點對點、級聯(lián)等多種靈活的拓撲結(jié)構(gòu)。
GoldenGate的工作詳細過程如下:
(1)捕獲進程:GoldenGate利用捕捉進程(Capture Process)在源系統(tǒng)端讀取Online Redo Log或Archive Log,然后進行解析,只提取其中數(shù)據(jù)的變化如增、刪、改操作,并將相關(guān)信息轉(zhuǎn)換為GoldenGate TDM自定義的中間格式存放在隊列文件中。
(2)傳送文件:利用傳送進程將隊列文件通過TCP/IP傳送到目標(biāo)系統(tǒng)。捕捉進程在每次讀完log中的數(shù)據(jù)變化并在數(shù)據(jù)傳送到目標(biāo)系統(tǒng)后,會寫檢查點,記錄當(dāng)前完成捕捉的log位置,檢查點的存在可以使捕捉進程在中止并恢復(fù)后可從檢查點位置繼續(xù)復(fù)制。目標(biāo)系統(tǒng)接受數(shù)據(jù)變化并緩存到GoldenGate TDM隊列當(dāng)中,隊列為一系列臨時存儲數(shù)據(jù)變化的文件,等待投遞進程讀取數(shù)據(jù)。
(3)投遞數(shù)據(jù):GoldenGate TDM投遞進程從隊列中讀取數(shù)據(jù)變化并創(chuàng)建對應(yīng)的SQL語句,通過數(shù)據(jù)庫的本地接口執(zhí)行,提交數(shù)據(jù)庫成功后更新自己的檢查點,記錄已經(jīng)完成復(fù)制的位置,數(shù)據(jù)的復(fù)制過程最終完成。
3.3 兩種上傳方式比較
表1 兩種上傳方式比較
從表1的比較可以看出:對于新增數(shù)據(jù)的導(dǎo)出,使用goldgate,需要的開發(fā)量(包括線程、時序的控制、數(shù)據(jù)轉(zhuǎn)換)較小,流程相對簡單,且及時性較強;對于存量數(shù)據(jù)的導(dǎo)出,goldengate方式耗時較少;對于海量數(shù)據(jù)的上傳,goldengate的準(zhǔn)確性較高;對原系統(tǒng)的影響、主數(shù)據(jù)的變更實現(xiàn)方式,兩者基本一致;因此,在海量數(shù)據(jù)的上傳中我們采用Goldengate方式。
使用Goldengate將海量數(shù)據(jù)從各省中間表上傳到統(tǒng)一平臺的中間表后,需要將中間表的數(shù)據(jù)入庫到統(tǒng)一平臺的數(shù)據(jù)庫中,新數(shù)據(jù)的入庫及舊數(shù)據(jù)的刪除過程中,也應(yīng)用了一些關(guān)鍵的技術(shù)。為了提高數(shù)據(jù)入庫的效率,在實際的運營中,我們采用了3種技術(shù):動態(tài)分區(qū)管理技術(shù)、并行度優(yōu)化管理技術(shù)及運用管道通信技術(shù)。
4.1 動態(tài)分區(qū)管理技術(shù)
各省上傳的數(shù)據(jù)是海量的,而存儲空間卻總是有限的,已上傳并存入中間表的數(shù)據(jù)在寫入統(tǒng)一平臺的數(shù)據(jù)庫后,仍會保留一段時間以便稽核,但到了一段時限,中間表中的這些數(shù)據(jù)保留的意義不大,需要清理這些數(shù)據(jù)來釋放存儲空間。清理過往的海量數(shù)據(jù),如果采用常規(guī)的delete的方式,效率會非常低,所以為了保證數(shù)據(jù)清理的效率,數(shù)據(jù)入庫和清理數(shù)據(jù)時,可以采用效率更高的動態(tài)分區(qū)的方式。
使用動態(tài)分區(qū)的方法如圖2。
(1)利用分區(qū)模板指定HASH分區(qū)數(shù)及存儲表空間。在制定分區(qū)數(shù)及存儲表空間時,可參考過往的各省的數(shù)據(jù)量的大小及發(fā)展趨勢。
圖2 動態(tài)分區(qū)管理技術(shù)
(2)數(shù)據(jù)的上傳會生成批次,當(dāng)有新批次的數(shù)據(jù)入庫時,首先根據(jù)分區(qū)模板,創(chuàng)建以批次號為分區(qū)ID的分區(qū),將數(shù)據(jù)入庫。
(3)如果是已有批次號的數(shù)據(jù)入庫時,首先判斷該批次對應(yīng)的分區(qū)是否存在,若存在,則通過drop清空數(shù)據(jù);創(chuàng)建新批次,進行數(shù)據(jù)入庫。
(4)當(dāng)需要刪除數(shù)據(jù)的時候,用drop 分區(qū)的方式來替代常規(guī)的delete,可以快速地刪除元數(shù)據(jù)和數(shù)據(jù)。
如A省每個月上傳當(dāng)月數(shù)據(jù),根據(jù)該省的數(shù)據(jù)情況制定分區(qū)模板。1月,A省上傳了全量數(shù)據(jù)到P201601分區(qū)中,2月,A省也上傳了全量數(shù)據(jù)到P260102分區(qū)中,3月,存儲空間不夠,需要刪除1月的數(shù)據(jù),就可以直接drop分區(qū)ID為P201601的分區(qū)。drop分區(qū)的效率比delete的數(shù)據(jù)效率高百倍以上,同時避免delete操作產(chǎn)生高水位表,影響數(shù)據(jù)庫性能。
4.2 并行度優(yōu)化管理技術(shù)
在海量數(shù)據(jù)的上傳和清理中,采用動態(tài)分區(qū)的方式來保證數(shù)據(jù)清理的效率。大數(shù)據(jù)量表均采用HASH分區(qū),而在對分區(qū)內(nèi)的數(shù)據(jù)進行操作時,可以通過在SQL語句中增加并行度參數(shù)((/*+append parallel(4)*/)),利用oracle并發(fā)處理機制,來提高數(shù)據(jù)入庫和查詢的性能。
方法如圖3。
圖3 并行度優(yōu)化管理技術(shù)
在從分區(qū)表1中往分區(qū)表2插入數(shù)據(jù)時,可以增加并行度,在分區(qū)一進行查詢時,也可以增加并行度。增加的并行度參數(shù)可以根據(jù)主機CPU的個數(shù)來進行配置。如以某省數(shù)據(jù)入庫為例,數(shù)據(jù)庫配置為16C配置,如果直接使用insert語句做插入操作,1 000萬數(shù)據(jù)入庫需花費120秒,如果增加并行度參數(shù),參數(shù)為8個并行度處理入庫,則入庫時間可縮短為20秒。
另外,由于大數(shù)據(jù)的增加刪除查詢操作會產(chǎn)生大量的redo,REDO記錄transaction logs,以恢復(fù)為目的(如機器停電,那么在重起之后需要online redo logs去恢復(fù)系統(tǒng)到失敗點),但對一個運營非常穩(wěn)定的系統(tǒng),如海量數(shù)據(jù)的入庫時,效率更加重要,可以減少redo以增加性能。這種情況下,在SQL語句中增加nologging,從而減少redo,加快數(shù)據(jù)入庫的速度。
4.3 管道通信技術(shù)
批量數(shù)據(jù)入庫時,采用工作流調(diào)度方式,包括校驗、入庫等環(huán)節(jié)。因為數(shù)據(jù)量巨大,校驗和入庫操作是耗時的操作。對于耗時的數(shù)據(jù)庫操作,可能因超時被斷開連接。
解決上述問題的方法是動態(tài)創(chuàng)建JOB進行耗時的校驗和入庫等操作,并通過oracle的管道獲取JOB執(zhí)行結(jié)果。
管道通信的具體使用方法如圖4。
圖4 管理通信技術(shù)
以A省數(shù)據(jù)入庫為例,有數(shù)據(jù)100萬條,后臺程序需逐一進行校驗和入庫,這是一個相當(dāng)耗時的操作,單個任務(wù)運行時,需要耗時3分鐘,當(dāng)有多個任務(wù)并行時,耗時可能超過10分鐘,在這10分鐘以內(nèi),數(shù)據(jù)的連接可能因為各種原因被自動斷開了,但應(yīng)用程序卻無法判斷是存儲過程是否出現(xiàn)了異常,因此需要等待并要做大量的業(yè)務(wù)邏輯判斷、監(jiān)控和控制。
通過Oracle管道方式能很好地解決這個問題。首先將數(shù)據(jù)的校驗和入庫寫成存儲過程,使用JOB將這個存儲過程作為任務(wù)提交到任務(wù)隊列中,然后將任務(wù)放在管道里,Oracle管道會將任務(wù)處理結(jié)果放在管道中,一段時間后,程序再去獲取管道的處理結(jié)果。這樣程序不用跟蹤任務(wù)進行的過程,只需定期去獲取任務(wù)的結(jié)果。
隨著大數(shù)據(jù)信息技術(shù)的不斷發(fā)展,海量數(shù)據(jù)的匯聚及應(yīng)用是一種發(fā)展趨勢。本文提出了一種海量數(shù)據(jù)上傳的解決方案,并對海量數(shù)據(jù)上傳的方式選擇、數(shù)據(jù)上傳流程及海量數(shù)據(jù)的讀寫等過程給出了合理的技術(shù)建議。
1 明日科技.Oracle 從入門到精通.北京:清華大學(xué)出版社,2012:80
2 Ben Prusinski&Steve Phillips&Richard Chung.Expert Oracle GoldenGate.美國:Apress,2011:30
10.3969/j.issn.1006-6403.2016.11.014
(2016-11-02)