本發(fā)明涉及時序數(shù)據(jù)庫,具體地說是一種時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法、系統(tǒng)、設(shè)備及介質(zhì)。
背景技術(shù):
::1、時序數(shù)據(jù)是指按時間順序記錄的數(shù)據(jù)集合,通常包含時間戳和對應(yīng)的觀測值。時間戳表示數(shù)據(jù)點的時間點,觀測值是在給定時間點上測量或記錄的數(shù)值、指標或事件。時序數(shù)據(jù)廣泛應(yīng)用于多個領(lǐng)域,如金融市場分析、氣象預(yù)測、交通流量監(jiān)測和生產(chǎn)過程監(jiān)控等。2、時序數(shù)據(jù)庫全稱時間序列數(shù)據(jù)庫,是一種專門用于存儲、分析和處理時序數(shù)據(jù)的數(shù)據(jù)庫管理系統(tǒng)。3、時序數(shù)據(jù)通常數(shù)據(jù)量大,采集頻率高,因此多數(shù)時序數(shù)據(jù)庫在設(shè)計過程中為實現(xiàn)實時高效的大規(guī)模數(shù)據(jù)寫入,不光針對性的提高了寫入速度,同時對刪除操作一般采取標記刪除的方式,即對刪除的數(shù)據(jù)行/列添加刪除標記,而不進行復(fù)雜且耗時的真實物理刪除。時序數(shù)據(jù)查詢分析要求高,尤其常見的是對一段時間內(nèi)的數(shù)據(jù)進行查詢分析,為滿足快速查詢分析,時序數(shù)據(jù)庫一般會將數(shù)據(jù)基于時間戳進行分區(qū),此外時序數(shù)據(jù)庫多采用列式文件存儲。由于采用列式文件進行數(shù)據(jù)存儲,因此在數(shù)據(jù)列類型修改時,為減少對寫入性能的影響一般不直接修改數(shù)據(jù),而是將該列元數(shù)據(jù)進行修改,只在讀取過程中進行數(shù)據(jù)轉(zhuǎn)換。4、時序數(shù)據(jù)庫的一些基本概念(不同時序數(shù)據(jù)庫表述不同,此處僅列舉一種本專利中涉及的表述方式):5、metric:度量,類似關(guān)系型數(shù)據(jù)庫中表(table)的概念,代表一系列同類型時序數(shù)據(jù)的集合。6、timestamp:時間戳。7、tags:標簽,數(shù)據(jù)源特征描述信息,一般不隨時間變化。8、fields:測量值,數(shù)據(jù)源的測量結(jié)果,一般隨時間不斷變化。9、其中的不同標簽組合實際上確定了一個單獨的實體,與其他實體進行區(qū)分。10、現(xiàn)有的時序數(shù)據(jù)庫庫存在如下問題:11、①時序數(shù)據(jù)庫數(shù)據(jù)標記刪除而不真正物理刪除導(dǎo)致的存儲空間占用大,存儲空間浪費問題。12、②亂序數(shù)據(jù)嚴重影響時序數(shù)據(jù)查詢速度。13、③數(shù)據(jù)列類型修改后在數(shù)據(jù)讀取過程中進行轉(zhuǎn)換,降低讀取速度,影響查詢效率。14、故如何能夠減少數(shù)據(jù)文件存儲空間占用,提高查詢效率,同時不影響數(shù)據(jù)庫系統(tǒng)在線正常使用是目前亟待解決的技術(shù)問題。技術(shù)實現(xiàn)思路1、本發(fā)明的技術(shù)任務(wù)是提供一種時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法、系統(tǒng)、設(shè)備及介質(zhì),來解決如何能夠減少數(shù)據(jù)文件存儲空間占用,提高查詢效率,同時不影響數(shù)據(jù)庫系統(tǒng)在線正常使用的問題。2、本發(fā)明的技術(shù)任務(wù)是按以下方式實現(xiàn)的,一種時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法,該方法具體如下:3、通過有序迭代器完成數(shù)據(jù)按照標簽分類、過濾無效數(shù)據(jù)、讀取數(shù)據(jù)以及將數(shù)據(jù)按照時間排序;4、將有序迭代器讀取的數(shù)據(jù)寫入數(shù)據(jù)文件并替換原文件;5、其中,有序迭代器查詢的是一組tags代表的實體在指定時間段內(nèi)的有效數(shù)據(jù),使用一種記錄數(shù)據(jù)塊地址和開始行號及累計行數(shù)的blockspan隊列將查詢的數(shù)據(jù)返回。6、作為優(yōu)選,blockspan隊列的結(jié)構(gòu)具體如下:7、struct?blockspan{8、blockitem*block_item;9、uint32_t?start_row;10、uint32_t?row_count;11、};12、其中,blockitem是一個數(shù)據(jù)block的元數(shù)據(jù),包含標簽、行數(shù)、最大/最小時間戳、是否有亂序數(shù)據(jù)的信息;13、start_row是迭代器要返回的數(shù)據(jù)起始行號;14、row_count是從start_row開始返回的連續(xù)累計行數(shù)。15、作為優(yōu)選,有序迭代器具有如下功能:16、①支持刪除數(shù)據(jù)過濾;17、②支持增加列后,歷史數(shù)據(jù)補齊(一般用null填充);18、③支持刪除列后歷史數(shù)據(jù)過濾;19、④支持字段類型變更后,歷史數(shù)據(jù)的讀取轉(zhuǎn)換;20、⑤支持數(shù)據(jù)排序。21、作為優(yōu)選,有序迭代器數(shù)據(jù)讀取過程具體如下:22、s1、根據(jù)tags獲取對應(yīng)的所有blockitems;23、s2、檢查blockitems是否亂序:24、s201、若blockitems未標記亂序,則遍歷每一個blockitem,獲取最大最小時間戳并檢查時間戳是否在指定時間段內(nèi):25、①若不在時間范圍內(nèi),則跳過并繼續(xù)遍歷;26、②若在時間范圍內(nèi),則遍歷相應(yīng)blockitem中的每一行;27、s202、若blockitems標記亂序,則執(zhí)行步驟s203;28、s203、初始化一個map<pair<timestamp64,timestamp64>,vector<block?item*>>interval_block_map,用于記錄所有的blockitem及其起止時間戳,可能有多個blockitem起止時間范圍一致,因此同一組時間戳對應(yīng)的多個bloc?kitem要追加到vector中,并遍歷所有的blockitem并將其記錄在interval_block_map;29、s204、對interval_block_map的pair<timestamp64,timestamp64>進行排序,排序結(jié)果存放在vector<vector<timestamp64>>intervals中,interv?als最終存放的是所有blockitems的時間戳的有序隊列;30、s205、遍歷intervals的每一組時間戳,在interval_block_map中找到以對應(yīng)組時間戳為key的vector<blockitem*>,將key和對應(yīng)的value追加到v?ector<pair<pair<timestamp64,timestamp64>,vector<blockitem*>>>bloc?k_items,繼續(xù)遍歷intervals的下一組時間戳;31、s206、intervals遍歷完成后block_items中記錄完整有序的blockitems,此時問題收斂到處理有序blockitems,并轉(zhuǎn)到步驟s201繼續(xù)執(zhí)行。32、更優(yōu)地,遍歷相應(yīng)blockitem中的每一行具體如下:33、遍歷到第一行在時間范圍內(nèi)且未標記刪除的數(shù)據(jù),在blockspan隊列中記錄blockitem,并將相應(yīng)行號作為起始行號start_row,繼續(xù)遍歷并記錄累計連續(xù)行數(shù)直到當前blockitem遍歷完成或任一行數(shù)據(jù)未在時間范圍內(nèi)或任一行數(shù)據(jù)被標記刪除,連續(xù)行結(jié)束,在blockspan中更新累計連續(xù)行數(shù)row_count,將blockspan添加到blockspans隊列,重復(fù)執(zhí)行直至所有數(shù)據(jù)遍歷完成,并返回篩選排序完成后的blockspans。34、更優(yōu)地,將有序迭代器讀取的數(shù)據(jù)寫入數(shù)據(jù)文件并替換原文件具體如下:35、(1)創(chuàng)建臨時數(shù)據(jù)文件分區(qū),在臨時數(shù)據(jù)文件分區(qū)中按照最新的元數(shù)據(jù)創(chuàng)建表和列文件;36、(2)遍歷臨時分區(qū)列的元數(shù)據(jù),讀取有序迭代器返回數(shù)據(jù)的對應(yīng)列:37、若讀取數(shù)據(jù)中未對應(yīng)列,則說明相應(yīng)列是新增列,臨時分區(qū)相應(yīng)列用null填充;38、若讀取數(shù)據(jù)中列類型與臨時分區(qū)列的元數(shù)據(jù)不一致,則說明相應(yīng)列類型修改,將有序迭代器中數(shù)據(jù)按照原始類型讀取出來,并將原始類型轉(zhuǎn)換為臨時分區(qū)中最新的列類型,并寫入臨時分區(qū)列文件;39、(3)全部列文件遍歷寫入完成后,嘗試對相應(yīng)分區(qū)加鎖,成功加鎖后,使用臨時分區(qū)替換舊分區(qū),并清除緩存,重新加載分區(qū)及元數(shù)據(jù);40、(4)替換完成后進行殘留文件清理。41、一種時序數(shù)據(jù)庫在線數(shù)據(jù)重組系統(tǒng),該系統(tǒng)包括:42、讀取模塊,用于通過有序迭代器完成數(shù)據(jù)按照標簽分類、過濾無效數(shù)據(jù)、讀取數(shù)據(jù)以及將數(shù)據(jù)按照時間排序;43、數(shù)據(jù)寫入及替換模塊,用于將有序迭代器讀取的數(shù)據(jù)寫入數(shù)據(jù)文件并替換原文件,具體為:根據(jù)原始數(shù)據(jù)元數(shù)據(jù)及最新版本元數(shù)據(jù)進行列類型轉(zhuǎn)換后寫入,對原始數(shù)據(jù)中未新增列使用null完成填充,同時對比原始數(shù)據(jù),最新版本元數(shù)據(jù)中未存在的列說明已經(jīng)被刪除,無需再次寫入到重組數(shù)據(jù)文件中;44、其中,有序迭代器查詢的是一組tags代表的實體在指定時間段內(nèi)的有效數(shù)據(jù),使用一種記錄數(shù)據(jù)塊地址和開始行號及累計行數(shù)的blockspan隊列將查詢的數(shù)據(jù)返回。45、作為優(yōu)選,讀取模塊的工作過程具體如下:46、s1、根據(jù)tags獲取對應(yīng)的所有blockitems;47、s2、檢查blockitems是否亂序:48、s2a、若blockitems未標記亂序,則執(zhí)行步驟s2a1到步驟s2a3:49、s2a1、遍歷每一個blockitem,獲取blockitem的最大最小時間戳并檢查時間戳是否在指定時間段內(nèi):50、若未在時間范圍內(nèi),則跳過并繼續(xù)遍歷;51、若在時間范圍內(nèi),則遍歷相應(yīng)blockitem中的每一行,即執(zhí)行步驟s2a2;52、s2a2、首先要遍歷到第一行在時間范圍內(nèi)且未標記刪除的數(shù)據(jù),在blocks?pan中記錄blockitem,并將相應(yīng)行號作為起始行號start_row,繼續(xù)遍歷并記錄累計連續(xù)行數(shù)直到當前blockitem遍歷完成或任一行數(shù)據(jù)未在時間范圍內(nèi)或任一行數(shù)據(jù)被標記刪除,連續(xù)行結(jié)束,在blockspan中更新累計連續(xù)行數(shù)row_count,將blockspan添加到blockspans隊列,重復(fù)執(zhí)行直至所有數(shù)據(jù)遍歷完成;53、s2a3、返回篩選排序完成后的blockspans;54、s2b、若blockitems標記亂序,則執(zhí)行步驟s2b1到步驟s2b:55、s2b1、初始化一個map<pair<timestamp64,timestamp64>,vector<block?item*>>interval_block_map,用于記錄所有的blockitem及其起止時間戳,可能有多個blockitem起止時間范圍一致,因此同一組時間戳對應(yīng)的多個bloc?kitem要追加到vector中,并遍歷所有的blockitem并將其記錄在interval_block_map;56、s2b2、對interval_block_map的pair<timestamp64,timestamp64>進行排序,排序結(jié)果存放在vector<vector<timestamp64>>intervals中,interv?als最終存放的是所有blockitems的時間戳的有序隊列;57、s2b3、遍歷intervals的每一組時間戳,在interval_block_map中找到以相應(yīng)組時間戳為key的vector<blockitem*>,將key和對應(yīng)的value追加到v?ector<pair<pair<timestamp64,timestamp64>,vector<blockitem*>>>bloc?k_items,繼續(xù)遍歷intervals的下一組時間戳;58、s2b4、intervals遍歷完成后block_items中記錄完整有序的blockitems,此時問題收斂到處理有序blockitems,跳轉(zhuǎn)到步驟s2a繼續(xù)執(zhí)行。59、一種電子設(shè)備,包括:存儲器和至少一個處理器;60、其中,所述存儲器上存儲有計算機程序;61、所述至少一個處理器執(zhí)行所述存儲器存儲的計算機程序,使得所述至少一個處理器執(zhí)行如上述的時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法。62、一種計算機可讀存儲介質(zhì),所述計算機可讀存儲介質(zhì)中存儲有計算機程序,所述計算機程序可被處理器執(zhí)行以實現(xiàn)如上述的時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法。63、本發(fā)明的時序數(shù)據(jù)庫在線數(shù)據(jù)重組方法、系統(tǒng)、設(shè)備及介質(zhì)具有以下優(yōu)點:64、(一)本發(fā)明實現(xiàn)了數(shù)據(jù)庫數(shù)據(jù)整理,減少存儲空間占用,數(shù)據(jù)重組過程中通過有序迭代器進行數(shù)據(jù)分類、排序,并進行可能存在的類型轉(zhuǎn)換,提高時序數(shù)據(jù)查詢效率,同時數(shù)據(jù)重組在線進行,無需停機,不影響數(shù)據(jù)庫系統(tǒng)正常使用;65、(二)本發(fā)明能夠減少數(shù)據(jù)文件存儲空間占用,提高查詢效率,同時不影響數(shù)據(jù)庫系統(tǒng)在線正常使用,解決了時序數(shù)據(jù)庫數(shù)據(jù)標記刪除而不真正物理刪除導(dǎo)致的存儲空間占用大,存儲空間浪費問題、亂序數(shù)據(jù)嚴重影響時序數(shù)據(jù)查詢速度以及數(shù)據(jù)列類型修改后在數(shù)據(jù)讀取過程中進行轉(zhuǎn)換,降低讀取速度,影響查詢效率的問題;66、(三)本發(fā)明通過有序迭代器組織讀取原始時序數(shù)據(jù),讀取過程中完成標記刪除數(shù)據(jù)過濾,并按照時間戳完成排序,數(shù)據(jù)寫入和替換時通過比對最新元數(shù)據(jù)與有序迭代器讀取到數(shù)據(jù)的元數(shù)據(jù),實現(xiàn)已標記刪除列過濾,填充新增列,轉(zhuǎn)換列類型,完成數(shù)據(jù)重組,數(shù)據(jù)重組完成后釋放標記刪除的數(shù)據(jù)存儲空間,優(yōu)化磁盤空間占用,同時完成數(shù)據(jù)分類排序,提高查詢效率;67、(四)本發(fā)明的有序迭代器基于常規(guī)迭代器,使用一種記錄數(shù)據(jù)塊地址和開始行號及累計行數(shù)的blockspan結(jié)構(gòu)隊列存儲讀取完成的列數(shù)據(jù);68、(五)本發(fā)明在讀取數(shù)據(jù)寫入過程中根據(jù)原始數(shù)據(jù)元數(shù)據(jù)及最新版本元數(shù)據(jù)進行列類型轉(zhuǎn)換后寫入,對原始數(shù)據(jù)中沒有的新增列使用null完成填充;69、(六)本發(fā)明在讀取數(shù)據(jù)寫入過程中對比原始數(shù)據(jù),最新版本元數(shù)據(jù)中不存在的列說明已經(jīng)被刪除,無需再次寫入到重組數(shù)據(jù)文件中。當前第1頁12當前第1頁12