成人打一炮免费视频,亚洲天堂视频在线观看,97视频久久久,日本japanese护士色高清,五月婷婷丁香,日韩精品一级无码毛片免费,国产欧美日韩精品网红剧情演绎

海量分布式數(shù)據(jù)庫存儲單元的制作方法

文檔序號:10553038閱讀:369來源:國知局
海量分布式數(shù)據(jù)庫存儲單元的制作方法【專利摘要】本發(fā)明提供一種海量分布式數(shù)據(jù)庫存儲單元,該存儲單元從下到上劃分為三個層次,即:數(shù)據(jù)存儲層、數(shù)據(jù)抽象層、數(shù)據(jù)應(yīng)用層;同時還設(shè)有元數(shù)據(jù),通過管理元數(shù)據(jù)將數(shù)據(jù)塊組織起來。數(shù)據(jù)存儲層用于管理最基本的數(shù)據(jù)塊;數(shù)據(jù)抽象層用于對數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄進行排序和基于日志的數(shù)據(jù)修改;1)數(shù)據(jù)應(yīng)用層通過調(diào)用不同的排序函數(shù)將排序規(guī)則傳入數(shù)據(jù)抽象層,使得數(shù)據(jù)抽象層能夠?qū)?shù)據(jù)塊和日志塊內(nèi)的記錄或指針排序;2)數(shù)據(jù)應(yīng)用層通過定義的合并函數(shù)實現(xiàn)對數(shù)據(jù)的增加、刪除、修改操作;3)負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口;元數(shù)據(jù)是數(shù)據(jù)塊和日志塊的索引。本發(fā)明實現(xiàn)了高效存儲?!緦@f明】海量分布式數(shù)據(jù)庫存儲單元
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及一種數(shù)據(jù)存儲結(jié)構(gòu),尤其是一種數(shù)據(jù)庫存儲單元的結(jié)構(gòu)?!?br>背景技術(shù)
】[0002]當(dāng)前計算機中的數(shù)據(jù)存儲介質(zhì)主要有硬盤、SSD、FLASH等。結(jié)合存儲容量、1(輸入輸出)性能、存儲成本等因素綜合考慮,硬盤是性價比最尚的存儲介質(zhì);硬盤具有順序訪冋性能良好、隨機訪問性能低下的特點。[0003]結(jié)合1操作耗時公式:T=C+S/M,其中T為1操作耗時,C為磁盤平均尋道時間,S為數(shù)據(jù)大小,M為磁盤帶寬。如果需要訪問的數(shù)據(jù)較小,那么在整個訪問時間中,磁頭尋道時間所占據(jù)的比例就很高,若要在訪問小文件場景下提高存儲系統(tǒng)性能,則必須對數(shù)據(jù)存儲邏輯進行優(yōu)化,以進一步減少磁盤尋道時間C。【
發(fā)明內(nèi)容】[0004]本發(fā)明的目的是克服現(xiàn)有技術(shù)中存在的不足,提供一種支持大容量、結(jié)構(gòu)化數(shù)據(jù)、有序/無序存儲、高1吞吐率的海量分布式數(shù)據(jù)庫存儲單元。鑒于該存儲單元所具有的特性,可以在此基礎(chǔ)上進一步擴展出分布式系統(tǒng)等高級應(yīng)用,并由該存儲單元為上層應(yīng)用提供最基本的數(shù)據(jù)安全、高效存儲等保證。本發(fā)明采用的技術(shù)方案是:一種海量分布式數(shù)據(jù)庫存儲單元,該存儲單元從下到上劃分為三個層次,即:數(shù)據(jù)存儲層、數(shù)據(jù)抽象層、數(shù)據(jù)應(yīng)用層;同時還設(shè)有元數(shù)據(jù),通過管理元數(shù)據(jù)將數(shù)據(jù)塊組織起來。[0005]數(shù)據(jù)存儲層用于管理最基本的數(shù)據(jù)塊;數(shù)據(jù)塊中數(shù)據(jù)的基本單位以及存儲格式為鍵值對(key-value),key是鍵對象,value是值對象;一個鍵值對就是一條數(shù)據(jù)記錄;數(shù)據(jù)塊存放于磁盤中,內(nèi)存中會設(shè)置一個塊緩存區(qū),當(dāng)塊緩存區(qū)中的數(shù)據(jù)達到預(yù)設(shè)的數(shù)據(jù)塊大小時就將這些數(shù)據(jù)作為一個完整數(shù)據(jù)塊存入磁盤中;存儲單元通過數(shù)據(jù)塊編號對數(shù)據(jù)塊進行管理,在文件中寫入數(shù)據(jù)時通過數(shù)據(jù)塊編號和塊內(nèi)偏移來定位,即<bid,0ffSet>;bid為塊編號,offset為塊內(nèi)偏移;數(shù)據(jù)抽象層用于對數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄進行排序和基于日志的數(shù)據(jù)修改;對數(shù)據(jù)記錄排序操作時,排序的規(guī)則由數(shù)據(jù)應(yīng)用層提供;基于日志的數(shù)據(jù)修改包括:不將數(shù)據(jù)修改行為立即作用在數(shù)據(jù)上,而是將這些修改操作以日志的方式記錄下來;修改操作相應(yīng)的日志記錄位于日志塊中,日志塊存于磁盤上;當(dāng)需要對數(shù)據(jù)塊內(nèi)數(shù)據(jù)修改時,對日志塊進行提交,即將日志塊與所對應(yīng)的數(shù)據(jù)塊進行合并,從而完成真正的數(shù)據(jù)修改;數(shù)據(jù)應(yīng)用層主要負責(zé):I)數(shù)據(jù)應(yīng)用層通過調(diào)用不同的排序函數(shù)將排序規(guī)則傳入數(shù)據(jù)抽象層,使得數(shù)據(jù)抽象層能夠?qū)?shù)據(jù)塊和日志塊內(nèi)的記錄或指針排序;2)數(shù)據(jù)應(yīng)用層通過定義的合并函數(shù)實現(xiàn)對數(shù)據(jù)的增加、刪除、修改操作;3)負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口;元數(shù)據(jù)是數(shù)據(jù)塊和日志塊的索引,負責(zé)記錄組成數(shù)據(jù)表格的塊信息,具體記錄了組成數(shù)據(jù)表格的塊序號以及塊中鍵值對的鍵對象Key的范圍。[0006]進一步地,數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式包括三種:第一種是未排序塊,塊內(nèi)數(shù)據(jù)按照生成的數(shù)據(jù)記錄依次向后追加,直至達到數(shù)據(jù)塊設(shè)置的大小上限后寫入磁盤;第二種是后排序塊,針對的是塊內(nèi)數(shù)據(jù)記錄的key定長、value定長;這種數(shù)據(jù)塊先按照生成的數(shù)據(jù)記錄的順序存放,待數(shù)據(jù)塊滿時通過上層數(shù)據(jù)抽象層對塊內(nèi)所有數(shù)據(jù)記錄進行排序并與入磁盤;第三種數(shù)據(jù)記錄組織形式是先按照數(shù)據(jù)記錄的生成順序依次存放,同時在數(shù)據(jù)塊的末端生成一個指針指向當(dāng)下寫入的數(shù)據(jù)記錄的位置,當(dāng)數(shù)據(jù)塊寫滿時通過上層數(shù)據(jù)抽象層統(tǒng)一對數(shù)據(jù)塊末端的所有數(shù)據(jù)指針進行排序,然后把數(shù)據(jù)塊內(nèi)數(shù)據(jù)寫入磁盤。[0007]更進一步地,日志塊內(nèi)日志記錄組織形式同數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式。[0008]進一步地,日志塊提交過程的第一步是將磁盤中已有的日志塊讀入內(nèi)存;第二步是將所有的日志塊與其對應(yīng)的數(shù)據(jù)塊數(shù)據(jù)合并,即依次讀取日志塊中的修改操作,把這些修改操作應(yīng)用到數(shù)據(jù)塊中;第三步是將合并后的數(shù)據(jù)塊內(nèi)數(shù)據(jù)進行排序,組合成新的數(shù)據(jù)塊。[0009]進一步地,所述數(shù)據(jù)應(yīng)用層負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口,具體包括:對于每一條數(shù)據(jù)記錄,其索引結(jié)構(gòu)為〈Key,bid,offset〉,其中,Key為該條數(shù)據(jù)記錄的鍵對象,bid為該條數(shù)據(jù)記錄所在的塊編號,offset為塊內(nèi)偏移;數(shù)據(jù)應(yīng)用層抽象為數(shù)據(jù)表格,在數(shù)據(jù)表格上將所有的數(shù)據(jù)記錄的索引按照key的大小劃分為多個索引組;多個索引組構(gòu)成一索引表;在每個索引組上再建立一級頂級索引,索引內(nèi)容為〈KeyL,KeyH,Id>,KeyL是該索引組最小Key,KeyH是該索引組最大Key,Id是該索引組的編號。[0010]更進一步地,頂級索引和索引組緩存在內(nèi)存中。[0011]進一步地,數(shù)據(jù)塊中數(shù)據(jù)存儲的基本結(jié)構(gòu)包括兩種:當(dāng)鍵對象key和值對象value都為定長時,采用第一種結(jié)構(gòu),即鍵對象key后緊跟值對象value;否則,采用第二種結(jié)構(gòu),在鍵對象key和值對象value前添加記錄長度L,通過記錄長度L指定key和value的總長度。[0012]進一步地,數(shù)據(jù)塊只支持三種操作:整塊寫入、整塊讀取、塊內(nèi)區(qū)域讀取。[0013]本發(fā)明的優(yōu)點在于:I)數(shù)據(jù)讀寫使用了多種緩存來提高讀寫效率。[0014]2)數(shù)據(jù)歸并和修改都通過歸并排序完成,全都是流式讀寫,將絕大部分的隨機1操作轉(zhuǎn)化為順序1操作,提高磁盤讀寫的效率。[0015]3)數(shù)據(jù)存儲容量大,可達10TB,數(shù)據(jù)條數(shù)幾十億。[0016]4)錯誤數(shù)據(jù)恢復(fù)迅速?!靖綀D說明】[0017]圖1為本發(fā)明的數(shù)據(jù)記錄格式示意圖。[0018]圖2為本發(fā)明的存儲單元層次結(jié)構(gòu)示意圖。[0019]圖3A為本發(fā)明的塊內(nèi)數(shù)據(jù)記錄組織形式之一示意圖。[0020]圖3B為本發(fā)明的塊內(nèi)數(shù)據(jù)記錄組織形式之二示意圖。[0021]圖3C為本發(fā)明的塊內(nèi)數(shù)據(jù)記錄組織形式之三示意圖。[0022]圖4為本發(fā)明的數(shù)據(jù)抽象層對塊內(nèi)數(shù)據(jù)修改操作示意圖。[0023]圖5為本發(fā)明的數(shù)據(jù)索引結(jié)構(gòu)示意圖。[0024]圖6為本發(fā)明的元數(shù)據(jù)結(jié)構(gòu)?!揪唧w實施方式】[0025]下面結(jié)合具體附圖和實施例對本發(fā)明作進一步說明。[0026]存儲單元在存儲信息時,數(shù)據(jù)的基本單位以及存儲格式為鍵值對(key-value),key是鍵對象,value是值對象;一個鍵值對就是一條數(shù)據(jù)記錄;存儲模式用以描述數(shù)據(jù)記錄中的key和value的屬性??梢詫⒕哂邢嗤鎯δJ降逆I值對的集合組成邏輯上的數(shù)據(jù)表格(table),可以對數(shù)據(jù)表格中的數(shù)據(jù)進行排序。[0027]數(shù)據(jù)的存儲單元為數(shù)據(jù)塊,一個數(shù)據(jù)塊對應(yīng)于磁盤上的一個文件,一個文件則可能包含一個或多個數(shù)據(jù)塊;若干個數(shù)據(jù)塊在邏輯上組成一個數(shù)據(jù)表格。每個鍵值對只會存儲在一個數(shù)據(jù)塊中并且是完整的。如果單機上配置了多塊磁盤,則數(shù)據(jù)塊隨機散落在這些磁盤中,并可為每個數(shù)據(jù)塊設(shè)定大小的上限為了提高存儲的可擴展性,本例中定義了二種數(shù)據(jù)存儲的基本結(jié)構(gòu),如圖1所示:鍵對象key為定長數(shù)據(jù)或以O(shè)結(jié)束的字符串,值對象value為定長或變長。當(dāng)鍵對象key和值對象value都為定長時,可采用第一種結(jié)構(gòu),即鍵對象key后緊跟值對象value;否則,采用第二種結(jié)構(gòu),在鍵對象key和值對象value前添加記錄長度L,通過記錄長度L指定key和value的總長度;根據(jù)數(shù)據(jù)的存儲邏輯,將本方案中的存儲單元從下到上劃分為三個層次,即:數(shù)據(jù)存儲層、數(shù)據(jù)抽象層、數(shù)據(jù)應(yīng)用層;同時還設(shè)有元數(shù)據(jù),通過管理元數(shù)據(jù)將數(shù)據(jù)塊組織起來;如圖2所示;其中,數(shù)據(jù)存儲層用于管理最基本的數(shù)據(jù)塊;數(shù)據(jù)抽象層主要負責(zé)對存儲層的數(shù)據(jù)進行排序以及對塊內(nèi)數(shù)據(jù)進行基于日志的修改操作,該層只對外暴露數(shù)據(jù)記錄的Key,如果需要對數(shù)據(jù)記錄進行排序,則需要根據(jù)應(yīng)用層定義的合并函數(shù)進行排序,否則數(shù)據(jù)記錄在存儲層的數(shù)據(jù)塊中只能向后追加;數(shù)據(jù)應(yīng)用層主要負責(zé):I)數(shù)據(jù)應(yīng)用層通過調(diào)用不同的排序函數(shù)將排序規(guī)則傳入數(shù)據(jù)抽象層,使得數(shù)據(jù)抽象層能夠?qū)?shù)據(jù)塊和日志塊內(nèi)的記錄(數(shù)據(jù)塊內(nèi)的數(shù)據(jù)記錄和日志塊內(nèi)的日志記錄)或指針排序;2)數(shù)據(jù)應(yīng)用層通過定義的合并函數(shù)實現(xiàn)對數(shù)據(jù)的增加、刪除、修改操作;3)負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口;元數(shù)據(jù)負責(zé)記錄組成數(shù)據(jù)表格的塊信息,它具體記錄了組成數(shù)據(jù)表格的塊序號以及塊中鍵值對的鍵對象Key的范圍等;此處的塊是指數(shù)據(jù)塊和日志塊。[0028](一)數(shù)據(jù)存儲層;在實際的機器中,每一個數(shù)據(jù)塊對應(yīng)文件系統(tǒng)中的一個文件;如果該機器配置了多塊磁盤,則會將數(shù)據(jù)塊隨機存放在某一個磁盤中。內(nèi)存中會設(shè)置一個塊緩存區(qū),當(dāng)緩存區(qū)中的數(shù)據(jù)達到預(yù)設(shè)的數(shù)據(jù)塊大小時就將這些數(shù)據(jù)作為一個完整數(shù)據(jù)塊存入磁盤中。[0029]存儲單元通過數(shù)據(jù)塊編號對數(shù)據(jù)塊進行管理,如果獲得多個數(shù)據(jù)塊編號,就可以在邏輯上得到一個大文件。理論上,單個文件大小可以擴展到所有磁盤容量的總和。在文件中寫入數(shù)據(jù)時通過數(shù)據(jù)塊編號和塊內(nèi)偏移來定位,即〈bid,offset〉;bid為塊編號,offset為塊內(nèi)偏移;為了提高底層存儲的效率,數(shù)據(jù)塊只支持三種操作:整塊寫入、整塊讀取、塊內(nèi)區(qū)域讀取。且規(guī)定已經(jīng)生成成功的數(shù)據(jù)塊是不能再做修改。這樣做可以降低數(shù)據(jù)出現(xiàn)錯誤時進行修復(fù)和保證數(shù)據(jù)一致性的難度,在并發(fā)場景下也不需要對數(shù)據(jù)塊進行加鎖,從而避免了傳統(tǒng)的并發(fā)開銷。另外,數(shù)據(jù)塊的修改操作由于是通過對塊內(nèi)數(shù)據(jù)和修改日志合并實現(xiàn)的,從而避免了磁盤的隨機寫開銷,可極大提高I/O性能;數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式主要分為三種,如圖3A、圖3B、圖3C所示:第一種是未排序塊,塊內(nèi)數(shù)據(jù)按照生成的記錄依次向后追加,直至達到數(shù)據(jù)塊設(shè)置的大小上限后寫入磁盤,如圖3A所示;第二種是后排序塊,針對的是塊內(nèi)數(shù)據(jù)記錄的key定長、value定長且數(shù)據(jù)記錄較短,這種數(shù)據(jù)塊先按照生成的記錄的順序存放,待數(shù)據(jù)塊滿時通過上層數(shù)據(jù)抽象層對塊內(nèi)所有數(shù)據(jù)記錄進行排序并寫入磁盤,如圖3B所示;第三種數(shù)據(jù)組織形式是塊內(nèi)數(shù)據(jù)記錄較長且長度波動較大時,則先按照數(shù)據(jù)記錄的生成順序依次存放,同時在數(shù)據(jù)塊的末端生成一個指針指向當(dāng)下寫入的數(shù)據(jù)記錄的位置,當(dāng)數(shù)據(jù)塊寫滿時通過上層數(shù)據(jù)抽象層統(tǒng)一對數(shù)據(jù)塊末端的所有數(shù)據(jù)指針進行排序,然后把數(shù)據(jù)塊內(nèi)數(shù)據(jù)寫入磁盤;如圖3C所示。圖3A、圖3B、圖3C中,K1,K2,…Kn代表鍵對象,V1,V2,…Vn代表值對象;pointer-Kl."pointer-Kn代表數(shù)據(jù)指針;由于數(shù)據(jù)塊內(nèi)的數(shù)據(jù)記錄長度有差異并且數(shù)據(jù)塊大小是固定的,所以有可能出現(xiàn)數(shù)據(jù)塊內(nèi)剩余空間不足以存儲下一條完整數(shù)據(jù)記錄(一個鍵值對),因而留下一些“塊內(nèi)碎片空間”;但由于數(shù)據(jù)記錄的大小本身就很小,所以這些“塊內(nèi)碎片空間”的影響很小,可以忽略。將數(shù)據(jù)存儲層的數(shù)據(jù)塊的操作封裝成統(tǒng)一的操作接口提供給上層調(diào)用者即數(shù)據(jù)抽象層使用。[0030](二)數(shù)據(jù)抽象層;數(shù)據(jù)抽象層最主要的功能是對數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄進行排序和基于日志的數(shù)據(jù)修改;如果是排序操作,則排序的規(guī)則由數(shù)據(jù)應(yīng)用層提供;另外,輸出抽象層還提供對數(shù)據(jù)塊內(nèi)數(shù)據(jù)基于日志的修改操作;基于日志的數(shù)據(jù)修改最基本的思想是不將數(shù)據(jù)修改行為立即作用在數(shù)據(jù)上,而是將這些修改操作以日志的方式記錄下來。修改操作相應(yīng)的日志記錄位于日志塊中;通過這種處理方式可以將對數(shù)據(jù)的隨機操作在一定程度上轉(zhuǎn)化為順序操作,可以節(jié)省1開銷。但是,如果數(shù)據(jù)操作日志還沒有作用在數(shù)據(jù)上,此時讀取塊內(nèi)數(shù)據(jù)就需要將塊內(nèi)數(shù)據(jù)與操作日志合并才能讀取到正確的數(shù)據(jù),這會造成數(shù)據(jù)讀取開銷的增大。[0031]日志塊內(nèi)日志記錄組織形式與數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式相同,也可以對日志記錄進行增、刪、改操作。內(nèi)存中也設(shè)置有日志緩沖塊,日志緩沖塊寫滿后會被存入磁盤。通常情況下日志塊內(nèi)的操作數(shù)據(jù)是有序的,即遵循圖3C中的模式;日志塊只是在塊內(nèi)局部有序,當(dāng)磁盤中寫入了多個日志塊后為避免日志塊數(shù)量越來越多從而對數(shù)據(jù)讀取造成嚴(yán)重影響,需要對日志塊進行提交,即將日志塊與所對應(yīng)的數(shù)據(jù)塊進行合并,從而完成真正的數(shù)據(jù)修改;日志塊提交過程的第一步是將磁盤中已有的日志塊讀入內(nèi)存,因為日志塊內(nèi)日志記錄已有序,所以可以遍歷出所有日志塊內(nèi)日志記錄的范圍;第二步是將所有的日志塊與其對應(yīng)的數(shù)據(jù)塊數(shù)據(jù)合并,即依次讀取日志塊中的修改操作,把這些修改操作應(yīng)用到數(shù)據(jù)塊中,一條日志記錄對應(yīng)一個修改操作;第三步是將合并后的數(shù)據(jù)塊內(nèi)數(shù)據(jù)進行排序,組合成新的數(shù)據(jù)塊。日志塊提交過程如圖4所示,圖4中,1gl…1gn是日志塊,datab1ckl…datablockm是數(shù)據(jù)塊;(三)數(shù)據(jù)應(yīng)用層;1)數(shù)據(jù)應(yīng)用層通過調(diào)用不同的排序函數(shù)將排序規(guī)則傳入數(shù)據(jù)抽象層,使得數(shù)據(jù)抽象層能夠?qū)?shù)據(jù)塊和日志塊內(nèi)的記錄(數(shù)據(jù)塊內(nèi)的數(shù)據(jù)記錄和日志塊內(nèi)的日志記錄)或指針排序;例如,數(shù)據(jù)應(yīng)用層調(diào)用按字典排序接口sortByDict1nary(),如果數(shù)據(jù)抽象層同一個數(shù)據(jù)塊內(nèi)有兩條記錄,它們的鍵分別為“aaba”和“aaab”,排序后,“aaab”這條記錄將會在“aaba”這條記錄之前;2)數(shù)據(jù)應(yīng)用層通過定義的合并函數(shù)實現(xiàn)對數(shù)據(jù)的增加、刪除、修改操作;例如,數(shù)據(jù)應(yīng)用層調(diào)用deleteFiIe(keyI)函數(shù),該函數(shù)將把刪除鍵為keyI的記錄的操作寫入日志塊中,此時并沒有將刪除操作應(yīng)用到實際的數(shù)據(jù)上,只是在日志塊中進行了記錄,等到日志塊提交的時候,該刪除操作將會被執(zhí)行。[0032]3)數(shù)據(jù)應(yīng)用層負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口;對于每一條數(shù)據(jù)記錄,其索引結(jié)構(gòu)為〈Key,bid,offset〉,其中,Key為該條數(shù)據(jù)記錄的鍵對象,bid為該條數(shù)據(jù)記錄所在的塊編號,offset為塊內(nèi)偏移;數(shù)據(jù)應(yīng)用層可以抽象為數(shù)據(jù)表格,在數(shù)據(jù)表格上將所有的數(shù)據(jù)記錄的索引按照key的大小劃分為多個索引組(indexgroups);—個索引組可能包括多個塊;多個索引組構(gòu)成一索引表;在每個索引組上再建立一級頂級索引,索引內(nèi)容為〈KeyL,KeyH,Id>,KeyL是該索引組最小Key,KeyH是該索引組最大Key,Id是該索引組的編號;Key的大小此處是指Key順序的尚低;當(dāng)查詢一條數(shù)據(jù)時,通過內(nèi)存中的頂級索引可以查找到該條數(shù)據(jù)記錄的索引位于哪個索引組,然后在內(nèi)存中查找該索引組,如果未找到就將該索引組從磁盤加載到內(nèi)存;從索引組讀出該條數(shù)據(jù)記錄的索引信息后即可到相應(yīng)的數(shù)據(jù)塊和對應(yīng)的偏移位置讀取數(shù)據(jù)。[0033]其中,頂級索引和索引組可以緩存在內(nèi)存中,并通過一定的緩存更新策略進行實時替換。緩存更新策略可采用LRU(最近最少使用機制)。數(shù)據(jù)索引結(jié)構(gòu)如圖5所示。由于圖5中畫面限制,圖5中的“off”代表為塊內(nèi)偏移offset,特此說明。Block表示數(shù)據(jù)塊。[0034](四)元數(shù)據(jù)管理;所有的數(shù)據(jù)都是存儲在數(shù)據(jù)塊中,大量的數(shù)據(jù)塊散落在不同的磁盤上,通過管理元數(shù)據(jù)將這些數(shù)據(jù)塊組織起來。元數(shù)據(jù)其實就是數(shù)據(jù)塊和日志塊的索引,包含的信息有塊編號、塊中的數(shù)據(jù)記錄范圍,即<bid,Keyl/,Key#>;bid為塊編號,Keyl/,Key!T分別為塊(數(shù)據(jù)塊或日志塊)的最小key和最大key;將每一個數(shù)據(jù)塊或日志塊的key范圍視作一個節(jié)點,即[Keyl/,KeyH7];所有的塊節(jié)點信息可以組織成一顆排序樹,通過對這顆排序樹的查找即可得到相應(yīng)的數(shù)據(jù)塊或日志塊。[0035]由于對塊大小設(shè)置了上限,所以頻繁的對塊內(nèi)數(shù)據(jù)進行增刪改會出現(xiàn)數(shù)據(jù)塊不斷地被分拆;過多的數(shù)據(jù)塊會對數(shù)據(jù)查詢帶來較高的開銷,所以應(yīng)該限制數(shù)據(jù)塊的增長。例如,數(shù)據(jù)存儲層會定期檢查所有數(shù)據(jù)塊內(nèi)數(shù)據(jù)的大小,如果某個數(shù)據(jù)塊內(nèi)容納的數(shù)據(jù)較小且與它相鄰的數(shù)據(jù)塊大小也未達到上限,則將這個數(shù)據(jù)塊中的數(shù)據(jù)拆分到相鄰的數(shù)據(jù)塊中,以減少塊數(shù)量。【主權(quán)項】1.一種海量分布式數(shù)據(jù)庫存儲單元,其特征在于:該存儲單元從下到上劃分為三個層次,即:數(shù)據(jù)存儲層、數(shù)據(jù)抽象層、數(shù)據(jù)應(yīng)用層;同時還設(shè)有元數(shù)據(jù),通過管理元數(shù)據(jù)將數(shù)據(jù)塊組織起來。2.如權(quán)利要求1所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:數(shù)據(jù)存儲層用于管理最基本的數(shù)據(jù)塊;數(shù)據(jù)塊中數(shù)據(jù)的基本單位以及存儲格式為鍵值對(key-value),key是鍵對象,value是值對象;一個鍵值對就是一條數(shù)據(jù)記錄;數(shù)據(jù)塊存放于磁盤中,內(nèi)存中會設(shè)置一個塊緩存區(qū),當(dāng)塊緩存區(qū)中的數(shù)據(jù)達到預(yù)設(shè)的數(shù)據(jù)塊大小時就將這些數(shù)據(jù)作為一個完整數(shù)據(jù)塊存入磁盤中;存儲單元通過數(shù)據(jù)塊編號對數(shù)據(jù)塊進行管理,在文件中寫入數(shù)據(jù)時通過數(shù)據(jù)塊編號和塊內(nèi)偏移來定位,即〈bid,offset〉;bid為塊編號,offset為塊內(nèi)偏移;數(shù)據(jù)抽象層用于對數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄進行排序和基于日志的數(shù)據(jù)修改;對數(shù)據(jù)記錄排序操作時,排序的規(guī)則由數(shù)據(jù)應(yīng)用層提供;基于日志的數(shù)據(jù)修改包括:不將數(shù)據(jù)修改行為立即作用在數(shù)據(jù)上,而是將這些修改操作以日志的方式記錄下來;修改操作相應(yīng)的日志記錄位于日志塊中,日志塊存于磁盤上;當(dāng)需要對數(shù)據(jù)塊內(nèi)數(shù)據(jù)修改時,對日志塊進行提交,即將日志塊與所對應(yīng)的數(shù)據(jù)塊進行合并,從而完成真正的數(shù)據(jù)修改;數(shù)據(jù)應(yīng)用層主要負責(zé):I)數(shù)據(jù)應(yīng)用層通過調(diào)用不同的排序函數(shù)將排序規(guī)則傳入數(shù)據(jù)抽象層,使得數(shù)據(jù)抽象層能夠?qū)?shù)據(jù)塊和日志塊內(nèi)的記錄或指針排序;2)數(shù)據(jù)應(yīng)用層通過定義的合并函數(shù)實現(xiàn)對數(shù)據(jù)的增加、刪除、修改操作;3)負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口;元數(shù)據(jù)是數(shù)據(jù)塊和日志塊的索引,負責(zé)記錄組成數(shù)據(jù)表格的塊信息,具體記錄了組成數(shù)據(jù)表格的塊序號以及塊中鍵值對的鍵對象Key的范圍。3.如權(quán)利要求2所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式包括三種:第一種是未排序塊,塊內(nèi)數(shù)據(jù)按照生成的數(shù)據(jù)記錄依次向后追加,直至達到數(shù)據(jù)塊設(shè)置的大小上限后寫入磁盤;第二種是后排序塊,針對的是塊內(nèi)數(shù)據(jù)記錄的key定長、value定長;這種數(shù)據(jù)塊先按照生成的數(shù)據(jù)記錄的順序存放,待數(shù)據(jù)塊滿時通過上層數(shù)據(jù)抽象層對塊內(nèi)所有數(shù)據(jù)記錄進行排序并與入磁盤;第三種數(shù)據(jù)記錄組織形式是先按照數(shù)據(jù)記錄的生成順序依次存放,同時在數(shù)據(jù)塊的末端生成一個指針指向當(dāng)下寫入的數(shù)據(jù)記錄的位置,當(dāng)數(shù)據(jù)塊寫滿時通過上層數(shù)據(jù)抽象層統(tǒng)一對數(shù)據(jù)塊末端的所有數(shù)據(jù)指針進行排序,然后把數(shù)據(jù)塊內(nèi)數(shù)據(jù)寫入磁盤。4.如權(quán)利要求3所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:日志塊內(nèi)日志記錄組織形式同數(shù)據(jù)塊內(nèi)數(shù)據(jù)記錄組織形式。5.如權(quán)利要求2所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:日志塊提交過程的第一步是將磁盤中已有的日志塊讀入內(nèi)存;第二步是將所有的日志塊與其對應(yīng)的數(shù)據(jù)塊數(shù)據(jù)合并,即依次讀取日志塊中的修改操作,把這些修改操作應(yīng)用到數(shù)據(jù)塊中;第三步是將合并后的數(shù)據(jù)塊內(nèi)數(shù)據(jù)進行排序,組合成新的數(shù)據(jù)塊。6.如權(quán)利要求2所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:所述數(shù)據(jù)應(yīng)用層負責(zé)將底層的所有數(shù)據(jù)塊或日志塊建立索引,將這些數(shù)據(jù)塊或日志塊串聯(lián)起來,并提供數(shù)據(jù)檢索入口,具體包括:對于每一條數(shù)據(jù)記錄,其索引結(jié)構(gòu)為〈Key,bid,offset〉,其中,Key為該條數(shù)據(jù)記錄的鍵對象,bid為該條數(shù)據(jù)記錄所在的塊編號,offset為塊內(nèi)偏移;數(shù)據(jù)應(yīng)用層抽象為數(shù)據(jù)表格,在數(shù)據(jù)表格上將所有的數(shù)據(jù)記錄的索引按照key的大小劃分為多個索引組;多個索引組構(gòu)成一索引表;在每個索引組上再建立一級頂級索引,索引內(nèi)容為〈KeyL,KeyH,Id>,KeyL是該索引組最小Key,KeyH是該索引組最大Key,Id是該索引組的編號。7.如權(quán)利要求6所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:頂級索引和索引組緩存在內(nèi)存中。8.如權(quán)利要求2所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:數(shù)據(jù)塊中數(shù)據(jù)存儲的基本結(jié)構(gòu)包括兩種:當(dāng)鍵對象key和值對象value都為定長時,采用第一種結(jié)構(gòu),即鍵對象key后緊跟值對象value;否則,采用第二種結(jié)構(gòu),在鍵對象key和值對象value前添加記錄長度L,通過記錄長度L指定key和value的總長度。9.如權(quán)利要求2所述的海量分布式數(shù)據(jù)庫存儲單元,其特征在于:數(shù)據(jù)塊只支持三種操作:整塊寫入、整塊讀取、塊內(nèi)區(qū)域讀取?!疚臋n編號】G06F17/30GK105912687SQ201610243341【公開日】2016年8月31日【申請日】2016年4月19日【發(fā)明人】王輝,劉斌,臺憲青【申請人】江蘇物聯(lián)網(wǎng)研究發(fā)展中心
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1