如何將資料熱匯出到檔案
隨著時間推移,資料庫中資料量會越來越大,如果把查詢分析都掛到資料庫上,有可能會影響到生產系統的正常執行。所以,一般都會將生產資料庫中不再變動的資料定期移出到另一個分析資料庫中,由分析資料庫來承擔查詢分析的壓力。
不過,我們知道,檔案系統比資料庫有更好的IO效能,對於不再變動的歷史資料,使用檔案還可以採用更靈活的壓縮技術。這樣,如果我們把移出的資料儲存到檔案中,只要有好的計算引擎(比如集算器),那麼基於檔案計算將獲得比分析資料庫更好的效能,而歷史資料常常巨大,效能提升很有意義。
要實現這種結構,需要定期把歷史資料從生產資料庫中匯出到檔案,這看起來也沒什麼難的,匯出是很常規的資料庫操作。
如果是冷匯出,那確實沒什麼。所謂冷匯出,是指在資料匯出過程中,基於檔案的查詢分析系統會暫停使用,等匯出完畢後再繼續使用。比如在每天夜間沒有查詢工作的時候進行,把匯出的新歷史資料追加到原來的檔案之後就可以了,有需要建索引的情況也可以同時維護好。
但是如果是熱匯出,情況就不一樣了。所謂熱匯出,是指查詢分析系統永不停機,隨時需要能響應請求。而資料匯出本身也需要時間,在匯出的過程之中仍然可能有查詢請求進來。但是,這種有特殊格式的檔案在追加和維護(索引)過程中,經常是不可用的,這時候就不能在匯出資料的同時還響應查詢請求了。
採用資料庫卻沒有這個問題。原因是資料庫擁有事務一致性的能力,在資料寫入(匯出對於目標資料庫來講是寫入)過程中,資料庫仍然可以應對查詢請求,並且不會使尚未完全寫入的資料參與查詢。不過,如果每批資料量寫入太多時,也會給目標資料庫造成較大的負擔,資料庫回滾機制的成本並不低。
那麼,我們怎麼能夠即享受到檔案的高效能,又支援不停機的熱匯出呢?
一個簡單的辦法是把資料檔案拆細。比如,假如資料是每天匯出,那麼就可以每天儲存一個檔案,每次匯出時形成新檔案,在匯出過程中原有的檔案不變,可以繼續使用。新的一天的檔案匯出維護完成後,在某個時刻才開始啟用。比如每天0點開始匯出前一天資料,假定一小時內能全部完成,則可以約定凌晨1點起啟用新檔案資料(即1點以後的查詢將開始使用這個新檔案)。這樣的壞處是檔案系統中積累過多碎檔案,對管理造成麻煩,而且每次查詢時都可能要涉及多個檔案,運算程式碼不好寫而且效能也會受到影響。
在資料庫一致效能力的支援下,再配合備份檔案,我們還是可以實現將資料熱匯出成單一檔案。
準備工作:
● 將資料檔案複製成相同的兩份:A份和B份,平時查詢使用A份;
● 在(生產)資料庫中建立表X,用於記錄當前查詢正在使用的資料檔案是A份還是B份,以及當前正在執行的查詢。
查詢響應過程:
● 從X中讀出當前使用哪個資料檔案,並在X中寫入一條記錄表示當前查詢開始,需要生成一個唯一碼,同時記錄該查詢基於哪個資料檔案;
● 使用相應的資料檔案進行查詢計算並獲得返回資料後;
● 將步驟1中寫入的記錄刪除(用生成的唯一碼),表示查詢已經結束。
匯出過程:
● 開始匯出資料時,此時X中記錄的當前使用檔案為A,將這個值改為B,後續出現的查詢將基於B進行;
● 等待X中基於A的查詢全部結束,即X中不再有關於A的查詢記錄,此時A已不再被任何查詢使用了;
● 現在可以匯出資料追加到檔案A,完成A的維護工作;
● 將X中記錄的當前使用檔案改為A,再有的查詢將轉回基於A進行;
● 等待X中基於B的查詢全部結束;
● 將A追加的資料也同時追加給B(這時只要讀A,不會影響A上的運算),完成B的維護工作,B進入可用狀態,匯出結束。
基本原理是在匯出資料過程中使用另一個檔案,完成匯出後再換回來去維護備份檔案。期間要考慮到查詢的併發性,藉助資料庫的一致性確保不會發生寫入和查詢在同一個時刻針對同一檔案進行。併發讀寫導致的錯誤,不是刻意或大規模使用時很難測試出來,在設計時要特別小心。
許多機構期望資料庫系統能支援T+0全量實時查詢,在資料量很大時一般只能進行資料庫擴容了(包括上述分庫手段也需要擴容資料倉儲),成本高昂。如果採用檔案系統和生產資料庫混合運算,就可以實現低成本高效能的T+0查詢了,而熱匯出機制則是這個方案的基礎(需要進行簡單改造,在X表中記錄檔案中資料的截止時刻,超過此時刻的查詢請求將轉給生產資料庫去執行)。
不過,這個過程確實有些複雜,實現起來還是很麻煩,我們在乾學院上放一個以T+0查詢為目標而實現的熱匯出例程(http://c.raqsoft.com.cn/article/1541494770016)另外,在新的集算器倉庫版也將支援這一機制,直接向組表追加資料就可以了,集算器會自動處理熱匯出中的問題。當然,集算器不能依賴有資料庫,它會自己實現一致性效果。
原文釋出時間為:2018-11-6
本文作者:蔣步星
本文來自雲棲社群合作伙伴“資料蔣堂”,瞭解相關資訊可以關注“資料蔣堂”。
相關文章
- 將資料匯出到ExcelExcel
- 將dataGridView內容匯出到Excel檔案ViewExcel
- MySQL 將查詢結果匯出到檔案MySql
- 從hive將資料匯出到mysql(轉)HiveMySql
- 定時將表資料匯出到文字檔案的初步解決方案,求改進
- 如何將資料從Hadoop匯出到關係型和NoSQL資料庫?HadoopSQL資料庫
- 阿里雲數倉Dataworks資料匯出到檔案step by step阿里
- 用SQL Loader將Excel資料匯出到OracleSQLExcelOracle
- 將Buffer Cache內容強制寫出到資料檔案
- 將MYSQL中資料匯出到EXCEL表MySqlExcel
- MSSQL資料匯出到MYSQLMySql
- 如何將 JSON, Text, XML, CSV 資料檔案匯入 MySQLJSONXMLMySql
- 大文字資料,匯入匯出到資料庫資料庫
- 【FLUSH】將Buffer Cache內容強制寫出到資料檔案
- Oracke大欄位Blob匯出到檔案
- 教你如何將二進位制檔案匯入到資料庫資料庫
- 轉載:利用SQL*Loader將 Excel 資料匯出到資料庫中SQLExcel資料庫
- Docker將映象檔案釋出到私服庫Docker
- 將altibase記憶體庫的表匯出到oracle資料庫記憶體Oracle資料庫
- 將命令列提示符裡的執行結果匯出到text檔案中命令列
- Docker將映象檔案釋出到阿里雲Docker阿里
- MYSQL資料檔案匯入MySql
- 實用小指令碼——mysql/mongo 匯出到本地檔案指令碼MySqlGo
- Oracle工具之sqlldr的使用--如何將文字檔案或Excel中的資料匯入資料庫OracleSQLExcel資料庫
- hive匯出到csv hive匯出到excelHiveExcel
- django實現將後臺資料excel檔案形式匯出DjangoExcel
- 如何將Excl內資料匯入資料庫?資料庫
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- 如何將資料庫中的資料導成 excel 檔案資料庫Excel
- 如何用Java將excel資料匯入資料庫JavaExcel資料庫
- 如何從MySQL中將變化的事件資料釋出到Kafka?MySql事件Kafka
- ORACLE資料匯出到Excel、txt、HTML實用方法OracleExcelHTML
- 如何將日誌檔案和二進位制檔案快速匯入HDFS?
- 如何實現一個功能,將oracle中一個使用者下的所有表結構匯出到.sql檔案中OracleSQL
- 如何將Chrome本地安裝的擴充套件應用匯出到本地Chrome套件
- PHP 匯出大資料 CSV 檔案PHP大資料
- PHP 匯入資料庫 sql 檔案PHP資料庫SQL
- 資料庫遠端檔案匯入資料庫