專(zhuān)利名稱(chēng):一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法
一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法本發(fā)明涉及電子信息和電子信息數(shù)據(jù)操作技術(shù)領(lǐng)域,具體的說(shuō)是一種有關(guān)基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法,適用于需要實(shí)現(xiàn)可回滾、大批量、高效的數(shù)據(jù)讀寫(xiě)場(chǎng)合。在證券行業(yè)中,證券交易所的交易系統(tǒng)后臺(tái)是整個(gè)證券市場(chǎng)運(yùn)行的核心。在交易時(shí)段,交易系統(tǒng)后臺(tái)會(huì)接收大量的市場(chǎng)交易指令,經(jīng)過(guò)處理后將結(jié)果推送回市場(chǎng),在這個(gè)過(guò)程中會(huì)產(chǎn)生大量的數(shù)據(jù)記錄,譬如接收I個(gè)訂單,會(huì)產(chǎn)生I條訂單確認(rèn)記錄;撮合一個(gè)成交,會(huì)產(chǎn)生2條成交確認(rèn)記錄(I條買(mǎi)記錄和I條賣(mài)記錄),這些不同種類(lèi)的數(shù)據(jù)記錄動(dòng)輒是千萬(wàn)數(shù)量級(jí)的。同時(shí)由于交易系統(tǒng)后臺(tái)需要具備高可靠性和高效性,這就需要交易系統(tǒng)后臺(tái)一方面將交易過(guò)程中產(chǎn)生的數(shù)據(jù)記錄實(shí)時(shí)放入存儲(chǔ)介質(zhì),并允許執(zhí)行事務(wù)性的提交操作,保證數(shù)據(jù)記錄的正確性和完整性,確保在系統(tǒng)發(fā)生故障時(shí)不會(huì)丟失信息,備用系統(tǒng)能夠通過(guò)加載存儲(chǔ)介質(zhì)上的數(shù)據(jù)記錄恢復(fù)系統(tǒng)狀態(tài),完成接管;另一方面又需要能滿(mǎn)足數(shù)據(jù)記錄的高效寫(xiě)入及訪問(wèn)操作,以便于對(duì)市場(chǎng)指令進(jìn)行快速處理、及時(shí)響應(yīng),避免市場(chǎng)指令大量堆積在交易系統(tǒng)后臺(tái),造成“堵單”的狀況。由于事務(wù)性的IO讀寫(xiě)操作需要在IO底層解決沖突檢測(cè)、狀態(tài)留痕、一致性驗(yàn)證等問(wèn)題,因此相比非事務(wù)性的IO讀寫(xiě)操作會(huì)有更大的系統(tǒng)開(kāi)銷(xiāo),且隨著數(shù)據(jù)量的增大,兩者之間性能上的差距會(huì)越來(lái)越大。因此采用傳統(tǒng)的方法,將每條數(shù)據(jù)記錄寫(xiě)入數(shù)據(jù)文件作為一個(gè)事務(wù)提交,那么在數(shù)據(jù)量大、實(shí)時(shí)性要求高的情況下,頻繁的IO操作很容易觸及操作系統(tǒng)的瓶頸,導(dǎo)致數(shù)據(jù)文件的吞吐量無(wú)法隨寫(xiě)操作的頻率增長(zhǎng)而線(xiàn)性增長(zhǎng)。如果采用將數(shù)據(jù)記錄打包后批量提交的方法,雖然可以減少I(mǎi)O操作,但是由于數(shù)據(jù)量大,一旦出現(xiàn)事務(wù)回滾,文件系統(tǒng)壓力就會(huì)非常大;而且對(duì)于數(shù)據(jù)量很大的文件,在需要執(zhí)行指定序號(hào)的數(shù)據(jù)記錄的讀取訪問(wèn)時(shí),如果沒(méi)有索引機(jī)制,則需要耗費(fèi)大量的IO操作對(duì)整個(gè)數(shù)據(jù)文件進(jìn)行遍歷,性能效率會(huì)很差。本發(fā)明的目的在于解決上述技術(shù)問(wèn)題,提供一種利用批量處理、索引提交、內(nèi)存索引等手段,既保證文件讀寫(xiě)的事務(wù)性,同時(shí)又保證提供高性能的高效讀寫(xiě)方法。為實(shí)現(xiàn)上述目的,設(shè)計(jì)一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法,其特征在于數(shù)據(jù)寫(xiě)方法包括以下步驟(I)將批量數(shù)據(jù)記錄以數(shù)據(jù)頁(yè)面的形式組織起來(lái),數(shù)據(jù)頁(yè)面的大小根據(jù)實(shí)際應(yīng)用的需要調(diào)整設(shè)置;(2)在內(nèi)存中開(kāi)辟數(shù)據(jù)頁(yè)面緩沖,當(dāng)每次寫(xiě)入數(shù)據(jù)記錄時(shí),先將數(shù)據(jù)記錄寫(xiě)入內(nèi)存 中的數(shù)據(jù)頁(yè)面緩沖內(nèi);(3)觸發(fā)數(shù)據(jù)頁(yè)面的提交,觸發(fā)條件為下列條件之一即可
(a)數(shù)據(jù)頁(yè)面緩沖被填滿(mǎn);(b)數(shù)據(jù)頁(yè)面緩沖未被填滿(mǎn),但數(shù)據(jù)頁(yè)面提交的最大超時(shí)時(shí)間被觸發(fā),所述的最大超時(shí)時(shí)間根據(jù)實(shí)際應(yīng)用的需要調(diào)整設(shè)置,用于避免當(dāng)數(shù)據(jù)頁(yè)面緩沖因一直未能填滿(mǎn)而無(wú)法提交,產(chǎn)生過(guò)長(zhǎng)的延時(shí);(4)提交數(shù)據(jù)頁(yè)面,包括以下步驟(a)以數(shù)據(jù)頁(yè)面為單位,使用IO接口將數(shù)據(jù)頁(yè)面寫(xiě)入數(shù)據(jù)文件;(b)當(dāng)數(shù)據(jù)頁(yè)面的寫(xiě)入操作成功后,生成一個(gè)索引,用于記錄數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的首地址,所述的索引占用空間??;(C)通過(guò)基于事務(wù)的文件IO接口,將生成的索引寫(xiě)入索引文件,完成數(shù)據(jù)頁(yè)面的提交;(5)反饋數(shù)據(jù)頁(yè)面的提交結(jié)果(a)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行成功后,數(shù)據(jù)頁(yè)面即提交成功;(b)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行失敗后,數(shù)據(jù)頁(yè)面即提交失敗,此時(shí)無(wú)須刪除數(shù)據(jù)文件中索引對(duì)應(yīng)的數(shù)據(jù)頁(yè)面,因?yàn)閷?duì)數(shù)據(jù)文件的讀取訪問(wèn)是基于索引文件,當(dāng)索引文件中索引不存在時(shí),數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)頁(yè)面為不可見(jiàn)狀態(tài);(6)當(dāng)需要對(duì)完成提交的數(shù)據(jù)頁(yè)面進(jìn)行回滾時(shí),則只需要對(duì)索引文件中數(shù)據(jù)頁(yè)面對(duì)應(yīng)的索引執(zhí)行回滾操作,無(wú)需刪除數(shù)據(jù)文件中的數(shù)據(jù)頁(yè)面,因?yàn)閷?duì)數(shù)據(jù)文件的讀取訪問(wèn)是基于索引文件,對(duì)索引文件執(zhí)行回滾操作后,數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)頁(yè)面變更為不可見(jiàn)狀態(tài);(7)在共享內(nèi)存中創(chuàng)建索引數(shù)組,用于開(kāi)放給其他用戶(hù)訪問(wèn),當(dāng)數(shù)據(jù)頁(yè)面提交成功后,向共享內(nèi)存中的索引數(shù)組添加數(shù)據(jù)頁(yè)面對(duì)應(yīng)的索引項(xiàng),所述的索引項(xiàng)包括數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移,數(shù)據(jù)頁(yè)面中數(shù)據(jù)記錄的起始序號(hào)和結(jié)束序號(hào)。(8)刷新數(shù)據(jù)頁(yè)面緩沖區(qū);(9)重置刷新定時(shí)器,至此數(shù)據(jù)寫(xiě)入操作完成。在數(shù)據(jù)頁(yè)面的整個(gè)提交過(guò)程中,只有索引的寫(xiě)入操作是基于事務(wù)的,為滿(mǎn)足事務(wù)性的要求,所有對(duì)數(shù)據(jù)記錄的訪問(wèn)必須先通過(guò)索引找到對(duì)應(yīng)的數(shù)據(jù)頁(yè)面,禁止跳過(guò)索引直接訪問(wèn)數(shù)據(jù)文件,該方法即數(shù)據(jù)讀方法包括以下步驟(I)利用二分法查找共享內(nèi)存中的索引數(shù)組,定位指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面索引,所述的索引數(shù)組中的索引項(xiàng)順序是按照索引提交順序進(jìn)行排列的,當(dāng)利用二分法查找索引數(shù)組時(shí),首先判斷指定序號(hào)是否位于數(shù)據(jù)頁(yè)面起始序號(hào)與結(jié)束序號(hào)之間,繼而定位到指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面索引,查找定位結(jié)果包括以下兩種(a)定位數(shù)據(jù)頁(yè)面索引成功,說(shuō)明指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面已經(jīng)被提交,可以繼續(xù)下一步操作;(b)定位數(shù)據(jù)頁(yè)面失敗,說(shuō)明指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面尚未被提交,讀取被拒絕;(2)獲得數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移(pageOffset),所述的位移值從數(shù)據(jù)頁(yè)面索引項(xiàng)中直接獲得;(3)獲得數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移(recOffsetlnPage)
(a)如果數(shù)據(jù)記錄定長(zhǎng),且序號(hào)連續(xù)遞增,則數(shù)據(jù)記錄的在數(shù)據(jù)頁(yè)面中的位移可以通過(guò)以下公式得到recOffsetlnPage = pageHeadSize + (recSeq - beginSeqlnPage) * recLen,其中pageHeadSize指頁(yè)面頭長(zhǎng)度,recOffsetlnPage指數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移,recSeq指數(shù)據(jù)記錄的序號(hào),beginSeqlnPage指數(shù)據(jù)頁(yè)面中數(shù)據(jù)記錄的起始序號(hào),recLen指數(shù)據(jù)記錄長(zhǎng)度;(b)如果數(shù)據(jù)記錄不定長(zhǎng)或者不保證序號(hào)連續(xù)遞增,則通過(guò)遍歷數(shù)據(jù)頁(yè)面的方式定位指定序號(hào)的數(shù)據(jù)記錄的起始位置;(4)通過(guò)數(shù)據(jù)頁(yè)面的位移和數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移,計(jì)算得到數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,計(jì)算公式如下recOffset = pageOffset + recOffsetlnPage,其中recOffset指數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,pageOffset指數(shù)據(jù)記錄所在數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移,recOffsetlnPage指數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移;(5)根據(jù)數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,通過(guò)文件IO接口從數(shù)據(jù)文件中讀取指定序號(hào)的數(shù)據(jù)記錄。本發(fā)明與現(xiàn)有技術(shù)相比,提高了證券行業(yè)計(jì)算機(jī)讀寫(xiě)超大容量數(shù)據(jù)的速度性能,具體的說(shuō)具有以下有益效用(I)利用數(shù)據(jù)頁(yè)面將批量數(shù)據(jù)記錄整合,并結(jié)合非事務(wù)性讀寫(xiě)的數(shù)據(jù)文件和事務(wù)性讀寫(xiě)的索引文件,將原本大量的事務(wù)性讀寫(xiě)操作轉(zhuǎn)換為非事務(wù)性讀寫(xiě)操作,有效地減少了事務(wù)性讀寫(xiě)的數(shù)據(jù)量,將海量數(shù)據(jù)的讀寫(xiě)操作從事務(wù)中剝離出來(lái),便于用戶(hù)選擇高性能的10接口,提聞了讀與訪問(wèn)性能;(2)通過(guò)數(shù)據(jù)緩沖、批量提交技術(shù)降低了磁盤(pán)10操作的頻率,提高吞吐量、減小延時(shí);(3)充分利用索引文件的事務(wù)特性,保證了數(shù)據(jù)的完整性和事務(wù)性,由于索引文件容量小且數(shù)據(jù)文件的高效性,實(shí)現(xiàn)了海量數(shù)據(jù)的高效讀寫(xiě),滿(mǎn)足業(yè)務(wù)需求;(4)通過(guò)內(nèi)存索引技術(shù)可實(shí)現(xiàn)數(shù)據(jù)記錄的快速定位,提高了數(shù)據(jù)的訪問(wèn)效率。圖I為本發(fā)明事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)示意圖;圖2為本發(fā)明在單機(jī)上實(shí)現(xiàn)大容量數(shù)據(jù)讀寫(xiě)系統(tǒng)示意圖;圖3為本發(fā)明二次頁(yè)面提交后事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)狀態(tài)圖;圖4為本發(fā)明事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)數(shù)據(jù)寫(xiě)方法實(shí)現(xiàn)流程圖;圖5為本發(fā)明二次提交成功后事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)狀態(tài)圖;圖6為本發(fā)明非定長(zhǎng)記錄的數(shù)據(jù)頁(yè)面緩沖區(qū)設(shè)計(jì)(方法一);圖7為本發(fā)明非定長(zhǎng)記錄的數(shù)據(jù)頁(yè)面緩沖區(qū)設(shè)計(jì)(方法二);圖8為將本發(fā)明的方法用在跨主機(jī)系統(tǒng)上實(shí)現(xiàn)的讀寫(xiě)系統(tǒng)?!榱耸贡景l(fā)明的技術(shù)方案更清楚明了,下面將結(jié)合實(shí)施例及附圖
對(duì)本發(fā)明作進(jìn)一步闡述,其中涉及的方法對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)是可以實(shí)現(xiàn)的。
首先對(duì)本專(zhuān)利中涉及的基本概念作解釋(I)事務(wù)即恢復(fù)和并發(fā)控制的基本單位,具有原子性、一致性、隔離性、持久性,稱(chēng)為ACID特性;(2)數(shù)據(jù)頁(yè)面(WP: Working Page):即事務(wù)提交和回滾操作的最小單位,一個(gè)數(shù)據(jù)頁(yè)面可包含多條數(shù)據(jù)記錄,其大小可根據(jù)實(shí)際需求做配置;(3)記錄索引(IRAKEY):—個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存提交后的數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移;(4)日志文件(IRAAUD文件)存儲(chǔ)記錄索引,即提交的數(shù)據(jù)頁(yè)面(WP)在非日志文件(AUDRPL文件)中的地址,只有在日志文件(IRAAUD文件)中登記的數(shù)據(jù)頁(yè)面,才可以開(kāi)放給用戶(hù)讀取,提供事務(wù)性的文件讀寫(xiě)操作;
(5)非日志文件(AUDRPL文件):存儲(chǔ)以數(shù)據(jù)頁(yè)面形式保存的實(shí)際的數(shù)據(jù)記錄內(nèi)容,提供非事務(wù)性的文件讀寫(xiě)操作;(6)共享內(nèi)存即一種進(jìn)程間的通訊方式,在多處理器的計(jì)算機(jī)系統(tǒng)中,可以被不同的中央處理器(CPU)訪問(wèn)的大容量?jī)?nèi)存;(7)事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE):使用本發(fā)明提供的方法,實(shí)現(xiàn)的事務(wù)性文件讀寫(xiě)模塊,每個(gè)事務(wù)性讀寫(xiě)模塊實(shí)際包含非日志文件(AUDRPL文件)、日志文件(IRAAUD文件)及MEMLOG序號(hào)索引共享內(nèi)存。若不做特殊說(shuō)明,下文中提到的事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)均指三部分組合成的整體。事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)中三部分的關(guān)系如圖I所示,圖I中顯示在AUDRPL文件中已經(jīng)順序存放了 3個(gè)頁(yè)面,IRAAUD文件中順序存放了這3個(gè)頁(yè)面的位移地址,MEMLOG序號(hào)索引內(nèi)存順序存放了這3個(gè)頁(yè)面的位移地址以及每個(gè)頁(yè)面的起始記錄序號(hào)和結(jié)束記錄序號(hào),其表達(dá)的意義為頁(yè)面I -存放了序號(hào)1-10的10條數(shù)據(jù)記錄,位移地址為O ;頁(yè)面2 -存放了序號(hào)11-33的23條數(shù)據(jù)記錄,位移地址為512 ;頁(yè)面3 -存放了序號(hào)34-55的23條數(shù)據(jù)記錄,位移地址為2046。其次結(jié)合幾個(gè)具體實(shí)施例,對(duì)本發(fā)明中讀寫(xiě)方法的實(shí)現(xiàn)作詳細(xì)說(shuō)明。實(shí)施例一將本發(fā)明的讀寫(xiě)方法運(yùn)用在單主機(jī)上,其讀寫(xiě)系統(tǒng)如圖2所示,由寫(xiě)入方、讀取方及事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)構(gòu)成,在寫(xiě)入方內(nèi)存中設(shè)有數(shù)據(jù)頁(yè)面緩沖區(qū),該數(shù)據(jù)頁(yè)面緩沖區(qū)包含一個(gè)緩沖區(qū)頭和一個(gè)用于存放實(shí)際數(shù)據(jù)記錄的數(shù)據(jù)記錄區(qū),其中緩沖區(qū)頭包括一個(gè)4字節(jié)的記錄個(gè)數(shù)字段,用于存儲(chǔ)當(dāng)前頁(yè)面緩沖區(qū)中的記錄個(gè)數(shù),所述的事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)內(nèi)置一個(gè)定時(shí)器,用于觸發(fā)數(shù)據(jù)頁(yè)面緩沖區(qū)的刷新。在本實(shí)施例中由于限定數(shù)據(jù)記錄定長(zhǎng)為512個(gè)字節(jié),且數(shù)據(jù)記錄從寫(xiě)入到開(kāi)放讀取的最大延時(shí)不能超過(guò)5t,因此在讀寫(xiě)系統(tǒng)設(shè)置時(shí),根據(jù)要求設(shè)置數(shù)據(jù)頁(yè)面(WP)的大小為1000條記錄,該數(shù)據(jù)頁(yè)面的長(zhǎng)度約為512KB (4+512*1000),定時(shí)觸發(fā)數(shù)據(jù)頁(yè)面提交的定時(shí)間隔為4to此時(shí)寫(xiě)入方可以調(diào)用事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)的寫(xiě)接口寫(xiě)入數(shù)據(jù),該數(shù)據(jù)寫(xiě)方法如圖4所示,(I)將數(shù)據(jù)記錄寫(xiě)入數(shù)據(jù)頁(yè)面緩沖區(qū);
(2)更新數(shù)據(jù)記錄數(shù)。(3)觸發(fā)數(shù)據(jù)頁(yè)面的提交,觸發(fā)條件為下列條件之一即可(a)數(shù)據(jù)頁(yè)面緩沖被填滿(mǎn);(b)數(shù)據(jù)頁(yè)面緩沖未被填滿(mǎn),但數(shù)據(jù)頁(yè)面提交的最大超時(shí)時(shí)間被觸發(fā),所述的最大超時(shí)時(shí)間根據(jù)實(shí)際應(yīng)用的需要調(diào)整設(shè)置,用于避免當(dāng)數(shù)據(jù)頁(yè)面緩沖因一直未能填滿(mǎn)而無(wú)法提交,產(chǎn)生過(guò)長(zhǎng)的延時(shí);(4)提交數(shù)據(jù)頁(yè)面,包括以下步驟(a)以數(shù)據(jù)頁(yè)面為單位,使用IO接口將數(shù)據(jù)頁(yè)面寫(xiě)入數(shù)據(jù)文件即非日志文件(AUDRPL 文件); (b)當(dāng)數(shù)據(jù)頁(yè)面的寫(xiě)入操作成功后,生成一個(gè)索引,用于記錄數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的首地址,所述的索引占用空間小;(c)通過(guò)基于事務(wù)的文件IO接口,將生成的索引寫(xiě)入索引文件即日志文件(IRAAUD文件),完成數(shù)據(jù)頁(yè)面的提交;(5)反饋數(shù)據(jù)頁(yè)面的提交結(jié)果(a)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行成功后,數(shù)據(jù)頁(yè)面即提交成功;(b)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行失敗后,數(shù)據(jù)頁(yè)面即提交失敗,此時(shí)無(wú)須刪除數(shù)據(jù)文件中索引對(duì)應(yīng)的數(shù)據(jù)頁(yè)面,因?yàn)閷?duì)數(shù)據(jù)文件的讀取訪問(wèn)是基于索引文件,當(dāng)索引文件中索引不存在時(shí),數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)頁(yè)面為不可見(jiàn)狀態(tài);(6)更新共享內(nèi)存中索引數(shù)組,當(dāng)數(shù)據(jù)頁(yè)面提交成功后,向共享內(nèi)存中的索引數(shù)組添加數(shù)據(jù)頁(yè)面對(duì)應(yīng)的索引項(xiàng),所述的索引項(xiàng)包括數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移,數(shù)據(jù)頁(yè)面中數(shù)據(jù)記錄的起始序號(hào)和結(jié)束序號(hào)。(7)刷新數(shù)據(jù)頁(yè)面緩沖區(qū);(8)重置刷新定時(shí)器;執(zhí)行上述數(shù)據(jù)寫(xiě)入操作,寫(xiě)序列和相應(yīng)的數(shù)據(jù)頁(yè)面緩沖區(qū)的狀態(tài)如表I所示表I :實(shí)施例I寫(xiě)入方寫(xiě)入序列及數(shù)據(jù)頁(yè)面緩沖區(qū)狀態(tài)
~^TI^麵,計(jì)剛I
___tfl_
OtOO
It300300
2t500800
_] 於400■
4t200400
5t100500
6t100600在表I中,(I)Ot時(shí),初始狀態(tài)下,寫(xiě)入方的數(shù)據(jù)頁(yè)面緩沖區(qū)以及事務(wù)性讀寫(xiě)模塊(MEMORYLOG FILE)都是清空的;
(2) lt、2t時(shí),寫(xiě)入方分別寫(xiě)入了 300、500條數(shù)據(jù)記錄,此時(shí)數(shù)據(jù)記錄先被寫(xiě)入到數(shù)據(jù)頁(yè)面緩沖區(qū)中,數(shù)據(jù)頁(yè)面統(tǒng)計(jì)區(qū)的記錄個(gè)數(shù)字段被依次更新為300、800 ;(3) 3t時(shí),寫(xiě)入方需要寫(xiě)入400條數(shù)據(jù)記錄,當(dāng)寫(xiě)入方寫(xiě)到第200條時(shí),此時(shí)數(shù)據(jù)記錄總數(shù)已經(jīng)累積達(dá)到1000條,觸發(fā)了數(shù)據(jù)頁(yè)面進(jìn)行提交操作的條件,事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)的寫(xiě)操作函數(shù)內(nèi)部會(huì)執(zhí)行以下提交邏輯(a)將數(shù)據(jù)頁(yè)面緩沖中的1000條數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件即AUDRPL文件;(b)產(chǎn)生數(shù)據(jù)頁(yè)面的索引記錄(address = O);(c)將索引記錄寫(xiě)入索引文件即IRAAUD文件完成提交操作;Cd)在索引共享內(nèi)存中添加索引(address, beginSeq, endSeq) = (0,1,1000);
(e)清空數(shù)據(jù)頁(yè)面緩沖,更新記錄個(gè)數(shù)為O ;Cf)重新設(shè)置定時(shí)器,在7t (3t+4t)時(shí)觸發(fā);提交完成后,寫(xiě)入方后續(xù)的200條數(shù)據(jù)記錄寫(xiě)操作,仍將把數(shù)據(jù)記錄寫(xiě)入到數(shù)據(jù)頁(yè)面緩沖區(qū)中,記錄字段被更新為200 ;(4)牡、5丨、6丨時(shí),寫(xiě)入方持續(xù)寫(xiě)入200、100、100條數(shù)據(jù)。數(shù)據(jù)記錄寫(xiě)入到數(shù)據(jù)頁(yè)面緩沖區(qū)中,數(shù)據(jù)頁(yè)面統(tǒng)計(jì)區(qū)的記錄個(gè)數(shù)字段被依次更新為400、500、600 ;(5)7t時(shí),寫(xiě)入方寫(xiě)入100條數(shù)據(jù),數(shù)據(jù)頁(yè)面緩沖區(qū)中記錄個(gè)數(shù)達(dá)到700條。此時(shí)定時(shí)器被觸發(fā),雖然此時(shí)數(shù)據(jù)頁(yè)面緩沖區(qū)沒(méi)有被填滿(mǎn),仍然觸發(fā)了頁(yè)面進(jìn)行提交操作的條件,MEMORY LOG FILE內(nèi)部會(huì)執(zhí)行以下提交邏輯Ca)將數(shù)據(jù)頁(yè)面緩沖中的700條數(shù)據(jù)寫(xiě)入AUDRPL文件;(b)產(chǎn)生數(shù)據(jù)頁(yè)面的索引記錄(address = 512004);(c)將索引記錄寫(xiě)入IRAAUD文件完成提交操作;(d)在索引共享內(nèi)存中添加索引(address, beginSeq, endSeq) = (512004,1001,1700);(e)清空數(shù)據(jù)頁(yè)面緩沖,更新記錄個(gè)數(shù)為O ;(f)重新設(shè)置定時(shí)器,在lit (7t+4t)時(shí)觸發(fā);在完成2次數(shù)據(jù)頁(yè)面提交后,事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)的狀態(tài)如圖3所示;若寫(xiě)入方在7t時(shí)寫(xiě)入AUDRPL文件過(guò)程中,寫(xiě)入400條數(shù)據(jù)后出現(xiàn)10異常,導(dǎo)致后續(xù)提交操作失敗。此時(shí)寫(xiě)入方無(wú)需對(duì)剛寫(xiě)入AUDRPL文件的400條數(shù)據(jù)部分進(jìn)行檢查校驗(yàn)和回滾操作,因?yàn)閷?duì)應(yīng)位移的數(shù)據(jù)并沒(méi)有提交到索引文件IRAAUD文件中。寫(xiě)入方可在新的文件位移處嘗試再次寫(xiě)入。若2次數(shù)據(jù)頁(yè)面提交成功后,事務(wù)性讀寫(xiě)模塊(MEMORY LOGFILE)顯示如圖5所示狀態(tài)。當(dāng)寫(xiě)入方已寫(xiě)入10000條數(shù)據(jù)記錄時(shí),讀取方開(kāi)始調(diào)用事務(wù)性讀寫(xiě)模塊(MEMORYLOG FILE)的讀接口訪問(wèn)序號(hào)為6241的記錄數(shù)據(jù),事務(wù)性讀寫(xiě)模塊(MEMORY LOG FILE)讀操作的執(zhí)行邏輯如下(I) 二分法查找MEMORY序號(hào)索引共享內(nèi)存,找到序號(hào)6241的索引記錄所在的數(shù)據(jù)頁(yè)面索引,假設(shè)找到的索引記錄為(address, beginSeq, endSeq) = (3395392,6113,6498);(2)根據(jù)公式計(jì)算得到索引記錄在數(shù)據(jù)頁(yè)面內(nèi)的位移,
65540 = 4 + (6241 - 6113) * 512 ;(3)根據(jù)公式計(jì)算得到索引記錄在數(shù)據(jù)文件中的位移,3460932 = 3395392 + 65540 ;(4)從數(shù)據(jù)文件即AUDRPL文件的位移地址3460932字節(jié)起讀取512個(gè)字節(jié),獲得序號(hào)為6241記錄數(shù)據(jù)。實(shí)施例二本發(fā)明也可用于有記錄最大長(zhǎng)度限制的非定長(zhǎng)記錄的大容量數(shù)據(jù)高效讀寫(xiě),對(duì)于非定長(zhǎng)記錄的情況,一般有2種方法實(shí)現(xiàn)。第一種方法,只需要對(duì)數(shù)據(jù)頁(yè)面緩沖區(qū)做適當(dāng)改造(如圖6所示),即可實(shí)現(xiàn)實(shí)施例 一的效果。假設(shè)數(shù)據(jù)記錄的最大長(zhǎng)度為512個(gè)字節(jié),則對(duì)每條數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面緩沖區(qū)中仍分配定長(zhǎng)512個(gè)字節(jié),并在數(shù)據(jù)記錄頭部增加一個(gè)字段,用于記錄每條數(shù)據(jù)記錄的實(shí)際長(zhǎng)度,其他的數(shù)據(jù)寫(xiě)入和讀取邏輯與實(shí)施例I相同,使用這種方法的優(yōu)點(diǎn)是邏輯簡(jiǎn)單,可利用定長(zhǎng)記錄的特點(diǎn),實(shí)現(xiàn)數(shù)據(jù)頁(yè)面內(nèi)記錄的快速定位,缺點(diǎn)是在內(nèi)存和數(shù)據(jù)文件AUDRPL使用中,都存在著空間浪費(fèi)的問(wèn)題。第二種方法,適合于記錄長(zhǎng)度差別很大,或?qū)?nèi)存和文件的空間占用敏感的系統(tǒng)。這種情況下,同樣在數(shù)據(jù)記錄頭部增加一個(gè)字段,用于記錄每條數(shù)據(jù)記錄的實(shí)際長(zhǎng)度,但使用連續(xù)存儲(chǔ)方式對(duì)數(shù)據(jù)記錄進(jìn)行保存(如圖7所示),數(shù)據(jù)寫(xiě)入邏輯與實(shí)施例1、2相同,但讀取時(shí)需要通過(guò)遍歷方式實(shí)現(xiàn)數(shù)據(jù)頁(yè)面內(nèi)的記錄定位,使用這種方法的優(yōu)點(diǎn)是節(jié)省了內(nèi)存和數(shù)據(jù)文件AUDRPL的占用空間,缺點(diǎn)是降低了讀取數(shù)據(jù)記錄的效率,由于遍歷只在一個(gè)數(shù)據(jù)頁(yè)面內(nèi)進(jìn)行,相比較整個(gè)數(shù)據(jù)文件的遍歷,在數(shù)量級(jí)上降低了空間復(fù)雜度,仍舊屬于一種高效的讀取方法。實(shí)施例三系統(tǒng)采用多主機(jī)和共享存儲(chǔ)設(shè)備實(shí)現(xiàn)主備架構(gòu),比較常用的模式是Master主機(jī)上的業(yè)務(wù)進(jìn)程不斷將業(yè)務(wù)數(shù)據(jù)落到共享存儲(chǔ)設(shè)備上,一旦Master主機(jī)出現(xiàn)故障或者M(jìn)aster主機(jī)上的業(yè)務(wù)進(jìn)程出現(xiàn)異常,Slave主機(jī)將用本機(jī)上的業(yè)務(wù)進(jìn)程實(shí)現(xiàn)接管,負(fù)責(zé)從共享存儲(chǔ)上加載業(yè)務(wù)數(shù)據(jù)文件,加載完畢后進(jìn)行后續(xù)的業(yè)務(wù)處理。這種主備切換的實(shí)現(xiàn),一方面要求業(yè)務(wù)數(shù)據(jù)文件是通過(guò)事務(wù)保證文件的正確性和完整性的,另一方面要求備機(jī)的接管能夠在較短時(shí)間內(nèi)完成,盡快恢復(fù)對(duì)外提供業(yè)務(wù)處理的功能。將本發(fā)明的方法用在上述跨主機(jī)系統(tǒng)上實(shí)現(xiàn)大容量數(shù)據(jù)高效讀寫(xiě),其讀寫(xiě)系統(tǒng)如圖8所示,Master主機(jī)上的業(yè)務(wù)進(jìn)程通過(guò)MEMORY LOG FILE模塊將業(yè)務(wù)數(shù)據(jù)落到共享存儲(chǔ)設(shè)備上,同時(shí)Slave主機(jī)上的業(yè)務(wù)進(jìn)程通過(guò)MEMORY LOG FILE模塊不斷從業(yè)務(wù)數(shù)據(jù)文件中讀取數(shù)據(jù),重構(gòu)備機(jī)上的MEMLOG序號(hào)索引內(nèi)存,一旦出現(xiàn)Master主機(jī)宕機(jī),業(yè)務(wù)數(shù)據(jù)文件將不再發(fā)生增長(zhǎng),備機(jī)上的業(yè)務(wù)進(jìn)程只需要掃描全部的業(yè)務(wù)數(shù)據(jù)文件,重構(gòu)完MEMLOG序號(hào)索引內(nèi)存,即可將自身切換到主應(yīng)用狀態(tài),恢復(fù)業(yè)務(wù)處理功能。因?yàn)镾lave主機(jī)上的業(yè)務(wù)進(jìn)程在發(fā)生切換前也一直執(zhí)行重構(gòu)索引內(nèi)存的操作,因此在發(fā)生切換時(shí),只需要很短的時(shí)間即可追上Master主機(jī)上業(yè)務(wù)進(jìn)程的狀態(tài)。
權(quán)利要求
1.一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法,其特征在于數(shù)據(jù)寫(xiě)方法包括以下步驟 (1)將批量數(shù)據(jù)記錄以數(shù)據(jù)頁(yè)面的形式組織起來(lái),數(shù)據(jù)頁(yè)面的大小根據(jù)實(shí)際應(yīng)用的需要調(diào)整設(shè)置; (2)在內(nèi)存中開(kāi)辟數(shù)據(jù)頁(yè)面緩沖,當(dāng)每次寫(xiě)入數(shù)據(jù)記錄時(shí),先將數(shù)據(jù)記錄寫(xiě)入內(nèi)存中的數(shù)據(jù)頁(yè)面緩沖內(nèi); (3)觸發(fā)數(shù)據(jù)頁(yè)面的提交,觸發(fā)條件為下列條件之一即可 (a)數(shù)據(jù)頁(yè)面緩沖被填滿(mǎn); (b)數(shù)據(jù)頁(yè)面緩沖未被填滿(mǎn),但數(shù)據(jù)頁(yè)面提交的最大超時(shí)時(shí)間被觸發(fā),所述的最大超時(shí)時(shí)間根據(jù)實(shí)際應(yīng)用的需要調(diào)整設(shè)置,用于避免當(dāng)數(shù)據(jù)頁(yè)面緩沖因一直未能填滿(mǎn)而無(wú)法提交,產(chǎn)生過(guò)長(zhǎng)的延時(shí); (4)提交數(shù)據(jù)頁(yè)面,包括以下步驟 (a)以數(shù)據(jù)頁(yè)面為單位,使用IO接口將數(shù)據(jù)頁(yè)面寫(xiě)入數(shù)據(jù)文件; (b)當(dāng)數(shù)據(jù)頁(yè)面的寫(xiě)入操作成功后,生成一個(gè)索引,用于記錄數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的首地址,所述的索引占用空間??; (c)通過(guò)基于事務(wù)的文件IO接口,將生成的索引寫(xiě)入索引文件,完成數(shù)據(jù)頁(yè)面的提交; (5)反饋數(shù)據(jù)頁(yè)面的提交結(jié)果 (a)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行成功后,數(shù)據(jù)頁(yè)面即提交成功; (b)當(dāng)基于事務(wù)的索引寫(xiě)入索引文件過(guò)程執(zhí)行失敗后,數(shù)據(jù)頁(yè)面即提交失敗,此時(shí)無(wú)需刪除數(shù)據(jù)文件中索引對(duì)應(yīng)的數(shù)據(jù)頁(yè)面,因?yàn)閷?duì)數(shù)據(jù)文件的讀取訪問(wèn)是基于索引文件,當(dāng)索引文件中索引不存在時(shí),數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)頁(yè)面為不可見(jiàn)狀態(tài); (6)當(dāng)需要對(duì)完成提交的數(shù)據(jù)頁(yè)面進(jìn)行回滾時(shí),則只需要對(duì)索引文件中數(shù)據(jù)頁(yè)面對(duì)應(yīng)的索引執(zhí)行回滾操作,無(wú)需刪除數(shù)據(jù)文件中的數(shù)據(jù)頁(yè)面,因?yàn)閷?duì)數(shù)據(jù)文件的讀取訪問(wèn)是基于索引文件,對(duì)索引文件執(zhí)行回滾操作后,數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)頁(yè)面變更為不可見(jiàn)狀態(tài); (7)在共享內(nèi)存中創(chuàng)建索引數(shù)組,用于開(kāi)放給其他用戶(hù)訪問(wèn),當(dāng)數(shù)據(jù)頁(yè)面提交成功后,向共享內(nèi)存中的索引數(shù)組添加數(shù)據(jù)頁(yè)面對(duì)應(yīng)的索引項(xiàng),所述的索引項(xiàng)包括數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移,數(shù)據(jù)頁(yè)面中數(shù)據(jù)記錄的起始序號(hào)和結(jié)束序號(hào)。
(8)刷新數(shù)據(jù)頁(yè)面緩沖區(qū); (9)重置刷新定時(shí)器,至此數(shù)據(jù)寫(xiě)入操作完成。
2.如權(quán)利要求I所述的一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法,其特征在于在數(shù)據(jù)頁(yè)面的整個(gè)提交過(guò)程中,只有索引的寫(xiě)入操作是基于事務(wù)的,為滿(mǎn)足事務(wù)性的要求,所有對(duì)數(shù)據(jù)記錄的訪問(wèn)必須先通過(guò)索引找到對(duì)應(yīng)的數(shù)據(jù)頁(yè)面,禁止跳過(guò)索引直接訪問(wèn)數(shù)據(jù)文件,該方法即數(shù)據(jù)讀方法包括以下步驟 (I)利用二分法查找共享內(nèi)存中的索引數(shù)組,定位指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面索引,所述的索引數(shù)組中的索引項(xiàng)順序是按照索引提交順序進(jìn)行排列的,當(dāng)利用二分法查找索引數(shù)組時(shí),首先判斷指定序號(hào)是否位于數(shù)據(jù)頁(yè)面起始序號(hào)與結(jié)束序號(hào)之間,繼而定位到指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面索引,查找定位結(jié)果包括以下兩種 (a)定位數(shù)據(jù)頁(yè)面索引成功,說(shuō)明指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面已經(jīng)被提交,可以繼續(xù)下一步操作;(b)定位數(shù)據(jù)頁(yè)面失敗,說(shuō)明指定序號(hào)的數(shù)據(jù)記錄所在的數(shù)據(jù)頁(yè)面尚未被提交,讀取被拒絕; (2)獲得數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移(pageOffset),所述的位移值從數(shù)據(jù)頁(yè)面索引項(xiàng)中直接獲得; (3)獲得數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移(recOffsetlnPage) (a)如果數(shù)據(jù)記錄定長(zhǎng),且序號(hào)連續(xù)遞增,則數(shù)據(jù)記錄的在數(shù)據(jù)頁(yè)面中的位移可以通過(guò)以下公式得到recOffsetlnPage = pageHeadSize + (recSeq - beginSeqlnPage)氺 recLen,其中pageHeadSize指頁(yè)面頭長(zhǎng)度,recOffsetlnPage指數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移,recSeq指數(shù)據(jù)記錄的序號(hào),beginSeqlnPage指數(shù)據(jù)頁(yè)面中數(shù)據(jù)記錄的起始序號(hào),recLen指數(shù)據(jù)記錄長(zhǎng)度; (b)如果數(shù)據(jù)記錄不定長(zhǎng)或者不保證序號(hào)連續(xù)遞增,則通過(guò)遍歷數(shù)據(jù)頁(yè)面的方式定位指定序號(hào)的數(shù)據(jù)記錄的起始位置; (4)通過(guò)數(shù)據(jù)頁(yè)面的位移和數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移,計(jì)算得到數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,計(jì)算公式如下recOffset = pageOffset + recOffsetlnPage, 其中recOffset指數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,pageOffset指數(shù)據(jù)記錄所在數(shù)據(jù)頁(yè)面在數(shù)據(jù)文件中的位移,recOffsetlnPage指數(shù)據(jù)記錄在數(shù)據(jù)頁(yè)面中的位移; (5)根據(jù)數(shù)據(jù)記錄在數(shù)據(jù)文件中的位移,通過(guò)文件IO接口從數(shù)據(jù)文件中讀取指定序號(hào)的數(shù)據(jù)記錄。
全文摘要
本發(fā)明涉及電子信息和電子信息數(shù)據(jù)操作技術(shù)領(lǐng)域,具體的說(shuō)是一種基于事務(wù)的大容量數(shù)據(jù)讀寫(xiě)方法。寫(xiě)方法將數(shù)據(jù)記錄以數(shù)據(jù)頁(yè)面的組織起來(lái)進(jìn)行批量處理,同時(shí)將大量的事務(wù)性寫(xiě)操作轉(zhuǎn)換為非事務(wù)性寫(xiě)操作,有效減少了事務(wù)性讀寫(xiě)的數(shù)據(jù)量,利用索引文件的事務(wù)特性,既保證了數(shù)據(jù)的完整性和事務(wù)性,又實(shí)現(xiàn)了海量數(shù)據(jù)的高效讀寫(xiě);讀方法使用共享內(nèi)存建立數(shù)據(jù)頁(yè)面索引,通過(guò)二分法實(shí)現(xiàn)數(shù)據(jù)記錄的快速定位。在需要對(duì)海量數(shù)據(jù)進(jìn)行事務(wù)性讀寫(xiě)的場(chǎng)景下,利用本發(fā)明能夠達(dá)到減少I(mǎi)O操作,提高吞吐量,減小延時(shí)的目的。
文檔編號(hào)G06F3/06GK102929935SQ20121036197
公開(kāi)日2013年2月13日 申請(qǐng)日期2012年9月25日 優(yōu)先權(quán)日2012年9月25日
發(fā)明者吳征, 武劍鋒, 王泊, 陳晨, 朱立, 劉凱, 劉經(jīng)緯, 黃寅飛, 陸素源, 鄭剛, 白碩 申請(qǐng)人:上海證券交易所