摘要: 傳統(tǒng)的基于日志的恢復(fù)技術(shù)會對系統(tǒng)性能產(chǎn)生很大影響。本文提出內(nèi)存數(shù)據(jù)庫系統(tǒng)快速日志恢復(fù)技術(shù),它控制日志的產(chǎn)生數(shù)量,使得在系統(tǒng)崩潰并重新啟動時,能以最快的速度恢復(fù)到系統(tǒng)崩潰前的最近一致點上。
關(guān)鍵詞: ISDB系統(tǒng) 日志恢復(fù) 檢查點 數(shù)據(jù)鏡象
一、引言
內(nèi)存數(shù)據(jù)庫(ISDB)的所有操作都作用于內(nèi)存數(shù)據(jù)庫的主拷貝上,數(shù)據(jù)庫極易遭到操作系統(tǒng)和應(yīng)用軟件造成的破壞,因此ISDB的恢復(fù)技術(shù)十分關(guān)鍵。日志(Logging)恢復(fù)是傳統(tǒng)的ISDB恢復(fù)技術(shù)之一,它在大量事務(wù)吞吐量情況下造成的日志暴增會帶來很大問題,會對ISDB性能產(chǎn)生很大影響。ISDB系統(tǒng)快速日志恢復(fù)技術(shù)是在不阻礙系統(tǒng)正常運行的情況下,控制日志的產(chǎn)生數(shù)量,使得在系統(tǒng)崩潰并重新啟動時,能以最快的速度恢復(fù)到系統(tǒng)崩潰前的最近一致點上。
二、系統(tǒng)構(gòu)架設(shè)計
快速恢復(fù)模型中,事務(wù)處理模塊負責(zé)根據(jù)用戶請求產(chǎn)生事務(wù),并由事務(wù)管理器調(diào)度。事務(wù)管理器將負責(zé)各個事務(wù)的日志記錄交給日志產(chǎn)生規(guī)則處理。檢查點模塊根據(jù)日志產(chǎn)生規(guī)則才產(chǎn)生的日志數(shù)量動態(tài)調(diào)整檢查點啟動時間。當日志記錄數(shù)達到一定值時,檢查點程序啟動。它讀取所有日志記錄,交給日志篩選器。日志篩選器根據(jù)篩選算法,從當前所有日志項中篩選出實際有效的日志記錄,并將這些有效日志記錄交給日志分發(fā)結(jié)點。日志分發(fā)結(jié)點主要做兩項工作:第一是將日志傳送給日志磁盤管理器,由其負責(zé)將日志回寫到日志磁盤上;第二是將日志傳送給備份更新發(fā)生器,備份更新發(fā)生器利用快速恢復(fù)算法,觸發(fā)各類更新操作,根據(jù)日志更新磁盤上的數(shù)據(jù)。
該快速恢復(fù)模型具有如下的特點。
1.快速恢復(fù)模型以日志驅(qū)動方式做檢查點,異步更新磁盤上的備份數(shù)據(jù)鏡象。
2.系統(tǒng)只維護全局Redo日志,以Redo日志來驅(qū)動備份更新發(fā)生器,各個事務(wù)維護私有Redo日志和Undo日志,在事務(wù)提交時將私有Redo日志寫入全局Redo日志中。
3.使用日志篩選算法,進一步減少Redo日志的數(shù)量,提升檢查點程序的性能。
4.備份數(shù)據(jù)鏡象只反應(yīng)已提交事務(wù)的更新狀態(tài),因此在系統(tǒng)重載時不需要回退未提交的事務(wù)。
5.快速恢復(fù)算法為并發(fā)重載算法。在系統(tǒng)恢復(fù)過程中,它能繼續(xù)接受新事務(wù)的請求。
三、快速日志驅(qū)動檢查點
快速日志驅(qū)動檢查點的基本思想是檢查點程序仍然由日志來驅(qū)動,根據(jù)讀取到的日志項來更新數(shù)據(jù)鏡象上的內(nèi)容,維持數(shù)據(jù)鏡象與內(nèi)存中數(shù)據(jù)庫的基本同步。但是,與以往日志驅(qū)動檢查點算法不同的是,它通過日志產(chǎn)生規(guī)則和日志篩選算法兩個策略克服了以往日志驅(qū)動檢查點算法中日志數(shù)量可能過快增長的問題。
1.日志產(chǎn)生規(guī)則
快速日志驅(qū)動檢查點算法中設(shè)立的日志產(chǎn)生規(guī)則是:系統(tǒng)中日志被分為全局日志和私有日志兩類。系統(tǒng)只維護全局Redo日志,而不維護Undo日志,由事務(wù)自身維護私有的Redo日志和Undo日志。在事務(wù)提交時,依照事務(wù)提交的先后順序,系統(tǒng)將事務(wù)的私有Redo日志添加到全局Redo日志中。因此,在事務(wù)運行過程中,會產(chǎn)生Redo日志和Undo日志。Redo日志用于在系統(tǒng)恢復(fù)過程中,重做已提交事務(wù)。而Undo日志用于在事務(wù)Abort時回退事務(wù),或者在系統(tǒng)恢復(fù)過程中回退未提交的事務(wù)。如果恢復(fù)模型的設(shè)計能夠保證系統(tǒng)恢復(fù)過程中,沒有需要回退的未提交事務(wù),那么系統(tǒng)只需要讀取Redo日志而不需要讀取Undo日志。因而系統(tǒng)只需要維護全局的Redo日志,而不需要維護Undo日志,將Undo日志交給事務(wù)自身維護,Undo日志只用于事務(wù)自身Abort時回退。這樣就可以減少全局日志的總量。
全局日志和私有日志在事務(wù)的內(nèi)存空間中,各自維護自己的私有Redo日志和Undo日志。在非易失性內(nèi)存(NVM)上,ISDB系統(tǒng)開辟全局Redo日志緩沖區(qū),讓事務(wù)在提交時私有Redo日志寫入該緩沖區(qū)。檢查點程序?qū)⒍ㄆ谧x取日志緩沖區(qū)中的數(shù)據(jù),將日志寫入磁盤,并驅(qū)動檢查點程序更新磁盤鏡象數(shù)據(jù)。
各事務(wù)將按如下階段操作日志:
(1)事務(wù)啟動時,需要在事務(wù)的各自空間內(nèi)建立私有Redo日志和私有Undo日志,并將在私有Redo日志中寫入事務(wù)啟動記錄。
(2)事務(wù)運行過程中,事務(wù)的每次更新操作,需要在私有Redo日志中添加Redo記錄,并在私有Undo日志中添加Undo記錄。
(3)事務(wù)提交時,需要按如下步驟完成:
①向事務(wù)的私有Redo日志內(nèi)添加事件Commit記錄。
②將事務(wù)的私有Redo日志寫入全局Redo日志中。
③釋放事務(wù)的私有Redo日志和私有Undo日志,釋放事務(wù)所占用的其他資源,完成提交。
(4)事務(wù)Abort時,需要按照如下步驟完成:
①事務(wù)反向掃描私有Undo日志,回退事務(wù)的更新操作。
②釋放事務(wù)的私有Redo日志和私有Undo日志,釋放事務(wù)所占用的其他資源,結(jié)束事務(wù)。
由此可見,事務(wù)只在提交時才將私有Redo日志寫入全局日志緩沖區(qū)。從而保證了檢查點程序運行時,用戶只看到已提交事務(wù)的Redo日志,這時磁盤上的數(shù)據(jù)鏡象也只反映已提交事務(wù)的更新操作。
2.日志篩選算法
用日志產(chǎn)生規(guī)則能明顯減少日志產(chǎn)生的數(shù)量,但是在更新事務(wù)吞吐量較大的情況下,檢查點程序從全局日志緩沖區(qū)讀取Redo日志時,仍然可能會面對Redo日志量過大的問題。產(chǎn)生的原因是這樣的:如果對一份數(shù)據(jù)作兩次更新操作,那么兩個事務(wù)各自產(chǎn)生一條對同一物理地址上值更新的物理日志,但只有第2次更新事務(wù)產(chǎn)生的日志為有效的。筆者利用日志篩選算法來避免日志量過大問題。日志篩選器需要關(guān)注物理日志中被修改值的地址的相關(guān)性。對相同修改地址的物理日志,筆者依據(jù)日志的提交順序進行篩選。為加快日志的篩選速度,筆者將全日志緩沖區(qū)劃分為多個區(qū)域,這將日志記錄中操作地址具有空間相關(guān)性的日志按照所屬事務(wù)的提交順序聚合在一個區(qū)域內(nèi),能加速日志篩選算法的篩選速度。這使得在篩選過程中,用戶只需在小范圍內(nèi)(也就是一個區(qū)域)就可搜索到被篩選的日志,當全局Redo日志緩沖區(qū)中的某一個區(qū)域滿時,就喚醒檢查點程序,將這一區(qū)域中的Redo日志寫入日志磁盤,并驅(qū)動備份更新發(fā)生器更新磁盤上的數(shù)據(jù)鏡象。
四、快速恢復(fù)算法
在系統(tǒng)崩潰后,ISDB系統(tǒng)需要通過恢復(fù)過程,將數(shù)據(jù)庫恢復(fù)到崩潰前的最近一致點上。在系統(tǒng)恢復(fù)過程中,重載程序?qū)?shù)據(jù)從磁盤鏡象上加載到ISDB系統(tǒng)中,同時根據(jù)日志,重做(Redo)或者取消(Undo)部分事務(wù),來恢復(fù)數(shù)據(jù)庫的一致性。
快速恢復(fù)算法步驟如下:
1.當系統(tǒng)崩潰重啟時,先啟動日志檢查和分配程序,檢查非易失性內(nèi)存(NVM)中提供給事務(wù)提交時用于寫入私有Redo日志的緩沖區(qū)中是否有完整寫入的Redo日志。如果有完整的Redo日志,則日志檢查和分配程序?qū)⑦@些完整的日志分配到全局Redo日志緩沖區(qū)的不同區(qū)域中。
2.統(tǒng)計全局Redo日志緩沖區(qū)中的日志數(shù)量,并標記這些日志。Redo日志緩沖區(qū)中的日志將被用于恢復(fù)內(nèi)存中ISDB系統(tǒng)的一致性,同時也要用于維護磁盤上數(shù)據(jù)鏡象的一致性。
3.恢復(fù)程序從磁盤數(shù)據(jù)鏡象上加載一些重要的系統(tǒng)表以后,ISDB系統(tǒng)可以啟動,并可以接受新事務(wù)的請求。系統(tǒng)的正常事務(wù)處理和系統(tǒng)恢復(fù)過程同時進行。
4.觸發(fā)檢查點程序從全局Redo日志緩沖區(qū)中讀取日志,驅(qū)動備份更新發(fā)生器更新磁盤上的數(shù)據(jù)鏡象。在這過程中,驅(qū)動備份更新發(fā)生器向緩沖區(qū)管理區(qū)詢問將被更新的記錄所在的鏡象數(shù)據(jù)頁面是否已經(jīng)被加載到內(nèi)存中。如果已經(jīng)被加載,則不但需要更新磁盤上的鏡象數(shù)據(jù)頁,還需要更新內(nèi)存中的數(shù)據(jù)頁面;如果全局Redo日志緩沖區(qū)中所有被標記的日志都已經(jīng)被用于驅(qū)動備份更新發(fā)生器,那么此時備份更新發(fā)生器可以告訴重載程序恢復(fù)工作已經(jīng)完成,沒有其它鏡象頁面需要更新。
5.ISDB在接受新事務(wù)的請求時,對于事務(wù)的所訪問到的數(shù)據(jù),如果數(shù)據(jù)還沒有被加載內(nèi)存中時,則系統(tǒng)向重載程序要求將所需數(shù)據(jù)從磁盤鏡象上加載到內(nèi)存中。此時,重載程序先要檢查要求加載的數(shù)據(jù)頁面是否會被備份更新發(fā)生器修改。如果是,則需要等待備份更新發(fā)生器更新鏡象頁面后再加載到內(nèi)存中,否則就直接將鏡象頁面加載到內(nèi)存中。
6.當所有鏡象都加載完成后,ISDB系統(tǒng)恢復(fù)過程結(jié)束。
五、結(jié)語
恢復(fù)技術(shù)是保證內(nèi)存數(shù)據(jù)庫運行可靠的關(guān)鍵技術(shù)。傳統(tǒng)日志恢復(fù)技術(shù)由于存在產(chǎn)生過多不必要的日志的缺點,筆者研究了一種新的日志恢復(fù)技術(shù)來盡可能的減少日志數(shù)量,并在此基礎(chǔ)上提出了快速日志恢復(fù)算法。恢復(fù)技術(shù)算法可以大大地節(jié)約系統(tǒng)的資源。然而,內(nèi)存數(shù)據(jù)庫恢復(fù)是一個十分復(fù)雜而龐大的技術(shù),所以該方法還有待完善。
參考文獻:
[1]劉云生,廖國瓊,付蔚.一個支持實時內(nèi)存數(shù)據(jù)庫的恢復(fù)系統(tǒng)[J].小型微型計算機系統(tǒng),2003,24,(3).
[2]龍玉國,耿協(xié)堅.嵌入式實時內(nèi)存數(shù)據(jù)庫恢復(fù)子系統(tǒng)的設(shè)計[J].計算機工程與應(yīng)用,2004,17.
[3]宋廣華,楊長生.基于混合日志的內(nèi)存數(shù)據(jù)庫恢復(fù)子系統(tǒng)[J].浙江大學(xué)學(xué)報(理學(xué)版),2001,28,(3).