本發(fā)明涉及數(shù)據(jù)存儲(chǔ)計(jì)算領(lǐng)域,特別涉及一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)及數(shù)據(jù)存儲(chǔ)方法和數(shù)據(jù)查詢方法。
背景技術(shù):
::傳統(tǒng)的行式數(shù)據(jù)庫(kù),是按照行存儲(chǔ)的。行式存儲(chǔ)一般用在關(guān)系數(shù)據(jù)庫(kù)中,其優(yōu)勢(shì)在于處理OLTP型業(yè)務(wù)。而列式數(shù)據(jù)庫(kù)恰恰相反,列式數(shù)據(jù)庫(kù)的數(shù)據(jù)是按照列存儲(chǔ),每一列單獨(dú)存放,數(shù)據(jù)訪問某些列時(shí),只需要訪問查詢涉及的列,大大降低了系統(tǒng)的數(shù)據(jù)傳輸量。而且,由于數(shù)據(jù)類型一致,數(shù)據(jù)特征相似,極大方便壓縮,提到了壓縮率。行式數(shù)據(jù)庫(kù)擅長(zhǎng)隨機(jī)讀和更新操作,列式數(shù)據(jù)庫(kù)則更擅長(zhǎng)大批量數(shù)據(jù)量查詢。而行列混合存儲(chǔ)兼顧了行存儲(chǔ)和列存儲(chǔ)的優(yōu)點(diǎn)。行列存儲(chǔ)中一個(gè)重要的問題,就是如何索引數(shù)據(jù),以達(dá)到數(shù)據(jù)快速定位。以及如何在有索引情況下,降低內(nèi)存使用量。現(xiàn)有技術(shù)技術(shù)一方案:CN201310296167數(shù)據(jù)庫(kù)系統(tǒng)的行列混合存儲(chǔ)方法。這個(gè)方法是行列混合存儲(chǔ)是以表為單位。也就是說(shuō),一個(gè)表要么整個(gè)表都是行存儲(chǔ),要么整個(gè)表都是列存儲(chǔ)。該方法在數(shù)據(jù)庫(kù)系統(tǒng)的存儲(chǔ)層分別設(shè)立一個(gè)行存儲(chǔ)引擎和一個(gè)列存儲(chǔ)引擎,然后由訪問接口層將兩者封裝起來(lái),對(duì)列表進(jìn)行元組物化,對(duì)行表進(jìn)行投影,向查詢引擎提供統(tǒng)一的數(shù)據(jù)訪問接口,從而隱藏存儲(chǔ)差別,實(shí)現(xiàn)查詢處理的統(tǒng)一化。行列混合存儲(chǔ)查詢流程。根據(jù)創(chuàng)建表時(shí)的存儲(chǔ)模型,在查詢語(yǔ)句的解析階段,獲取表的存儲(chǔ)模式;結(jié)合查詢分析的相關(guān)信息生成<文件ID,存儲(chǔ)模式,屬性列表,選擇條件列表>四個(gè)訪問參數(shù)。執(zhí)行引擎在訪問數(shù)據(jù)時(shí)將訪問參數(shù)傳給存儲(chǔ)引擎,存儲(chǔ)引擎根據(jù)參數(shù)選擇適當(dāng)?shù)姆椒ㄗx取數(shù)據(jù)并作選擇、投影處理后返回?cái)?shù)據(jù)。現(xiàn)有技術(shù)技術(shù)一方案缺點(diǎn):由于一個(gè)表要么是整個(gè)表都是行存儲(chǔ),要么整個(gè)表都是列存儲(chǔ)。已定的存儲(chǔ)方案并不能夠很好的應(yīng)對(duì)對(duì)表的更新后的存儲(chǔ)。比如,原定于適應(yīng)于行存儲(chǔ)的表,由于表的更新,列存儲(chǔ)更加適合。此時(shí),表需要重新存儲(chǔ)。表重新存儲(chǔ)代價(jià)大?,F(xiàn)有技術(shù)技術(shù)二方案:Hyper數(shù)據(jù)庫(kù)管理系統(tǒng)提出數(shù)據(jù)組織方式——《DataBlocks:HybridOLTPandOLAPonCompressedStorageusingbothVectorizationandCompilation》。其數(shù)據(jù)組織結(jié)構(gòu)頭部中,設(shè)定了數(shù)據(jù)相對(duì)部分的偏移量。分別是SMA、字典、數(shù)據(jù)壓縮策略,和字符數(shù)據(jù)的偏移量。Hyper提出的存儲(chǔ)結(jié)構(gòu)包括:tuplecount、smaoffset、dictoffset、dataoffset、stringoffset。tuplecount是該存儲(chǔ)單元中的存儲(chǔ)的單列數(shù)據(jù)的行數(shù),smaoffset、dictoffset、dataoffset、stringoffset分別是SMA、字典、非字符類型數(shù)據(jù)、字符類型數(shù)據(jù)對(duì)應(yīng)于存儲(chǔ)單元起始位置的偏移量,compression是數(shù)據(jù)的壓縮方式。現(xiàn)在技術(shù)二方案缺點(diǎn):其數(shù)據(jù)組織結(jié)構(gòu)頭部中,設(shè)定了數(shù)據(jù)相對(duì)部分的偏移量。分別是SMA、字典、數(shù)據(jù)壓縮策略,和字符數(shù)據(jù)的偏移量。這么設(shè)定,限定了接下來(lái)數(shù)據(jù)的組織方式必須有SMA等。雖然這些字段只是偏移量,如果我們不用字典,可以通過將字典偏移量字段設(shè)置為一個(gè)無(wú)效值。但是,如此一來(lái),字典偏移量字段本身占用了額外空間。其數(shù)據(jù)的索引采用的是SMA作為自己的索引。其優(yōu)點(diǎn)是在數(shù)據(jù)值小的情況下,能夠很好的索引到所需要的數(shù)據(jù)。但是數(shù)據(jù)值相對(duì)較大情況下,落在同一個(gè)索引區(qū)間的數(shù)據(jù)多,那么索引范圍擴(kuò)大,索引準(zhǔn)確度降低。以查找998這個(gè)數(shù)據(jù)為例,和998所屬的同一個(gè)索引區(qū)間的值理論有2^8個(gè),準(zhǔn)確度很低。除此之外,當(dāng)源數(shù)據(jù)傾斜嚴(yán)重的情況下,如果數(shù)據(jù)沒有排序,即使是有SMA作索引,依然需要遍歷整個(gè)列。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)及數(shù)據(jù)存儲(chǔ)方法和數(shù)據(jù)查詢方法,本發(fā)明主要解決的問題是分布式環(huán)境下,數(shù)據(jù)庫(kù)中數(shù)據(jù)索引和存儲(chǔ)問題。達(dá)到的效果是:高效索引,即使在數(shù)據(jù)偏移情況下,通過值讀取位置時(shí)間復(fù)雜度是O(logN),通過數(shù)據(jù)的位置取值的時(shí)間復(fù)雜度是O(1)。一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu),包括:主控節(jié)點(diǎn):用于建立數(shù)據(jù)存儲(chǔ)單元Block到所在的物理機(jī)器的映射關(guān)系、統(tǒng)計(jì)全局負(fù)載情況以及生成數(shù)據(jù)存儲(chǔ)單元Block的ID;數(shù)據(jù)導(dǎo)入管理器:用于對(duì)外部數(shù)據(jù)進(jìn)行緩沖,將外部數(shù)據(jù)按照數(shù)據(jù)值排序,生成索引Groupkey和數(shù)據(jù),然后生成數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)索引Groupkey和數(shù)據(jù),最后導(dǎo)入數(shù)據(jù)存儲(chǔ)單元Block到存儲(chǔ)節(jié)點(diǎn);存儲(chǔ)節(jié)點(diǎn):存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block,對(duì)查詢者提供查詢功能;存儲(chǔ)節(jié)點(diǎn)包括子元數(shù)據(jù)管理器、數(shù)據(jù)存儲(chǔ)單元Block、數(shù)據(jù)讀取器模塊;子元數(shù)據(jù)管理器:用于維護(hù)存儲(chǔ)節(jié)點(diǎn)內(nèi)部由數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列到數(shù)據(jù)存儲(chǔ)單元Block的映射、維護(hù)數(shù)據(jù)存儲(chǔ)單元Block的生命周期;數(shù)據(jù)存儲(chǔ)單元Block:用于存儲(chǔ)索引Groupkey和數(shù)據(jù);數(shù)據(jù)讀取器模塊:用于按照存儲(chǔ)的索引Groupkey提供范圍查詢和等值查詢接口,為外部提供了數(shù)據(jù)訪問,具有指向真實(shí)數(shù)據(jù)的指針。本發(fā)明利用數(shù)據(jù)導(dǎo)入管理器導(dǎo)入外部數(shù)據(jù),并生成數(shù)據(jù)存儲(chǔ)單元Block和元數(shù)據(jù),數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)了索引Groupkey和數(shù)據(jù);利用存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block;利用存儲(chǔ)節(jié)的子元數(shù)據(jù)管理器維護(hù)存儲(chǔ)節(jié)點(diǎn)內(nèi)部的庫(kù)表列到數(shù)據(jù)存儲(chǔ)單元Block的映射;利用主控節(jié)點(diǎn)建立數(shù)據(jù)存儲(chǔ)單元Block到所在的物理機(jī)器的映射關(guān)系。通過以上部件構(gòu)建起一個(gè)分布式數(shù)據(jù)存儲(chǔ)架構(gòu)。其中存儲(chǔ)節(jié)點(diǎn)一般為多個(gè),每個(gè)存儲(chǔ)節(jié)點(diǎn)接受數(shù)據(jù)導(dǎo)入管理器數(shù)據(jù),受到主控節(jié)點(diǎn)管制,每個(gè)存儲(chǔ)節(jié)點(diǎn)有包含子元數(shù)據(jù)管理器、數(shù)據(jù)讀取器以及多個(gè)數(shù)據(jù)存儲(chǔ)單元Block,存儲(chǔ)數(shù)據(jù)單元Block可以提供范圍和等值查詢。數(shù)據(jù)存儲(chǔ)單元Block按照值的大小進(jìn)行存儲(chǔ),且每個(gè)范圍都標(biāo)有對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)單元Block的ID,這樣能大幅提高查詢時(shí)間,達(dá)到高效索引的目的。優(yōu)選的,所述主控節(jié)點(diǎn)的元數(shù)據(jù)組織為由數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列以及每個(gè)存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)中包含的列的列值范圍到存儲(chǔ)節(jié)點(diǎn)的地址的映射,主控節(jié)點(diǎn)的元數(shù)據(jù)組織的結(jié)構(gòu)為:<數(shù)據(jù)庫(kù)名、表名字,列名、列值范圍、存儲(chǔ)節(jié)點(diǎn)的地址>。存儲(chǔ)節(jié)點(diǎn)的元數(shù)據(jù)組織為數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列到數(shù)據(jù)存儲(chǔ)單元Block的映射,存儲(chǔ)節(jié)點(diǎn)的元數(shù)據(jù)組織的結(jié)構(gòu)為:<數(shù)據(jù)庫(kù)名、表名字、列名、列值范圍、數(shù)據(jù)存儲(chǔ)單元Block的ID>。優(yōu)選的,數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)數(shù)據(jù)的方式為:以索引Groupkey加數(shù)據(jù)的方式存儲(chǔ)在數(shù)據(jù)存儲(chǔ)單元Block當(dāng)中,一個(gè)數(shù)據(jù)存儲(chǔ)單元Block包含一張表的若干列或全部的列,每張表的所有的列都會(huì)在數(shù)據(jù)存儲(chǔ)單元Block中存儲(chǔ),在數(shù)據(jù)導(dǎo)入管理器生成這個(gè)數(shù)據(jù)存儲(chǔ)單元Block的時(shí)候,生成這個(gè)數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的元數(shù)據(jù),在存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block的時(shí)候,記錄元數(shù)據(jù)到子元數(shù)據(jù)管理器中。數(shù)據(jù)存儲(chǔ)單元Block的頭部結(jié)構(gòu)分為定長(zhǎng)結(jié)構(gòu)和變長(zhǎng)兩個(gè)部分:定長(zhǎng)部分包括:block_id、begin_rowid、rows。block_id:表示數(shù)據(jù)存儲(chǔ)單元block的編號(hào),由數(shù)據(jù)導(dǎo)入管理器生成,全局唯一:每個(gè)數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)著一個(gè)全局唯一的block_id;begin_rowid:指明了這個(gè)數(shù)據(jù)存儲(chǔ)單元Block中所存儲(chǔ)的數(shù)據(jù)的起始的rowid。rows:表明這個(gè)數(shù)據(jù)存儲(chǔ)單元Block中一共有多少行的數(shù)據(jù)。變長(zhǎng)部分包括:column_offset。column_offset:column_offset為一個(gè)數(shù)組,第i個(gè)值表示這個(gè)數(shù)據(jù)存儲(chǔ)單元Block中的第i個(gè)列的物理位置相對(duì)于數(shù)據(jù)存儲(chǔ)單元Block起始頭部的偏移量。數(shù)據(jù)存儲(chǔ)單元Block中有的庫(kù)表列是由外部元數(shù)據(jù)所描述的,因?yàn)槿绻總€(gè)數(shù)據(jù)存儲(chǔ)單元Block中都存儲(chǔ)一份會(huì)浪費(fèi)空間;因此,在存儲(chǔ)節(jié)點(diǎn)生成這個(gè)數(shù)據(jù)存儲(chǔ)單元Block的時(shí)候,會(huì)生成這個(gè)數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的庫(kù)名、表名和列名數(shù)據(jù)信息注冊(cè)到子元數(shù)據(jù)管理器中。所述column_offset的內(nèi)部邏輯結(jié)構(gòu)包括column_type部分和其余約定部分,column_type部分表示頭部,其余約定部分是根據(jù)column_type部分由使用人員根據(jù)具體的需求具體約定。所述column_type的數(shù)據(jù)組織方式是以索引Groupkey方式組織或者是以鍵值對(duì)方式組以及其對(duì)應(yīng)的壓縮方式,所述壓縮方式是字節(jié)壓縮或者是位壓縮;一般的,column_type目前設(shè)定為4個(gè)字節(jié),前一個(gè)字節(jié)表示是索引Groupkey或者其他壓縮方式。第二個(gè)字節(jié)標(biāo)識(shí)是字節(jié)壓縮還是位壓縮。第三個(gè)和第四個(gè)字節(jié)為保留字節(jié)。今后如果業(yè)務(wù)需求變化,column_type字節(jié)大小可以重新設(shè)置。該方案中的方式列舉出以索引Groupkey方式組織數(shù)據(jù)并配合以字節(jié)壓縮或者位壓縮。索引Groupkey:是一種在內(nèi)存分布式列數(shù)據(jù)庫(kù)中的數(shù)據(jù)組織方式,其采用字典壓縮對(duì)每列內(nèi)容進(jìn)行壓縮,采用索引向量index對(duì)字典向量中某個(gè)值對(duì)應(yīng)在position向量中的范圍進(jìn)行界定,采用位置向量position存儲(chǔ)字典向量對(duì)應(yīng)的行號(hào)rowid的集合。同時(shí),有一個(gè)行表向量rowtable,行表向量rowtable是維持行關(guān)系的向量,行表向量rowtable里面存儲(chǔ)的是元素值在字典向量中的下標(biāo);結(jié)合索引Groupkey的特性,對(duì)于索引向量index,存儲(chǔ)對(duì)應(yīng)的位壓縮或者字節(jié)壓縮后的值;對(duì)于位置向量position,我們只存儲(chǔ)其值相對(duì)于begin_rowid的偏移量;對(duì)于行表向量rowtable,其每一行與原始表一一對(duì)應(yīng),行表向量rowtable中的值是字典的下標(biāo),索引向量index、位置向量position、行表向量rowtable采用位壓縮或者字節(jié)壓縮。例如:自定義的column頭部信息:index_width:index字段位寬或者字節(jié)寬度;position_width:position字段位寬或者字節(jié)寬度;rowtable_width:rowtable字段位寬或者字節(jié)寬度。數(shù)據(jù)體:dictionary:Groupkey的字典向量;index:Groupkey的索引向量;position:Groupkey的位置向量;rowtable:行表向量。其中,如果這個(gè)列是字符串類型,對(duì)于字典向量,則將每個(gè)字符串的值拼接為一個(gè)大的字符串(dictionary_string),同時(shí)配合以每個(gè)字符串在大字符串中的域值向量(dictionary_region)的方式存儲(chǔ)。根據(jù)一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)的數(shù)據(jù)存儲(chǔ)方法,S1、主控節(jié)點(diǎn)根據(jù)每張表的列的寬度和有多少列決定每個(gè)數(shù)據(jù)存儲(chǔ)單元Block中表的行數(shù)和列數(shù),以及所要發(fā)往的存儲(chǔ)節(jié)點(diǎn)的IP,將這些信息告訴數(shù)據(jù)導(dǎo)入管理器;S2、數(shù)據(jù)導(dǎo)入管理器將外部數(shù)據(jù)源讀取上來(lái)的數(shù)據(jù)排序,生成數(shù)據(jù)字典,確定索引向量index、位置向量position、行表向量rowtable的壓縮的位寬或者字節(jié)寬度;S3、數(shù)據(jù)導(dǎo)入管理器根據(jù)壓縮的位寬或者字節(jié)寬度,生成壓縮的索引向量index、位置向量position、行表向量rowtable,同時(shí)統(tǒng)計(jì)元數(shù)據(jù)。根據(jù)數(shù)據(jù)存儲(chǔ)單元Block的內(nèi)部設(shè)計(jì),依次在數(shù)據(jù)存儲(chǔ)單元Block內(nèi)填入頭部信息和上述數(shù)據(jù)體;S4、數(shù)據(jù)導(dǎo)入管理器將一個(gè)數(shù)據(jù)存儲(chǔ)單元Block的數(shù)據(jù)和數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的元數(shù)據(jù)信息發(fā)送給存儲(chǔ)節(jié)點(diǎn),同時(shí)發(fā)送一份對(duì)應(yīng)的元數(shù)據(jù)信息給主控節(jié)點(diǎn);S5、存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)導(dǎo)入管理器發(fā)送的數(shù)據(jù)存儲(chǔ)單元Block,將對(duì)應(yīng)的元數(shù)據(jù)信息記錄到子元數(shù)據(jù)管理器。如果采用的運(yùn)行時(shí)庫(kù)提供了歸還操作系統(tǒng)未使用的內(nèi)存的接口,最后調(diào)用相應(yīng)接口,釋放多余內(nèi)存;S6、主控節(jié)點(diǎn)將導(dǎo)入管理器發(fā)送的對(duì)應(yīng)的元數(shù)據(jù)記錄下來(lái)。根據(jù)所述的一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)的數(shù)據(jù)查詢方法,查找數(shù)據(jù)庫(kù)ID為db_id,表名為table_name,列名為col_name的查找數(shù)據(jù)存儲(chǔ)單元Block的過程是:D1、訪問主控節(jié)點(diǎn),發(fā)送所要訪問的數(shù)據(jù)的庫(kù)表列信息,以及包含對(duì)應(yīng)列的范圍的消息給主控節(jié)點(diǎn),查詢包括以下兩種:通過值查詢r(jià)owid:通過給定值范圍或者定值查詢匹配的rowid;通過rowid查詢值:通過給定rowid集合查詢每個(gè)rowid對(duì)應(yīng)的值;D2、主控節(jié)點(diǎn)返回這次查詢請(qǐng)求涉及到的存儲(chǔ)節(jié)點(diǎn)的IP地址;D3、查詢客戶端與對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)建立連接,并向?qū)?yīng)的存儲(chǔ)節(jié)點(diǎn)發(fā)送對(duì)應(yīng)的查詢請(qǐng)求;D4、存儲(chǔ)節(jié)點(diǎn)收到查詢請(qǐng)求后,訪問子元數(shù)據(jù)管理器,得到數(shù)據(jù)存儲(chǔ)單元Block的指針。然后,存儲(chǔ)節(jié)點(diǎn)通過數(shù)據(jù)讀取器讀取到指定數(shù)據(jù);D5、存儲(chǔ)節(jié)點(diǎn)返回結(jié)果給查詢客戶端,查詢客戶端收到了所有的數(shù)據(jù)后,本次查詢完畢。對(duì)于值交疊的情況,查詢客戶端連接的存儲(chǔ)節(jié)點(diǎn)將是所有覆蓋了結(jié)果集的存儲(chǔ)節(jié)點(diǎn)。如圖8所示:查詢客戶端需要查詢某列值小于4的對(duì)應(yīng)rowid集合,其將需要與0、1、4號(hào)存儲(chǔ)節(jié)點(diǎn)連接(存儲(chǔ)節(jié)點(diǎn)中,尖括號(hào)中指定了該存儲(chǔ)節(jié)點(diǎn)上面的值范圍,表格中左邊為排序了的值,右邊是rowid)。這樣,當(dāng)值比較分散情況下,連接數(shù)將會(huì)上升。值得說(shuō)明的是,由于我們的原始數(shù)據(jù)經(jīng)過了排序。查找值的過程的時(shí)間復(fù)雜度是O(logN)。其次,在rowtable中,rowtable數(shù)組中的每一個(gè)元素值和原表中的相應(yīng)行是一一對(duì)應(yīng)的。rowtable就是原表,不過存儲(chǔ)的不是原表實(shí)際值,而是存儲(chǔ)了原表實(shí)際值對(duì)應(yīng)于字典的下標(biāo),也就是字典的key。通過數(shù)據(jù)的rowid來(lái)查詢值的過程是O(1)。本發(fā)明技術(shù)方案帶來(lái)的有益效果:實(shí)現(xiàn)分布式的索引和數(shù)據(jù)組織方式。系統(tǒng)支持橫向拓展,能夠滿足未來(lái)新的數(shù)據(jù)組織方式,快速數(shù)據(jù)讀取,高內(nèi)存使用率,低內(nèi)存消耗。設(shè)定的數(shù)據(jù)格式具有擴(kuò)展性,新的索引和數(shù)據(jù)存儲(chǔ)方法只需要修改數(shù)據(jù)存儲(chǔ)單元Block的column_type字段,并在數(shù)據(jù)存儲(chǔ)單元Block的column內(nèi)部自定義自己的數(shù)據(jù)存儲(chǔ)協(xié)議即可。數(shù)據(jù)在數(shù)據(jù)存儲(chǔ)單元Block內(nèi)部有序,通過數(shù)據(jù)值查詢數(shù)據(jù)的rowid的時(shí)間復(fù)雜度是O(logN)。通過rowid查找到指定的時(shí)間復(fù)雜度是O(1)。對(duì)數(shù)據(jù)傾斜的情況,時(shí)間復(fù)雜度上不變。數(shù)據(jù)存儲(chǔ)單元Block將索引Groupkey的字典、index等向量通過拼接方式存儲(chǔ)在內(nèi)存里面的連續(xù)區(qū)域,而不是由指針分散存儲(chǔ)。如果索引Groupkey的幾個(gè)向量各自由一片連續(xù)區(qū)域存儲(chǔ),一般運(yùn)行時(shí)庫(kù)(比如Glibc)會(huì)給每個(gè)向量分配多余內(nèi)存空間,造成了內(nèi)部碎片。將這些向量拼接在一起達(dá)到了內(nèi)存緊湊的目的,在一定層度上,降低了內(nèi)存碎片。將TPC-H(版本2.17.1)的200G數(shù)據(jù)集導(dǎo)入到本系統(tǒng)中,采用Groupkey作為索引和文中提到的位壓縮的方式,索引和數(shù)據(jù)的總空間是原始數(shù)據(jù)的0.9倍。也就是占用了180G左右的內(nèi)存。而傳統(tǒng)數(shù)據(jù)庫(kù)索引,例如Mysql和Oracle數(shù)據(jù)庫(kù)的索引(默認(rèn)的B+樹索引),光索引就是原始數(shù)據(jù)的3倍以上。本方法大大降低了內(nèi)存的消耗。附圖說(shuō)明圖1是本發(fā)明的整體架構(gòu)示意圖。圖2是表橫切和縱切示意圖。圖3是頭部結(jié)構(gòu)設(shè)計(jì)示意圖。圖4是column內(nèi)部邏輯結(jié)構(gòu)示意圖。圖5是字符串類型數(shù)據(jù)存儲(chǔ)示意圖。圖6是字符串類型字典存儲(chǔ)結(jié)構(gòu)示意圖。圖7是數(shù)據(jù)查詢流程圖。圖8是值交疊情況下查詢數(shù)據(jù)查詢流程圖。具體實(shí)施方式下面結(jié)合實(shí)施例及附圖,對(duì)本發(fā)明作進(jìn)一步地的詳細(xì)說(shuō)明,但本發(fā)明的實(shí)施方式不限于此。實(shí)施例1:一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu),如圖1所示,包括:主控節(jié)點(diǎn):用于建立數(shù)據(jù)存儲(chǔ)單元Block到所在的物理機(jī)器的映射關(guān)系、統(tǒng)計(jì)全局負(fù)載情況以及生成數(shù)據(jù)存儲(chǔ)單元Block的ID;數(shù)據(jù)導(dǎo)入管理器:用于對(duì)外部數(shù)據(jù)進(jìn)行緩沖,將外部數(shù)據(jù)按照數(shù)據(jù)值排序,生成索引Groupkey和數(shù)據(jù),然后生成數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)索引Groupkey和數(shù)據(jù),最后導(dǎo)入數(shù)據(jù)存儲(chǔ)單元Block到存儲(chǔ)節(jié)點(diǎn);存儲(chǔ)節(jié)點(diǎn):存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block,對(duì)查詢者提供查詢功能;存儲(chǔ)節(jié)點(diǎn)包括子元數(shù)據(jù)管理器、數(shù)據(jù)存儲(chǔ)單元Block、數(shù)據(jù)讀取器模塊;子元數(shù)據(jù)管理器:用于維護(hù)存儲(chǔ)節(jié)點(diǎn)內(nèi)部由數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列到數(shù)據(jù)存儲(chǔ)單元Block的映射、維護(hù)數(shù)據(jù)存儲(chǔ)單元Block的生命周期;數(shù)據(jù)存儲(chǔ)單元Block:用于存儲(chǔ)索引Groupkey和數(shù)據(jù);數(shù)據(jù)讀取器模塊:用于按照存儲(chǔ)的索引Groupkey提供范圍查詢和等值查詢接口,為外部提供了數(shù)據(jù)訪問,具有指向真實(shí)數(shù)據(jù)的指針。本發(fā)明利用數(shù)據(jù)導(dǎo)入管理器導(dǎo)入外部數(shù)據(jù),并生成數(shù)據(jù)存儲(chǔ)單元Block和元數(shù)據(jù),數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)了索引Groupkey和數(shù)據(jù);利用存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block;利用存儲(chǔ)節(jié)的子元數(shù)據(jù)管理器維護(hù)存儲(chǔ)節(jié)點(diǎn)內(nèi)部的庫(kù)表列到數(shù)據(jù)存儲(chǔ)單元Block的映射;利用主控節(jié)點(diǎn)建立數(shù)據(jù)存儲(chǔ)單元Block到所在的物理機(jī)器的映射關(guān)系。通過以上部件構(gòu)建起一個(gè)分布式數(shù)據(jù)存儲(chǔ)架構(gòu)。其中存儲(chǔ)節(jié)點(diǎn)一般為多個(gè),每個(gè)存儲(chǔ)節(jié)點(diǎn)接受數(shù)據(jù)導(dǎo)入管理器數(shù)據(jù),受到主控節(jié)點(diǎn)管制,每個(gè)存儲(chǔ)節(jié)點(diǎn)有包含子元數(shù)據(jù)管理器、數(shù)據(jù)讀取器以及多個(gè)數(shù)據(jù)存儲(chǔ)單元Block,存儲(chǔ)數(shù)據(jù)單元可以提供范圍和等值查詢。數(shù)據(jù)存儲(chǔ)單元Block按照值的大小進(jìn)行存儲(chǔ),且每個(gè)范圍都標(biāo)有對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)單元Block的ID,這樣能大幅提高查詢時(shí)間,達(dá)到高效索引的目的。優(yōu)選的,所述主控節(jié)點(diǎn)的元數(shù)據(jù)組織為由數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列以及每個(gè)存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)中包含的列的列值范圍到存儲(chǔ)節(jié)點(diǎn)的地址的映射,主控節(jié)點(diǎn)的元數(shù)據(jù)組織的結(jié)構(gòu)為:<數(shù)據(jù)庫(kù)名、表名字,列名、列值范圍、存儲(chǔ)節(jié)點(diǎn)的地址>。存儲(chǔ)節(jié)點(diǎn)的元數(shù)據(jù)組織為數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列到數(shù)據(jù)存儲(chǔ)單元Block的映射,存儲(chǔ)節(jié)點(diǎn)的元數(shù)據(jù)組織的結(jié)構(gòu)為:<數(shù)據(jù)庫(kù)名、表名字、列名、列值范圍、數(shù)據(jù)存儲(chǔ)單元Block的ID>。優(yōu)選的,數(shù)據(jù)存儲(chǔ)單元Block存儲(chǔ)數(shù)據(jù)的方式為:以索引Groupkey加數(shù)據(jù)的方式存儲(chǔ)在數(shù)據(jù)存儲(chǔ)單元Block當(dāng)中,如圖2所示,一個(gè)數(shù)據(jù)存儲(chǔ)單元Block包含一張表的若干列或全部的列,每張表的所有的列都會(huì)在數(shù)據(jù)存儲(chǔ)單元Block中存儲(chǔ),在存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)這個(gè)數(shù)據(jù)存儲(chǔ)單元Block的時(shí)候,會(huì)同時(shí)記錄這個(gè)數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的庫(kù)名、表名、列名、列值范圍和rowid范圍到子元數(shù)據(jù)管理器中。如圖3所示,數(shù)據(jù)存儲(chǔ)單元Block的頭部結(jié)構(gòu)分為定長(zhǎng)結(jié)構(gòu)和變長(zhǎng)兩個(gè)部分:定長(zhǎng)部分包括:block_id、begin_rowid、rows。block_id:表示數(shù)據(jù)存儲(chǔ)單元block的編號(hào),由數(shù)據(jù)導(dǎo)入管理器生成,全局唯一:每個(gè)數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)著一個(gè)全局唯一的block_id。begin_rowid:指明了這個(gè)Block中所存儲(chǔ)的數(shù)據(jù)的起始的rowid。rows:表明這個(gè)數(shù)據(jù)存儲(chǔ)單元Block中一共有多少行的數(shù)據(jù);變長(zhǎng)部分包括:column_offset,column_offset:column_offset為一個(gè)數(shù)組,第i(i為自然數(shù))個(gè)值表示這個(gè)數(shù)據(jù)存儲(chǔ)單元Block中的第i個(gè)列的物理位置相對(duì)于Block起始頭部的偏移量。數(shù)據(jù)存儲(chǔ)單元Block中的庫(kù)表列由外部元數(shù)據(jù)所描述,因?yàn)槿绻總€(gè)數(shù)據(jù)存儲(chǔ)單元Block中都存儲(chǔ)一份元數(shù)據(jù)會(huì)浪費(fèi)空間。存儲(chǔ)節(jié)點(diǎn)接收這個(gè)數(shù)據(jù)存儲(chǔ)單元Block的時(shí)候,將數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的庫(kù)名、表名、列名、列值范圍和rowid范圍注冊(cè)到子元數(shù)據(jù)管理器中。如圖4所示,所述column_offset的內(nèi)部邏輯結(jié)構(gòu)包括column_type部分和其余約定部分,column_type部分表示頭部信息,其余約定部分是根據(jù)column_type部分由使用人員根據(jù)具體的需求具體約定。所述column_type指明數(shù)據(jù)組織方式是以索引Groupkey方式組織或者是以鍵值對(duì)方式組以及其對(duì)應(yīng)的壓縮方式,所述壓縮方式是字節(jié)壓縮或者是位壓縮。一般的,column_type目前設(shè)定為4個(gè)字節(jié),前一個(gè)字節(jié)表示是索引Groupkey或者其他壓縮方式。第二個(gè)字節(jié)標(biāo)識(shí)是位壓縮還是字節(jié)壓縮。第三個(gè)和第四個(gè)字節(jié)為保留字節(jié)。今后如果業(yè)務(wù)需求變化,column_type字節(jié)大小可以重新設(shè)置。該專利中的方式列舉出索引Groupkey方式組織數(shù)據(jù)并配合以字節(jié)壓縮或者位壓縮。索引Groupkey:是一種在內(nèi)存分布式列數(shù)據(jù)庫(kù)中的數(shù)據(jù)組織方式,其采用字典壓縮對(duì)每列內(nèi)容進(jìn)行壓縮,采用索引向量index對(duì)字典向量中某個(gè)值對(duì)應(yīng)在position向量中的范圍進(jìn)行界定,采用位置向量position存儲(chǔ)字典向量對(duì)應(yīng)的行號(hào)rowid的集合。同時(shí),有一個(gè)行表向量rowtable,行表向量rowtable是維持行關(guān)系的向量,行表向量rowtable里面存儲(chǔ)的是元素值在字典向量中的下標(biāo);結(jié)合索引Groupkey的特性,對(duì)于索引向量index,存儲(chǔ)對(duì)應(yīng)的位壓縮或者字節(jié)壓縮后的值;對(duì)于位置向量position,我們只存儲(chǔ)其值相對(duì)于begin_rowid的偏移量;對(duì)于行表向量rowtable,其每一行與原始表一一對(duì)應(yīng),行表向量rowtable中的值是字典的下標(biāo),索引向量index、位置向量position、行表向量rowtable采用位壓縮或者字節(jié)壓縮。例如:自定義的column頭部信息:index_width:index字段位寬或者字節(jié)寬度;position_width:position字段位寬或者字節(jié)寬度;rowtable_width:rowtable字段位寬或者字節(jié)寬度;數(shù)據(jù)體:dictionary:Groupkey的字典向量;index:Groupkey的索引向量;position:Groupkey的位置向量;rowtable:行表向量。其中,如果這個(gè)列是字符串類型,對(duì)于字典向量,則將每個(gè)字符串的值拼接為一個(gè)大的字符串(dictionary_string),同時(shí)配合以每個(gè)字符串在大字符串中的域值向量(dictionary_region)。如圖5所示,展示了如何將“China”和“America”存儲(chǔ)為大字符串加域值向量的方式存儲(chǔ)。讀取“China”字符的步驟是在dictionary_region取出0和5,dictionary_string中的[0,5)就是“China”字符。如果列是字符串類型,dictionary部分存儲(chǔ)如圖6所示:string_offset:dictionary_string相對(duì)于dictionary的偏移量。region_width:dictionary_region字段的位寬或者字節(jié)寬度。如果列不是字符串類型,dictionary存儲(chǔ)的就是排序字典。結(jié)合索引Groupkey的特性,對(duì)于index向量,存儲(chǔ)對(duì)應(yīng)的位壓縮或者字節(jié)壓縮后的值。對(duì)于position向量,我們只存儲(chǔ)其值相對(duì)于begin_rowid的偏移量。對(duì)于rowtable,其每一個(gè)值與原始表該列的一行一一對(duì)應(yīng)。rowtable中的值是該行字典的下標(biāo)。index、position、rowtable采用位壓縮或者字節(jié)壓縮。實(shí)施例2:根據(jù)一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)的數(shù)據(jù)存儲(chǔ)方法。S1、主控節(jié)點(diǎn)根據(jù)每張表的列的寬度和有多少列決定每個(gè)數(shù)據(jù)存儲(chǔ)單元Block中表的行數(shù)和列數(shù),以及所要發(fā)往的存儲(chǔ)節(jié)點(diǎn)的IP,將這些信息告訴數(shù)據(jù)導(dǎo)入管理器;S2、數(shù)據(jù)導(dǎo)入管理器將外部數(shù)據(jù)源讀取上來(lái)的數(shù)據(jù)排序,生成數(shù)據(jù)字典,確定索引向量index、位置向量position、行表向量rowtable的壓縮的位寬或者字節(jié)寬度;S3、數(shù)據(jù)導(dǎo)入管理器根據(jù)壓縮的位寬或者字節(jié)寬度,生成壓縮的索引向量index、位置向量position、行表向量rowtable,同時(shí)統(tǒng)計(jì)元數(shù)據(jù)。根據(jù)數(shù)據(jù)存儲(chǔ)單元Block的內(nèi)部設(shè)計(jì),依次在數(shù)據(jù)存儲(chǔ)單元Block內(nèi)填入頭部信息和上述數(shù)據(jù)體;S4、數(shù)據(jù)導(dǎo)入管理器將一個(gè)數(shù)據(jù)存儲(chǔ)單元Block的數(shù)據(jù)和數(shù)據(jù)存儲(chǔ)單元Block對(duì)應(yīng)的元數(shù)據(jù)信息發(fā)送給存儲(chǔ)節(jié)點(diǎn),同時(shí)發(fā)送一份對(duì)應(yīng)的元數(shù)據(jù)信息給主控節(jié)點(diǎn);S5、存儲(chǔ)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)導(dǎo)入管理器發(fā)送的數(shù)據(jù)存儲(chǔ)單元Block,將對(duì)應(yīng)的元數(shù)據(jù)信息記錄到子元數(shù)據(jù)管理器。如果采用的運(yùn)行時(shí)庫(kù)提供了歸還操作系統(tǒng)未使用的內(nèi)存的接口,最后調(diào)用相應(yīng)接口,釋放多余內(nèi)存;S6、主控節(jié)點(diǎn)將導(dǎo)入管理器發(fā)送的對(duì)應(yīng)的元數(shù)據(jù)記錄下來(lái)。主控節(jié)點(diǎn)根據(jù)每張表的列的寬度(比如列是定長(zhǎng)的含有兩個(gè)字節(jié)的類型,char(2)類型,則該列寬度為2byte)和有多少列決定每個(gè)數(shù)據(jù)存儲(chǔ)單元Block中表的行數(shù)和列數(shù),以及所要發(fā)往的存儲(chǔ)節(jié)點(diǎn)的IP,將這些信息告訴數(shù)據(jù)導(dǎo)入管理器。一般行數(shù)取2^16行,每個(gè)數(shù)據(jù)存儲(chǔ)單元Block大小不超過L3-cache大小。實(shí)施例3:如圖7所示,根據(jù)所述的一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu)的數(shù)據(jù)查詢方法,查找數(shù)據(jù)庫(kù)ID為db_id,表名為table_name,列名為col_name的查找數(shù)據(jù)存儲(chǔ)單元Block的過程是:D1、訪問主控節(jié)點(diǎn),發(fā)送所要訪問的數(shù)據(jù)的庫(kù)表列信息,以及包含對(duì)應(yīng)列的范圍的消息給主控節(jié)點(diǎn),查詢方式如下:通過值查詢r(jià)owid:通過給定值范圍或者定值查詢匹配的rowid;通過rowid查詢值:通過給定rowid集合查詢每個(gè)rowid對(duì)應(yīng)的值。例如查詢語(yǔ)句結(jié)構(gòu)如下:通過值查詢r(jià)owid:<數(shù)據(jù)庫(kù)名,表名字,列名,范圍查詢或者等值查詢條件>,其中,范圍查詢或者等值查詢條件例如:姓名=“張三”;通過rowid查詢值:<數(shù)據(jù)庫(kù)名,表名字,列名,范圍查詢或者等值查詢條件>,其中,范圍查詢或者等值查詢條件例如:rowid>10000,D2、主控節(jié)點(diǎn)返回這次查詢請(qǐng)求涉及到的存儲(chǔ)節(jié)點(diǎn)的IP地址,主控節(jié)點(diǎn)返回給查詢者的結(jié)構(gòu)為:<IP,數(shù)據(jù)庫(kù)名,表名字,列名>;D3、查詢客戶端與對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)建立連接,并向?qū)?yīng)的存儲(chǔ)節(jié)點(diǎn)發(fā)送對(duì)應(yīng)的查詢請(qǐng)求,存儲(chǔ)節(jié)點(diǎn)收到查詢請(qǐng)求后,訪問子元數(shù)據(jù)管理器,最后得到數(shù)據(jù)存儲(chǔ)單元Block的指針,然后,存儲(chǔ)節(jié)點(diǎn)通過數(shù)據(jù)讀取器讀取到指定數(shù)據(jù);D4、存儲(chǔ)節(jié)點(diǎn)返回結(jié)果給查詢客戶端,查詢客戶端收到了所有的數(shù)據(jù)后,本次查詢完畢。如圖8所示,需要查詢某列值小于4的對(duì)應(yīng)rowid集合,其將需要與0、1、4號(hào)存儲(chǔ)節(jié)點(diǎn)連接(存儲(chǔ)節(jié)點(diǎn)中,尖括號(hào)中指定了該存儲(chǔ)節(jié)點(diǎn)上面的值范圍,表格中左邊為排序了的值,右邊是rowid)。這樣,當(dāng)值比較分散情況下,連接數(shù)將會(huì)上升。值得說(shuō)明的是,由于我們的原始數(shù)據(jù)經(jīng)過了排序。查找值的過程的時(shí)間復(fù)雜度是O(logN)。其次,在rowtable中,rowtable數(shù)組中個(gè)每一個(gè)元素和原表中對(duì)應(yīng)的行是一一對(duì)應(yīng)關(guān)系。rowtable就是原表,不過存儲(chǔ)的不是原表實(shí)際值,而是存儲(chǔ)了原表數(shù)據(jù)對(duì)應(yīng)于字典的下標(biāo),也就是字典的key。知道了數(shù)據(jù)的rowid來(lái)查詢值的過程是O(1)??偟膩?lái)說(shuō):本發(fā)明公開了一種分布式數(shù)據(jù)存儲(chǔ)架構(gòu),主控節(jié)點(diǎn):用于建立數(shù)據(jù)存儲(chǔ)單元Block到所在的物理機(jī)器的映射關(guān)系、統(tǒng)計(jì)全局負(fù)載情況以及生成數(shù)據(jù)存儲(chǔ)單元Block的ID。數(shù)據(jù)導(dǎo)入管理器:對(duì)外部數(shù)據(jù)進(jìn)行緩存,生成數(shù)據(jù)存儲(chǔ)單元Block,導(dǎo)入數(shù)據(jù)存儲(chǔ)單元Block到存儲(chǔ)節(jié)點(diǎn)。存儲(chǔ)節(jié)點(diǎn):存儲(chǔ)數(shù)據(jù)存儲(chǔ)單元Block,對(duì)查詢者提供查詢功能。存儲(chǔ)節(jié)點(diǎn)包括子元數(shù)據(jù)管理器、數(shù)據(jù)存儲(chǔ)單元Block、數(shù)據(jù)讀取器模塊。子元數(shù)據(jù)管理器:用于維護(hù)存儲(chǔ)節(jié)點(diǎn)內(nèi)部由數(shù)據(jù)庫(kù)名、表名、列名唯一確定的列到數(shù)據(jù)存儲(chǔ)單元Block的映射。數(shù)據(jù)存儲(chǔ)單元Block:用于存儲(chǔ)索引Groupkey和數(shù)據(jù)。數(shù)據(jù)讀取器模塊:用于按照存儲(chǔ)的索引Groupkey提供范圍查詢和等值查詢接口,為外部提供了數(shù)據(jù)訪問。以上所述,僅是本發(fā)明的較佳實(shí)施例,并非對(duì)本發(fā)明做任何形式上的限制,凡是依據(jù)本發(fā)明的技術(shù)實(shí)質(zhì)對(duì)以上實(shí)施例所作的任何簡(jiǎn)單修改、等同變化,均落入本發(fā)明的保護(hù)范圍之內(nèi)。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3