本發(fā)明屬于海量數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種分布式對象存儲系統(tǒng)的數(shù)據(jù)閃回方法及裝置,解決海量對象數(shù)據(jù)的版本閃回及過期版本清理問題。
背景技術(shù):
近些年來,博客(blog)、維基百科(wiki)、共享空間(spaces)等新型應(yīng)用的興起導(dǎo)致互聯(lián)網(wǎng)內(nèi)容的提供方式出現(xiàn)轉(zhuǎn)變,催生了用戶創(chuàng)造內(nèi)容的web2.0時代到來,帶動著視頻應(yīng)用、網(wǎng)絡(luò)游戲、搜索引擎等互聯(lián)網(wǎng)衍生業(yè)務(wù)迅速發(fā)展。這些應(yīng)用每天都在產(chǎn)生海量的對象數(shù)據(jù),包括圖片、文檔、視頻等,隨著這些對象數(shù)據(jù)在應(yīng)用中扮演越來越重要的角色(很難想象類似淘寶這樣的平臺沒有了圖片會是什么景象),在很多場景下我們越來越希望用于存放這些對象數(shù)據(jù)的存儲系統(tǒng)能夠具備閃回的特性,即能夠在對象數(shù)據(jù)被錯誤更新或刪除時能夠快速地恢復(fù)到錯誤操作前的某個狀態(tài),并且閃回操作應(yīng)不影響在錯誤發(fā)生期間的其它正常寫操作,即閃回不能對正常寫操作形成“誤傷”。
近些年NOSQL領(lǐng)域得到了大力發(fā)展,出現(xiàn)了大量的NOSQL產(chǎn)品,它們以強(qiáng)大的可擴(kuò)展性,很好地解決了這些海量對象數(shù)據(jù)的存儲問題;然而不幸地是,對于人們所期望的閃回能力,市面上除了傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(如:oracle、mysql),幾乎還沒有NOSQL產(chǎn)品具備。由于對象數(shù)據(jù)的海量特性,關(guān)系型數(shù)據(jù)庫越來越被認(rèn)為不適合對象數(shù)據(jù)的存儲;所以,要增強(qiáng)海量對象數(shù)據(jù)的安全性,還必須在NOSQL方向上,針對閃回特性有所研究和突破。
對于閃回機(jī)制,關(guān)系型數(shù)據(jù)庫基本上都是基于數(shù)據(jù)操作日志設(shè)計并實現(xiàn)的,這也是數(shù)據(jù)存儲領(lǐng)域?qū)?shù)據(jù)閃回的通行做法。目前的NOSQL產(chǎn)品的存儲引擎一部分是基于數(shù)據(jù)操作日志設(shè)計、實現(xiàn)的,對于這些存儲引擎,如果要增加數(shù)據(jù)閃回的能力,就必須掌握對應(yīng)產(chǎn)品的數(shù)據(jù)操作日志的具體設(shè)計和使用方法,并基于這些對數(shù)據(jù)操作日志進(jìn)行挖掘,進(jìn)而開發(fā)出類似數(shù)據(jù)閃回的功能。這種做法有幾個問題:首先,需要耗費(fèi)大量的精力研究某一款存儲引擎的底層實現(xiàn)細(xì)節(jié),如果不能吃透底層的實現(xiàn)細(xì)節(jié),就難以確保能夠正確挖掘數(shù)據(jù)操作日志;其次,當(dāng)某一款存儲引擎的底層實現(xiàn)有所變化時,又需要重新評估這些變化對閃回特性具體實現(xiàn)的影響,甚至有可能需要重新實現(xiàn)閃回特性;最后,這樣一種針對某一款存儲引擎的挖掘方法,并不具有一定的普適性,投入性價比不高。對于另外一部分根本就沒有引入數(shù)據(jù)操作日志概念的存儲引擎,就連實現(xiàn)閃回的數(shù)據(jù)基礎(chǔ)都不存在了。
在數(shù)據(jù)閃回問題上,專利《多鏡像數(shù)據(jù)的回滾處理系統(tǒng)和回滾處理方法》(申請?zhí)枺?01310460975.8)和專利《一種實現(xiàn)云數(shù)據(jù)庫回滾的方法及系統(tǒng)》(申請?zhí)枺?01210379626.9)做了相關(guān)研究,其提出的方法主要為:建立數(shù)據(jù)鏡像服務(wù)器,系統(tǒng)周期性地向鏡像服務(wù)器上傳數(shù)據(jù)差異鏡像(鏡像文件可能是數(shù)據(jù)操作日志文件);數(shù)據(jù)存儲系統(tǒng)接收到用戶的回滾指令后,從鏡像服務(wù)器上下載對應(yīng)的差異鏡像,并執(zhí)行鏡像文件(如鏡像文件為數(shù)據(jù)操作日志,則重演數(shù)據(jù)操作過程)。上述專利提出的方法在一定程度上解決了數(shù)據(jù)備份和回滾的問題,然而它們都需要建立額外的數(shù)據(jù)鏡像服務(wù)器,并且需要解決鏡像文件的定義、序列化和反序列化問題,其復(fù)雜度較高;另外,它們都是針對時間周期鏡像的備份和回滾,缺乏回滾的精確性(比如只回滾某個特定的記錄數(shù)據(jù)),即難以避免閃回過程對正確操作形成的“誤傷”;最后,上述專利似乎較難達(dá)到閃回的速度,試想如果要回滾一個大批量的刪除操作,上述專利方案將涉及大量的數(shù)據(jù)下載,不太可能達(dá)到瞬間回滾的效果。
技術(shù)實現(xiàn)要素:
為解決上述海量對象數(shù)據(jù)的閃回問題,本發(fā)明目的是,提供一種分布式對象存儲系統(tǒng)的數(shù)據(jù)閃回及過期版本數(shù)據(jù)的自動清除方法;旨在提供一種不依賴于外部備份服務(wù),而實現(xiàn)數(shù)據(jù)多版本備份,并在需要時能夠按照指定版本進(jìn)行快速數(shù)據(jù)回滾的方法及裝置;同時此方法及裝置能夠按照數(shù)據(jù)備份的時效性要求,自動進(jìn)行過期版本數(shù)據(jù)的清理,從而釋放其占用的相關(guān)資源;最后本發(fā)明并不是一種基于特定存儲引擎的特性而定制的,而是一種建立在存儲引擎基本讀/寫特性之上的方法,因此是一種具有較好的普適性的方法。
本發(fā)明的技術(shù)方案如下:本發(fā)明提供一種分布式對象存儲系統(tǒng)閃回裝置,包括:數(shù)據(jù)本體庫(primary-database)、數(shù)據(jù)備份庫(back-database)、數(shù)據(jù)服務(wù)版本庫(servering-database)三個基本的數(shù)據(jù)存儲單元,后續(xù)的閃回及正常的數(shù)據(jù)讀/寫功能都基于這三個數(shù)據(jù)存儲單元實現(xiàn);本裝置還包括數(shù)據(jù)版本生成器(Version-generator)、閃回功能模塊(FlashBacker)、過期版本數(shù)據(jù)清理模塊(ObsoletedData-clearner)三個功能模塊;
所述數(shù)據(jù)本體庫primary-database,是整個裝置中存儲對象數(shù)據(jù)本體的單元,針對某個業(yè)務(wù)主鍵的所有歷次發(fā)生的數(shù)據(jù)變更都會以獨(dú)立版本的形式存儲于primary-database中,而對過期版本的自動清理將確保primary-database不會因為多版本而持續(xù)過度膨脹。
所述數(shù)據(jù)備份庫back-database,每次針對某個業(yè)務(wù)主鍵發(fā)生數(shù)據(jù)更新和刪除操作都會形成相應(yīng)的歷史版本,這些歷史版本信息將被額外地記錄到back-database中,以備后續(xù)的閃回操作能夠從中找到需要回滾的數(shù)據(jù)版本信息。需要特別說明的是,back-database中實際只記錄了歷史數(shù)據(jù)對應(yīng)的版本信息,而不包含數(shù)據(jù)本體;另外,back-database中的記錄信息實際上都包含在寫入記錄時的主鍵中,如此可以充分利用主鍵索引的高性能特性快速地從back-database中獲取到數(shù)據(jù)的歷史版本及對應(yīng)時間戳信息。
所述數(shù)據(jù)服務(wù)版本庫servering-database,本發(fā)明中,讀操作將首先從此裝置中獲取某個業(yè)務(wù)主鍵對應(yīng)的服務(wù)版本信息,所以此裝置中需要存放業(yè)務(wù)主鍵對應(yīng)的服務(wù)版本信息,這些信息具體是由寫操作(包括新增、刪除、更新)對此裝置中的對應(yīng)信息進(jìn)行修改而來;此外,閃回操作也將修改此裝置中的信息,以使得讀操作能夠獲取想要閃回的數(shù)據(jù)版本信息。需要特別說明的是,servering-database中實際只記錄了服務(wù)版本信息,而不包含數(shù)據(jù)本體;另外,servering-database中的記錄信息實際上都包含在寫入記錄時的主鍵中,如此可以充分利用主鍵索引的高性能特性快速地從servering-database中獲取到數(shù)據(jù)的歷史版本及對應(yīng)時間戳信息。
所述閃回功能模塊FlashBacker,作為數(shù)據(jù)閃回的控制模塊,F(xiàn)lashBacker將從back-database中計算出某個時間點(diǎn)上相應(yīng)記錄了的版本信息,再將此版本信息修復(fù)到servering-database中,從而使得外部讀操作能夠獲取到想要的閃回版本數(shù)據(jù)。
所述過期版本數(shù)據(jù)清理模塊ObsoletedData-clearner,此裝置模塊主要是通過判定back-database中的數(shù)據(jù)版本是否過期,并將那些過期的版本數(shù)據(jù)從primary-database中移除來達(dá)到清理垃圾版本數(shù)據(jù)的目的。
一種分布式對象存儲系統(tǒng)閃回方法,包括分布式對象存儲系統(tǒng)的數(shù)據(jù)的寫入及讀取、數(shù)據(jù)的刪除、數(shù)據(jù)的閃回及過期版本數(shù)據(jù)的清除;基于key-value數(shù)據(jù)模型的存儲引擎,構(gòu)建三個數(shù)據(jù)存儲單元:包括數(shù)據(jù)本體庫(下文稱primary-database)、數(shù)據(jù)備份庫(下文稱back-database)、數(shù)據(jù)服務(wù)版本庫(下文稱servering-database);當(dāng)存儲系統(tǒng)接收到對數(shù)據(jù)的操作請求時,基于三個數(shù)據(jù)存儲單元執(zhí)行寫入及讀取、數(shù)據(jù)的刪除、數(shù)據(jù)的閃回及過期版本數(shù)據(jù)的清除;
所述數(shù)據(jù)的寫入,包括針對寫入數(shù)據(jù)生成唯一的數(shù)據(jù)版本號;將數(shù)據(jù)版本號、數(shù)據(jù)寫入的系統(tǒng)時間戳及寫入對象數(shù)據(jù)的業(yè)務(wù)主鍵生成存儲主鍵;根據(jù)已有的相同寫入對象數(shù)據(jù)的所有版本,計算最新版本數(shù)據(jù)并在數(shù)據(jù)服務(wù)版本庫單獨(dú)存儲,其他非最新版本在數(shù)據(jù)備份庫進(jìn)行備份;所述業(yè)務(wù)主鍵,它是在存儲系統(tǒng)存入對象數(shù)據(jù)時,為對象數(shù)據(jù)構(gòu)建的唯一主鍵,主鍵內(nèi)容主要包括對象數(shù)據(jù)的業(yè)務(wù)屬性;
所述數(shù)據(jù)的讀取,包括根據(jù)數(shù)據(jù)讀取請求,從數(shù)據(jù)服務(wù)版本庫讀取當(dāng)前與數(shù)據(jù)業(yè)務(wù)主鍵對應(yīng)的版本號;基于版本號,從數(shù)據(jù)本體庫讀取該對象數(shù)據(jù)的具體信息;
所述數(shù)據(jù)的刪除,是指對服務(wù)中的某一個特定版本數(shù)據(jù)的刪除;包括根據(jù)請求刪除的數(shù)據(jù)版本確定該數(shù)據(jù)的存儲主鍵,并從數(shù)據(jù)服務(wù)版本庫刪除,同時放入數(shù)據(jù)備份庫中備份留存;刪除某指定記錄時,并不刪除數(shù)據(jù)本體庫中的數(shù)據(jù)本體,留待以后可能的“閃回”;
特別地,由于數(shù)據(jù)閃回的需要,因而在數(shù)據(jù)刪除時,僅刪除數(shù)據(jù)服務(wù)版本庫中數(shù)據(jù),保留數(shù)據(jù)本體庫中相關(guān)該數(shù)據(jù)的數(shù)據(jù)本體;
所述數(shù)據(jù)的閃回及過期版本數(shù)據(jù)的清除,包括通過備份數(shù)據(jù)庫計算閃回到的時間點(diǎn),并根據(jù)時間點(diǎn)確認(rèn)數(shù)據(jù)閃回到的數(shù)據(jù)版本和過期的數(shù)據(jù)版本;依據(jù)版本號向數(shù)據(jù)服務(wù)版本庫中覆蓋性寫入該數(shù)據(jù)的存儲主鍵,同時從備份數(shù)據(jù)庫中刪除已過期的數(shù)據(jù)。
當(dāng)分布式對象存儲系統(tǒng)接收到數(shù)據(jù)寫入請求時,進(jìn)入步驟1-1;
步驟1-1:調(diào)用數(shù)據(jù)版本生成器(下文稱version-generator)生成針對當(dāng)前預(yù)寫入的對象數(shù)據(jù)的唯一版本號,此唯一版本號將作為相同業(yè)務(wù)主鍵數(shù)據(jù)間的區(qū)別標(biāo)識;
步驟1-2:整合步驟1產(chǎn)生的數(shù)據(jù)版本、當(dāng)前系統(tǒng)時間戳和業(yè)務(wù)主鍵,生成該寫入對象數(shù)據(jù)的存儲主鍵,并將生成的存儲主鍵寫入數(shù)據(jù)本體庫primary-database中,作為對該對象數(shù)據(jù)的記錄;
步驟1-3:針對某個業(yè)務(wù)主鍵數(shù)據(jù)在primary-database中可能存在多個不同數(shù)據(jù)版本,為保證讀操作能及時讀取到最新的服務(wù)數(shù)據(jù),primary-database在進(jìn)行寫入操作時計算出當(dāng)前該業(yè)務(wù)主鍵數(shù)據(jù)在primary-database中的最新數(shù)據(jù)版本;
步驟1-4:將步驟1-3計算出來的最新版本覆蓋性地寫入到servering-database中,確保servering-database中只包含一條針對特定業(yè)務(wù)主鍵數(shù)據(jù)的記錄,使讀操作第一時間獲取到新版數(shù)據(jù)的服務(wù)版本信息;
步驟1-5:為保證后續(xù)數(shù)據(jù)閃回的需要,計算出primary-database中針對當(dāng)前業(yè)務(wù)主鍵數(shù)據(jù)的非最新版本,并將上述這些非最新版本的數(shù)據(jù)寫入到back-database中;
特別地,步驟1-2至步驟1-5向primary-database、back-database、servering-database的寫入操作必須是原子的,所謂操作是原子的,是指在具備事務(wù)特性的存儲引擎中,步驟1-2至步驟1-5在同一事務(wù)中完成。
當(dāng)存儲系統(tǒng)接收刪除對象數(shù)據(jù)的請求時,進(jìn)入步驟2-1:系統(tǒng)接收到需要刪除特定業(yè)務(wù)主鍵對應(yīng)的某一個特定版本的數(shù)據(jù)請求;步驟2-2:根據(jù)請求中的業(yè)務(wù)主鍵及版本號,在servering-database中尋找對應(yīng)的數(shù)據(jù)記錄,并從servering-database中刪除;步驟2-3:由于所刪除的數(shù)據(jù)當(dāng)前已不再被執(zhí)行讀操作,將該數(shù)據(jù)的存儲主鍵寫入back-database中,以備數(shù)據(jù)閃回的需要;
特別地,在刪除特定版本的對象數(shù)據(jù)過程中,步驟2-2-步驟2-3向back-database、servering-database的寫入操作必須是原子的,所謂操作是原子的,是指在具備事務(wù)特性的存儲引擎中,步驟2-2至步驟2-3在同一事務(wù)中完成。
當(dāng)存儲系統(tǒng)將某個業(yè)務(wù)對象數(shù)據(jù)閃回到指定時間點(diǎn)版本,具體步驟包括:
步驟3-1:由于back-database中保留了某個業(yè)務(wù)對象數(shù)據(jù)的所有歷史版本信息,因而借助back-database能計算出閃回到指定時間點(diǎn)上該業(yè)務(wù)對象數(shù)據(jù)對應(yīng)的版本號,并將該版本號作為數(shù)據(jù)回滾的即將回滾的版本號;
步驟3-2:根據(jù)步驟1計算所得版本號,向servering-database覆蓋性地寫入包含該版本號的存儲主鍵;
步驟3-3:根據(jù)數(shù)據(jù)閃回到的數(shù)據(jù)版本,按照對應(yīng)的版本號刪除該版本數(shù)據(jù)在back-database中的記錄;
步驟3-4:當(dāng)數(shù)據(jù)成功閃回之前某一時刻的數(shù)據(jù)版本時,掃描back-database,按照時間戳查找back-database中是否存在超過當(dāng)前數(shù)據(jù)閃回到的時間點(diǎn);如果有,轉(zhuǎn)步驟3-5;
步驟3-5:根據(jù)步驟3-4的判斷,在back-database中超過當(dāng)前數(shù)據(jù)閃回到的時間點(diǎn)的數(shù)據(jù)版本,被判定為過期版本數(shù)據(jù);
步驟3-6:根據(jù)已判定為過期版本的數(shù)據(jù),按照存儲主鍵從primary-database和back-database中刪除;
特別地,上述閃回操作中對back-database、servering-database的寫入操作必須是原子的;對primary-database和back-database的刪除操作必須是原子的。
特別地,本發(fā)明中數(shù)據(jù)閃回方法能支持反復(fù)閃回,即當(dāng)用戶發(fā)現(xiàn)閃回后的版本并非其想要的版本時,可以重新閃回到系統(tǒng)中任意一個有效的版本上,包括閃回操作前的版本,使得閃回操作具有可逆性;
當(dāng)存儲系統(tǒng)接收到讀取數(shù)據(jù)的請求,進(jìn)入步驟4-1。
步驟4-1:根據(jù)讀取請求信息,從servering-database中讀取對應(yīng)業(yè)務(wù)主鍵的當(dāng)前服務(wù)版本號。
步驟4-2:基于步驟4-1的計算結(jié)果,從primary-database讀取相應(yīng)的對象數(shù)據(jù)記錄。
至此整個寫入、刪除、閃回和垃圾清理的過程描述完畢,而讀操作過程則證明了閃回設(shè)計對讀操作的無害性。
本發(fā)明與現(xiàn)有技術(shù)相比,其具備如下顯著效果:
(1)本發(fā)明通過構(gòu)建三個數(shù)據(jù)存儲單元對各種版本及各狀態(tài)的數(shù)據(jù)進(jìn)行保存,包括數(shù)據(jù)本體庫、數(shù)據(jù)備份庫、數(shù)據(jù)服務(wù)版本庫,極大降低了數(shù)據(jù)因閃回特性而增加的系統(tǒng)復(fù)雜度,使用戶不需要建立額外數(shù)據(jù)鏡像服務(wù)器,也不需要考慮鏡像文件的序列化和反序列化問題;
(2)本發(fā)明中的閃回機(jī)制采用基于記錄級的歷史版本恢復(fù)方式,使數(shù)據(jù)閃回過程只針對指定的數(shù)據(jù)集合,避免基于時間周期性鏡像技術(shù)造成對正確操作的“誤傷”;
(3)本發(fā)明中數(shù)據(jù)本體始終存儲于primary-database中,并不會因為數(shù)據(jù)的更新和刪除而發(fā)生數(shù)據(jù)本體的移動;閃回操作過程實際主要是在單機(jī)內(nèi)針對服務(wù)版本信息的變更,沒有了數(shù)據(jù)“搬移”操作大大提升了閃回操作的效率;
(4)本發(fā)明可以支持反復(fù)閃回,即當(dāng)用戶發(fā)現(xiàn)閃回后的版本并非其想要的版本時,可以重新閃回到系統(tǒng)中任意一個有效的版本上(包括閃回操作前的版本),使得閃回操作具有可逆性,這就大大提升了閃回操作的安全性;
(5)本發(fā)明將數(shù)據(jù)版本和時間戳信息一并作為在數(shù)據(jù)本體庫、數(shù)據(jù)備份庫、數(shù)據(jù)服務(wù)版本庫中的存儲主鍵,基于主鍵索引的高性能特性,可以確保過程不會因為閃回特性而受到影響;另本發(fā)明能通過掃描數(shù)據(jù)備份庫判定過期版本數(shù)據(jù),確保清理過程的安全性;
總之,本發(fā)明分布式對象存儲系統(tǒng)的數(shù)據(jù)閃回方法,即分布式對象存儲系統(tǒng)的數(shù)據(jù)閃回及過期版本數(shù)據(jù)的自動清除方法,通過建立基于存儲引擎基本讀/寫特性的方法,構(gòu)建不依賴外部的備份服務(wù),并以數(shù)據(jù)版本和時間戳作為數(shù)據(jù)存儲的主鍵,實現(xiàn)對多版本數(shù)據(jù)的讀入、記錄和存儲,并能依據(jù)指定版本執(zhí)行快速的數(shù)據(jù)回滾;同時,本發(fā)明能按照數(shù)據(jù)備份的時效性要求,自動進(jìn)行過期版本數(shù)據(jù)的清理,從而釋放占用的相關(guān)資源。
附圖說明
圖1為本發(fā)明實施例的裝置結(jié)構(gòu)圖;
圖2為本發(fā)明實施例的數(shù)據(jù)變更及閃回過程的整體時序圖;
圖3為本發(fā)明實施例的基本存儲單元的數(shù)據(jù)變更過程圖;
圖4為本發(fā)明實施例的過期版本數(shù)據(jù)清理過程圖。
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,首先對本發(fā)明的一種分布式對象存儲系統(tǒng)閃回方法及裝置中所涉及的一些術(shù)語做簡單解釋:
業(yè)務(wù)主鍵:它是在對象存儲系統(tǒng)存入對象數(shù)據(jù)(如:圖片)時,為對象數(shù)據(jù)構(gòu)建的唯一主鍵;所述業(yè)務(wù)主鍵主要包括對象數(shù)據(jù)的業(yè)務(wù)屬性(如:其所屬的業(yè)務(wù)應(yīng)用中對應(yīng)的庫表名稱、其在業(yè)務(wù)庫表中的唯一標(biāo)識等);
存儲主鍵:本發(fā)明中的數(shù)據(jù)閃回實際上是將對象數(shù)據(jù)恢復(fù)到該數(shù)據(jù)的某個歷史版本,這樣就存在歷史時間點(diǎn)和版本兩個概念,所以本發(fā)明將數(shù)據(jù)版本號、當(dāng)前系統(tǒng)時間戳和業(yè)務(wù)主鍵組合形成新的復(fù)合的數(shù)據(jù)主鍵,下文將這個復(fù)合的數(shù)據(jù)主鍵稱為存儲主鍵,并在發(fā)明中以此主鍵進(jìn)行數(shù)據(jù)基本存儲;
服務(wù)版本:由于數(shù)據(jù)閃回的需要,本發(fā)明在某個時刻針對同一個業(yè)務(wù)主鍵存在多個版本的數(shù)據(jù),而任意時刻只能有一個數(shù)據(jù)處于外部讀操作處理中,,此版本稱為服務(wù)版本;
過期版本:本發(fā)明中每個寫入的數(shù)據(jù)都被標(biāo)識寫入時間戳,那些寫入時間已超過某一限定期限的非服務(wù)版本將被視為過期版本,它們將作為垃圾數(shù)據(jù)被清理;
為了更清晰的闡述本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn),下面結(jié)合具體實施例和附圖對本發(fā)明進(jìn)行詳細(xì)描述。
如圖1所示,為本發(fā)明實施例的裝置結(jié)構(gòu),包括:一個數(shù)據(jù)版本生成器(下文稱:Version-generator)101,三個基礎(chǔ)數(shù)據(jù)存儲單元:數(shù)據(jù)本體庫(下文稱:Primary-database)102、Back-database 103、Servering-database 104,以及兩個功能模塊:過期版本數(shù)據(jù)清理模塊(下文稱:ObsoletedData-clearner)105、閃回功能模塊(下文稱:FlashBacker)106。
所述數(shù)據(jù)版本生成器101(Version-generator),是用于針每次寫入或更新的數(shù)據(jù)生成相應(yīng)的版本號;相同業(yè)務(wù)主鍵的數(shù)據(jù)會因不斷的更新而生成多個版本的數(shù)據(jù);
所述數(shù)據(jù)本體庫102(primary-database),是整個裝置中存儲對象數(shù)據(jù)本體的單元,針對某個業(yè)務(wù)主鍵的所有歷次發(fā)生的數(shù)據(jù)變更都會以獨(dú)立版本的形式存儲于數(shù)據(jù)本體庫中,而對過期版本的自動清理將確保數(shù)據(jù)本體庫不會因為多版本而持續(xù)過度膨脹
所述數(shù)據(jù)備份庫103(back-database),每次針對某個業(yè)務(wù)主鍵執(zhí)行數(shù)據(jù)更新和刪除操作都會形成相應(yīng)的歷史版本,這些歷史版本的信息都將被額外地記錄到back-database中,以備后續(xù)的數(shù)據(jù)閃回操作能夠從back-database中找到需要回滾到的數(shù)據(jù)版本。
特別地,back-database中只記錄歷史對象數(shù)據(jù)對應(yīng)的版本信息,而不包含數(shù)據(jù)本體;back-database記錄的是對象數(shù)據(jù)的存儲主鍵,以充分利用主鍵索引的高性能特性快速地從back-database中獲取到數(shù)據(jù)的歷史版本及對應(yīng)時間戳信息。
所述數(shù)據(jù)服務(wù)版本庫104(servering-database),用于存放業(yè)務(wù)主鍵對應(yīng)的服務(wù)版本信息;servering-database中的信息通過寫操作(包括新增、刪除及更新)進(jìn)行修改;
進(jìn)一步地,閃回操作也能修改servering-database中的信息,以使讀操作能夠獲取有關(guān)“需要閃回到的數(shù)據(jù)版本”的信息;
特別地,servering-database中只記錄服務(wù)版本信息,不包含數(shù)據(jù)本體;且servering-database中記錄的信息都已包含在存儲主鍵中,以充分利用主鍵索引的高性能特性,快速地從servering-database中獲取到關(guān)于數(shù)據(jù)的歷史版本及對應(yīng)時間戳的信息;
所述閃回功能模塊106(FlashBacker),作為數(shù)據(jù)閃回的控制模塊,F(xiàn)lashBacker將從back-database中計算出某個時間點(diǎn)對應(yīng)的數(shù)據(jù)版本信息,上相應(yīng)記錄了的版本信息,同時再將此版本信息修復(fù)到servering-database中,進(jìn)而使外部讀操作能夠獲取到它想要的閃回版本數(shù)據(jù)。
所述過期版本數(shù)據(jù)清理模塊105(ObsoletedData-clearner),此裝置模塊主要是通過判定back-database中的數(shù)據(jù)版本是否過期,將那些過期的版本數(shù)據(jù)從primary-database中移除,達(dá)到清理垃圾版本數(shù)據(jù)的目的。
如圖2所示,為本發(fā)明實施例的數(shù)據(jù)變更及閃回過程的整體時序圖;如圖3、4所示,為本發(fā)明實施實例中的一個具體數(shù)據(jù)變更場景,為方便下面的圖例制作及闡述方便,這里將具體的數(shù)據(jù)寫入操作場景設(shè)置為:實施例1、寫入業(yè)務(wù)主鍵為100的數(shù)據(jù),其版本為v1,時間戳為t1;實施例2、更新業(yè)務(wù)主鍵為100的數(shù)據(jù),對應(yīng)版本和時間戳分別為v2、t2;實施例3、刪除業(yè)務(wù)主鍵為100的數(shù)據(jù);實施例4、將業(yè)務(wù)主鍵為100的數(shù)據(jù)閃回至t1時刻的版本;實施例5、清除過期數(shù)據(jù)版本。下面結(jié)合圖例,分別各個操作場景過程。
實施例1,首次寫入業(yè)務(wù)主鍵為100的數(shù)據(jù),具體步驟有:
步驟202:存儲系統(tǒng)接收到數(shù)據(jù)寫入請求后,調(diào)用Version-generator 101生成唯一版本號v1;
步驟203:存儲系統(tǒng)向Primary-database 102寫入對象數(shù)據(jù)本體,存儲主鍵設(shè)計為100~v1~t1。結(jié)果就如圖3中301所示。
步驟204:由于業(yè)務(wù)主鍵為100的記錄為首次寫入,經(jīng)Primary-database 102計算,當(dāng)前關(guān)于業(yè)務(wù)主鍵為100的數(shù)據(jù)的最新記錄是100~v1~t1。
步驟205~206:將100~v1~t1記錄到Servering-database 104中,以100~v1~t1最為記錄主鍵,至于相應(yīng)的數(shù)據(jù)可以寫入空值。結(jié)果就如圖3中303所示。
步驟207:由于當(dāng)前對于業(yè)務(wù)主鍵為100的記錄沒有歷史版本,因而無需執(zhí)行該數(shù)據(jù)的歷史版本在數(shù)據(jù)備份庫103中存儲,。結(jié)果就如圖3-302所示。
實施例2,更新業(yè)務(wù)主鍵為100的數(shù)據(jù),具體步驟包括:
步驟202:由于業(yè)務(wù)主鍵為100的數(shù)據(jù)之前已寫入,當(dāng)存儲系統(tǒng)接收到寫入請求后,調(diào)用Version-generator 101生成該數(shù)據(jù)的唯一版本號為v2;
步驟203:存儲系統(tǒng)向Primary-database 102寫入對象數(shù)據(jù)本體,主鍵設(shè)計為100~v2~t2。結(jié)果就如圖3-304所示。
步驟204:由于v2為業(yè)務(wù)主鍵為100的最新版本,經(jīng)Primary-database 102計算,關(guān)于業(yè)務(wù)主鍵為100的數(shù)據(jù)的最新數(shù)據(jù)記錄為100~v2~t2。
步驟205~206:將100~v2~t2記錄到Servering-database 104中。結(jié)果就如圖3-306所示。
步驟207:相對于存儲主鍵為“100~v2~t2”的數(shù)據(jù),存儲主鍵為“100~v1~t1”則是歷史版本,將“100~v1~t1”在Back-database 103中記錄保存;本條記錄以100~v1~t1作為主鍵,其他對應(yīng)的數(shù)據(jù)值可以為空;結(jié)果就如圖3中305所示。
實施例3:刪除業(yè)務(wù)主鍵為100的數(shù)據(jù),數(shù)據(jù)版本為v2,具體步驟有:
步驟210:接收到系統(tǒng)發(fā)出的刪除業(yè)務(wù)主鍵為100的記錄請求,,Servering-database 104中查找業(yè)務(wù)主鍵為100的服務(wù)版本,根據(jù)請求中要求刪除的版本(v2),,從Servering-database 104中移除100~v2~t2;。結(jié)果就如圖3中309所示。
步驟211:向Back-database 103中寫入以100~v2~t2為主鍵的記錄。結(jié)果就如圖3-308所示。而Primary-database 102中的數(shù)據(jù)在此次刪除操作過程中保持不變,結(jié)果就如圖3-307所示。
實施例4:將業(yè)務(wù)主鍵為100的數(shù)據(jù)閃回至t1時刻的數(shù)據(jù)版本,具體步驟有:
步驟217:接收到系統(tǒng)要求將回業(yè)務(wù)主鍵為100閃回至t1時刻的版本的請求,F(xiàn)lashBacker 106首先從Back-database 103中查找業(yè)務(wù)主鍵為100對應(yīng)的t1時刻的版本為v1,并將其從Back-database 103中移除。結(jié)果就如圖3-311所示。
步驟218:將100~v1~t1寫入到Servering-database 104中。結(jié)果就如圖3-312所示。而Primary-database 102中的數(shù)據(jù)在此次閃回操作過程中保持不變,結(jié)果就如圖3-310所示。
清除過期數(shù)據(jù)版本的過程主要是:假令清除操作開始時,t2已經(jīng)超出了過期期限;則遍歷Back-database 103發(fā)現(xiàn)100~v2~t2為過期且不服務(wù)的版本,于是從Primary-database 102將100~v2~t2對應(yīng)的本體數(shù)據(jù)移除,同時將100~v2~t2位于Back-database 103中的記錄移除。最終Primary-database 102的結(jié)果如圖4-404所示,Primary-database 102的結(jié)果如圖4-405所示,Servering-database 104如圖4-406所示。
所屬領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:以上所述僅為本發(fā)明的具體實施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。