專利名稱:一種基于事務(wù)聚集的日志組織結(jié)構(gòu)及實(shí)現(xiàn)其相應(yīng)的恢復(fù)協(xié)議的方法
技術(shù)領(lǐng)域:
本發(fā)明設(shè)計屬于數(shù)據(jù)信息處理領(lǐng)域,特別涉及使用日志技術(shù)來保證數(shù)據(jù)一致性的事務(wù)性數(shù)據(jù)管理系統(tǒng)。
背景技術(shù):
在馮氏計算機(jī)體系結(jié)構(gòu)中,永久性數(shù)據(jù)被存放在速度較慢、容積較大的外存設(shè)備中(如硬盤),而當(dāng)數(shù)據(jù)被訪問時,它被讀入速度較快、容積較小的內(nèi)存設(shè)備中(如RAM),并被中央處理器訪問。然而由于性能的要求,數(shù)據(jù)在更新時只更新其內(nèi)存映像,而對外存的更新由緩沖區(qū)管理單元延時進(jìn)行。
在事務(wù)性數(shù)據(jù)管理系統(tǒng)中,單個事務(wù)一即由若干條更新所組成的一次操作過程一被視為一個基本工作單元,它有兩條重要的性質(zhì),一為一致性,即所有對數(shù)據(jù)的更新必須同時被看到,或者完全看不到;二是持久性,即當(dāng)事務(wù)提交時,所有對數(shù)據(jù)的更新必須永久保存到系統(tǒng)中。在大量并發(fā)事務(wù)同時工作的情況下,一致性和持久性是保證整個系統(tǒng)正確運(yùn)行的必備條件。但由于數(shù)據(jù)的外存映像總是延遲于內(nèi)存的最新版本,因此當(dāng)系統(tǒng)發(fā)生故障時,此時外存的數(shù)據(jù)版本可能丟失已提交事務(wù)的更新(破壞持久性),也可能保存了未提交事務(wù)的更新(破壞一致性)。目前所有的事務(wù)性數(shù)據(jù)管理系統(tǒng)均采用基于日志的恢復(fù)協(xié)議來恢復(fù)系統(tǒng),以實(shí)現(xiàn)一致性和持久性。這一協(xié)議可以被簡要描述如下日志是外存上的一個流結(jié)構(gòu)文件,系統(tǒng)在內(nèi)存中維護(hù)一個日志緩沖區(qū),其中存放最近產(chǎn)生的日志。當(dāng)事務(wù)A準(zhǔn)備對數(shù)據(jù)頁面P進(jìn)行一條更新U時,系統(tǒng)向日志緩沖區(qū)中產(chǎn)生一條日志(S,A,P,U,Cp, Cs,Sprev),其中S是本條日志在日志流中的唯一日志序列編號(隨時間單調(diào)遞增),Cp是更新的數(shù)據(jù)前項(xiàng),Cs是更新的數(shù)據(jù)后項(xiàng),而Sprev是事務(wù)A的上一條更新日志的日志序列編號。事務(wù)在更新前,將S寫在P上。而數(shù)據(jù)緩沖區(qū)管理單元和事務(wù)管理單元必須遵循以下原則1)當(dāng)數(shù)據(jù)頁面被數(shù)據(jù)緩沖區(qū)管理單元寫回外存時,其頁面上的唯一日志序列編號之前的日志必須被先物化到外存日志文件中。2)當(dāng)事務(wù)提交時,此時日志緩沖區(qū)內(nèi)的所有日志必須被物化到外存日志文件中。當(dāng)整個系統(tǒng)發(fā)生故障時,首先掃描外存已經(jīng)物化的日志文件,每條日志S對應(yīng)的頁面P被讀入內(nèi)存,并檢查頁面上的日志序列編號S,與S之間的關(guān)系,如果S’小于S,則說明頁面的外存版本在本條日志更新之前,此時本條日志需要被重做,并將頁面序列號更新到S,如果S’大于S,則說明本條日志對應(yīng)的更新已經(jīng)物化過了,不需要重做。由于事務(wù)提交時必須物化所有的日志,因此事務(wù)的持久性得到了保證。當(dāng)所有日志都被掃描并按需重做后,同時也構(gòu)建了發(fā)生故障時的活躍事務(wù)表,由于同一事務(wù)的更新日志被通過日志的Sprev域鏈接起來,因此可以回退所有的更新日志,使數(shù)據(jù)庫恢復(fù)到一致狀態(tài)。上述日志結(jié)構(gòu)和恢復(fù)協(xié)議在現(xiàn)代計算機(jī)系統(tǒng)中存在著一定的問題。首先,單條日志的體積較大,由于每條日志必須記錄日志序列編號S,事務(wù)號A,事務(wù)日志前項(xiàng)Sprev,這些域加起來的長度往往超過20字節(jié),而如果一條更新本身操作的數(shù)據(jù)較短時,這些域所占的空間往往接近整個日志文件空間的1/3甚至1/2 ;其次,由于產(chǎn)生日志的動作必須全局同步以保證日志序列的唯一遞增性,而當(dāng)前的大型計算機(jī)往往擁有幾十甚至上百個中央處理器,當(dāng)更新密集發(fā)生時,會造成延展性的瓶頸。
發(fā)明內(nèi)容
本發(fā)明目的在于提供一種按事務(wù)聚集的日志組織結(jié)構(gòu),以及基于其上的恢復(fù)協(xié)議的實(shí)現(xiàn)方法,以達(dá)到減小日志文件體積,提高系統(tǒng)在高并發(fā)條件下的性能的目標(biāo)。為達(dá)到上述目標(biāo),本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的一種按事務(wù)聚集的日志組織結(jié)構(gòu)。日志文件被順序組織為若干個日志片,每個日志片的長度可以不一樣,但都為外存設(shè)備基本塊單元長度的整數(shù)倍。所述日志文件組織結(jié)構(gòu)中的一個日志片存放同一個事務(wù)的日志內(nèi)容,其基本結(jié)構(gòu) 為(S,A,Pn, Ln, Pa, La, Sprev)。其中,S代表本日志片在日志文件中的唯一日志序列編號,A代表本日志片的相關(guān)事務(wù)號,Pn代表本日志片所涉及的數(shù)據(jù)頁面數(shù)目,Ln代表本日志片所包含的日志數(shù)目,它們都是定長的域。面Pa是本日志片中的日志涉及的所有頁面的頁面號數(shù)組,數(shù)組共有Pn個定長的項(xiàng),每項(xiàng)代表一個單獨(dú)的數(shù)據(jù)頁面編號。La是所有的日志項(xiàng)數(shù)組,數(shù)組共有Ln個變長的項(xiàng),每項(xiàng)代表一條單獨(dú)的日志。Sprev為本事務(wù)的上一日志片的序列號。所述日志片中的頁面號數(shù)組Pa按照頁面號排序,以便于通過二分法快速定位訪問。所述日志片中的日志項(xiàng)數(shù)組La中單條日志的組織結(jié)構(gòu)為(seq,i, U,Cp, Cs)。其中,seq為相關(guān)數(shù)據(jù)頁面上的頁面序列號,該序列號在每次數(shù)據(jù)頁面發(fā)生更新時遞增。i是處于
是本條日志所發(fā)生的數(shù)據(jù)頁面。U,Cp和Cs的相關(guān)含義和背景技術(shù)中的定義一致。一種實(shí)現(xiàn)基于上述日志文件結(jié)構(gòu)的恢復(fù)協(xié)議的方法,包括每個事務(wù)維護(hù)一個私有的日志緩沖區(qū),其結(jié)構(gòu)與日志文件的一個日志片一致,對私有日志緩沖區(qū)的訪問不需要同步。當(dāng)事務(wù)A更新一個數(shù)據(jù)頁面時,向私有日志緩沖區(qū)的日志項(xiàng)數(shù)組La中插入一條新的日志,并可能更新頁面號數(shù)組Pa。在每個數(shù)據(jù)頁面上維護(hù)一個單調(diào)遞增的頁面序列號seq,更新時seq被記錄到日志中,更新后seq加I,且事務(wù)號A被記錄在頁面上。當(dāng)事務(wù)提交時,它的私有日志緩沖區(qū)被寫回日志文件,并獲得唯一的日志序列編號S。當(dāng)數(shù)據(jù)緩沖區(qū)管理單元將某個數(shù)據(jù)頁面寫回數(shù)據(jù)文件時,如果頁面上記錄的事務(wù)號上有活躍事務(wù)號,則該事務(wù)的私有日志緩沖區(qū)被寫回日志文件,并獲得唯一的日志序列編號S,然后該私有日志緩沖區(qū)被重置。當(dāng)系統(tǒng)出錯后進(jìn)行恢復(fù)時,首先進(jìn)行重做。重做過程為按序掃描日志片及其中所有的日志項(xiàng)數(shù)組,并按照日志項(xiàng)內(nèi)容中的seq’與相關(guān)頁面上的seq進(jìn)行比對,如果seq’等于seq,則重做該條日志并將頁面上的seq加1,如果seq’等于seq,則不重做該條日志。當(dāng)重做完成后,對所有活躍事務(wù)進(jìn)行回退。回退過程為對于每個活躍事務(wù),根據(jù)Sprev域逆序掃描所有的日志片,對每個日志片逆序掃描所有的日志項(xiàng)數(shù)組,并對日志項(xiàng)內(nèi)容數(shù)組中的每一條日志進(jìn)行回退操作。本發(fā)明解決了在現(xiàn)代大型計算機(jī)服務(wù)器上的事務(wù)性數(shù)據(jù)管理系統(tǒng)中,利用日志技術(shù)來恢復(fù)數(shù)據(jù)時所遇到的性能瓶頸問題,具有以下有益效果I)各事務(wù)在并行更新時,寫日志時不需要發(fā)生任何同步,有效地提高了事務(wù)自身的運(yùn)行效率,并極大地去除了在高并發(fā)環(huán)境下事務(wù)間可能發(fā)生的等待關(guān)系,提高了系統(tǒng)的吞吐率。2)將原來每條日志中必須保存的前項(xiàng)日志指針Sprev降低到每個日志片一條,將原來每條日志必須保存的頁面號降低到同一個日志片內(nèi)的日志共用,以上措施有效減小了日志的體積,降低了系統(tǒng)的存儲成本。
圖I是日志文件整體結(jié)構(gòu)示例圖。圖2是日志片結(jié)構(gòu)示意圖。圖3是事務(wù)寫日志流程示意圖。圖4是系統(tǒng)故障恢復(fù)流程不意圖。
具體實(shí)施例方式下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)的描述請參閱圖1,該圖為日志文件的整體組織結(jié)構(gòu)示例圖,日志文件被分成一個個大小不等的日志片,每個日志片的長度為外存設(shè)備基本單元的整數(shù)倍。每個日志片為一個事務(wù)所獨(dú)占,同一事務(wù)的不同日志片之間通過日志片上的Sprev域相連。請參閱圖2,該圖為單個日志片組織結(jié)構(gòu)示意圖,每個日志片頭上有一些定長域,它們包括I)該日志片的唯一序列編號S,根據(jù)此編號可以唯一定位到本日志片。要注意的是,在有些事務(wù)性數(shù)據(jù)管理系統(tǒng)中用絕對位移來定位日志記錄,這種情況下S可以不保存;2)該日志的相應(yīng)事務(wù)號A,用于在恢復(fù)時構(gòu)建活動事務(wù)表;3)日志片上涉及的數(shù)據(jù)頁面數(shù)目Pn ;4)日志片上存放的日志數(shù)目Ln。在定長域后面,緊跟著存放數(shù)據(jù)頁面號數(shù)組Pa,數(shù)組每一項(xiàng)存放一個數(shù)據(jù)頁面號,數(shù)組的長度為Pn。在所有數(shù)據(jù)管理系統(tǒng)中,數(shù)據(jù)頁面號的長度都是一定的,因此根據(jù)Pn可以計算出Pa的長度。在數(shù)據(jù)頁面號數(shù)組后面存放日志項(xiàng)數(shù)組La,由于日志項(xiàng)的長度并不固定,在這里可以采用順序存放。每條日志的內(nèi)容都包括以下域I)該日志產(chǎn)生時,相關(guān)數(shù)據(jù)頁面上的頁面序列號seq,定長;2)數(shù)據(jù)頁面號數(shù)組下標(biāo)i,指向本日志片中數(shù)據(jù)頁面號數(shù)組的相應(yīng)項(xiàng),定長;3)日志類型U,定長;4)日志更新的數(shù)據(jù)前項(xiàng)Cp,變長,可以根據(jù)U組裝和解析;5)日志更新的數(shù)據(jù)后項(xiàng)Cs,變長,可以根據(jù)U組裝和解析。
每個事務(wù)在內(nèi)存中開辟自己的私有日志緩沖區(qū),當(dāng)更新數(shù)據(jù)頁面時,向緩沖中寫入日志信息。圖3所示為本發(fā)明提出的基于上述日志組織結(jié)構(gòu)的事務(wù)更新數(shù)據(jù)頁面的方法流程,包括以下步驟301更新開始時,事務(wù)首先獲得數(shù)據(jù)頁面的排他訪問權(quán)限,即此時不允許其他事務(wù)訪問本頁面,然后根據(jù)更新的類型判斷更新是否可以進(jìn)行。302準(zhǔn)備寫日志,讀取數(shù)據(jù)頁面上的當(dāng)前頁面序列號seq,數(shù)據(jù)的前項(xiàng)Cp,數(shù)據(jù)的后項(xiàng)Cs,以及本次更新的類型U。 303判斷本頁面號在本事務(wù)私有日志緩沖區(qū)中的頁面號數(shù)組Pa中是否存在,如果不存在,則調(diào)用304,否則直接進(jìn)入305。由于頁面號數(shù)組是有序且定長的,因此使用二分查找可以迅速判斷本頁面號是否已經(jīng)存在。304向頁面號數(shù)組Pa中插入本頁面的頁面號P,要注意這個插入應(yīng)該仍然保持Pa的有序性。同時這個操作會引起La的后移。305確定頁面號在頁面號數(shù)組中的下標(biāo)i,構(gòu)造出完整的日志項(xiàng)。并儲存到La的末尾。306更新數(shù)據(jù)頁面,將本事務(wù)號記錄在頁面上,并將頁面的seq加I。在系統(tǒng)正常運(yùn)行時,還要遵循以下兩條規(guī)則,首先,當(dāng)一個數(shù)據(jù)頁面被排除出緩沖區(qū)時,需要把頁面上記錄的事務(wù)號中的仍然活躍的事務(wù)的私有緩沖區(qū)寫回日志文件;其次,當(dāng)事務(wù)提交時,將自己的私有緩沖區(qū)寫回日志文件。這兩個過程都需要同步,但相比傳統(tǒng)協(xié)議中每寫一條日志都需要同步,性能已經(jīng)得到了極大的提高。當(dāng)系統(tǒng)發(fā)生故障時,遵照圖4示意的流程進(jìn)行恢復(fù),恢復(fù)伊始,在內(nèi)存中建立一張空的活躍事務(wù)表,然后進(jìn)行以下步驟401循環(huán)判斷當(dāng)前是否還有日志片沒有被掃描,如果有,則進(jìn)入402,如果沒有,則進(jìn)入403 ;402掃描下一日志片S,首先判斷日志片上的事務(wù)號A在活躍事務(wù)表中是否存在,如果不存在,則將A加入活躍事務(wù)表,并置A的最后一個日志片為S ;如果存在則更新A的最后一個日志片為S ;403循環(huán)判斷當(dāng)前日志片上所的日志項(xiàng)是否已經(jīng)被全部掃描,如果沒有,則進(jìn)入404,否則返回401判斷。404掃描下一日志項(xiàng)L,并根據(jù)日志項(xiàng)相關(guān)聯(lián)的頁面號P獲得數(shù)據(jù)文件中的相應(yīng)數(shù)據(jù)頁面訪問權(quán)405檢查日志項(xiàng)中的seq和頁面上的seq之間的關(guān)系,如果前者等于后者,則說明頁面正處在更新前的狀態(tài),此時進(jìn)入406,否則返回404,訪問下一條日志。406重做這條日志,將日志的數(shù)據(jù)后項(xiàng)更新到頁面上,并且將頁面的seq加I。407到此說明重做過程已經(jīng)完成,此時檢查活躍事務(wù)表,循環(huán)將所有的活躍事務(wù)回退。408循環(huán)檢查當(dāng)前事務(wù)是否已經(jīng)回退完成,檢查的條件是事務(wù)的最后一個日志片是否為空,如果沒有則進(jìn)入到409.409回滾當(dāng)前日志片,將所有的日志項(xiàng)按逆序回退,并將事務(wù)的最后一個日志片置為這個日志片的Sprev。
權(quán)利要求
1.一種基于事務(wù)聚集的日志組織結(jié)構(gòu),其中 日志文件被順序組織為若干個日志片,每個日志片的長度可以不一樣,但都為外存設(shè)備基本塊單元長度的整數(shù)倍。
2.根據(jù)權(quán)利I要求所述的日志組織結(jié)構(gòu),其特征在于,所述日志文件組織結(jié)構(gòu)中的一個日志片存放同一個事務(wù)的日志內(nèi)容,其包括的基本內(nèi)容至少包括 1)日志片序列編號, 2)事務(wù)號 3)頁面號數(shù)組長度 4)日志項(xiàng)數(shù)組長度, 5)同事務(wù)的前一個日志片序列編號, 6)頁面號數(shù)組, 7)日志項(xiàng)數(shù)組。
3.根據(jù)權(quán)利要求I或2所述的日志組織結(jié)構(gòu),其特征在于,所述日志片中的頁面號數(shù)組Pa按照頁面號排序,以便于通過二分法快速定位訪問。
4.根據(jù)權(quán)利要求I或2所述的日志組織結(jié)構(gòu),其特征在于,所述日志片中的日志項(xiàng)數(shù)組中的單條日志的組織結(jié)構(gòu)至少包括 1)數(shù)據(jù)頁面上的頁面序列號, 2)頁面號在頁面號數(shù)組的下標(biāo), 3)更新類型, 4)更新數(shù)據(jù)前項(xiàng), 5)更新數(shù)據(jù)后項(xiàng)。
5.一種實(shí)現(xiàn)基于權(quán)利要求I所述的日志組織結(jié)構(gòu)的恢復(fù)協(xié)議的方法,其中事務(wù)性系統(tǒng)在正常運(yùn)行時遵循協(xié)議要求,并在出錯后根據(jù)協(xié)議進(jìn)行恢復(fù)。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,每個事務(wù)維護(hù)一個私有的日志緩沖區(qū),其結(jié)構(gòu)與日志文件的一個日志片一致,對私有日志緩沖區(qū)的訪問不需要同步。
7.根據(jù)權(quán)利要求5或6所述的方法,其特征在于,當(dāng)事務(wù)更新一個數(shù)據(jù)頁面時,向私有日志緩沖區(qū)的日志項(xiàng)數(shù)組中插入一條新的日志,并可能更新頁面號數(shù)組。在每個數(shù)據(jù)頁面上維護(hù)一個單調(diào)遞增的頁面序列號,更新時序列號被記錄到日志中,更新后序列號加1,且事務(wù)號被記錄在頁面上。
8.根據(jù)權(quán)利要求5或6所述的方法,其特征在于,當(dāng)事務(wù)提交時,它的私有日志緩沖區(qū)被寫回日志文件,并獲得唯一的日志序列編號。
9.根據(jù)權(quán)利要求5或6所述的方法,其特征在于,當(dāng)數(shù)據(jù)緩沖區(qū)管理單元將某個數(shù)據(jù)頁面寫回數(shù)據(jù)文件時,如果頁面上記錄的事務(wù)號上有活躍事務(wù)號,則該事務(wù)的私有日志緩沖區(qū)被寫回日志文件,并獲得唯一的日志序列編號,然后該私有日志緩沖區(qū)被重置。
10.根據(jù)權(quán)利要求5或6所述的方法,其特征在于,當(dāng)系統(tǒng)出錯后進(jìn)行恢復(fù)時,首先進(jìn)行重做。重做過程為按序掃描日志片及其中所有的日志項(xiàng)數(shù)組,并按照日志項(xiàng)內(nèi)容中記錄的頁面序列號與相關(guān)頁面上的頁面序列號之間的關(guān)系決定是否重做。
11.根據(jù)權(quán)利要求5或6所述的方法,其特征在于,當(dāng)重做完成后,需要對所有活躍事務(wù)進(jìn)行回退?;赝诉^程為對于每個活躍事務(wù),逆序掃描所有的日志片,對每個日志片逆序掃描所有的日志項(xiàng)數(shù)組,并對日志項(xiàng)數(shù)組中的每一條日志進(jìn) 行回退操作。
全文摘要
本發(fā)明公開了一種按事務(wù)聚集的日志組織結(jié)構(gòu)及基于其上的恢復(fù)協(xié)議,可應(yīng)用于大型計算機(jī)上的事務(wù)性數(shù)據(jù)管理系統(tǒng)。日志文件被順序組織為若干個日志片,每個日志片存放同一個事務(wù)的日志內(nèi)容,每個日志片保留一份事務(wù)號及同事務(wù)的前項(xiàng)日志片指針,同個日志片上的日志項(xiàng)所涉及的數(shù)據(jù)頁面號以數(shù)組形式存儲。系統(tǒng)在運(yùn)行中,各事務(wù)只寫自己的日志片,并在事務(wù)提交時將日志片寫入日志文件。恢復(fù)時,通過掃描所有的日志片進(jìn)行重做,以及回退所有活躍事務(wù)的日志片進(jìn)行回退,使系統(tǒng)恢復(fù)到持久的、一致的狀態(tài)。本發(fā)明解決了傳統(tǒng)事務(wù)性數(shù)據(jù)管理系統(tǒng)中的寫日志并發(fā)瓶頸問題,并有效減少了系統(tǒng)日志量。
文檔編號G06F11/34GK102760161SQ20121019156
公開日2012年10月31日 申請日期2012年6月12日 優(yōu)先權(quán)日2012年6月12日
發(fā)明者何清法, 馮柯, 周麗霞, 徐昶, 曹暉, 李陽, 蔣志勇, 蔡華林, 顧云蘇, 饒路 申請人:天津神舟通用數(shù)據(jù)技術(shù)有限公司