本發(fā)明涉及數(shù)據(jù)存儲(chǔ),特別涉及一種數(shù)據(jù)庫部署方法。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,網(wǎng)絡(luò)信息量呈爆炸式的增長。傳統(tǒng)的存儲(chǔ)體系結(jié)構(gòu)已經(jīng)越來越不能滿足快速增長的海量數(shù)據(jù)存儲(chǔ)需求,同時(shí)也面臨著存儲(chǔ)的實(shí)時(shí)性、可靠性和容錯(cuò)性等各方面的技術(shù)挑戰(zhàn)。當(dāng)現(xiàn)有的單一存儲(chǔ)系統(tǒng)的讀寫量大幅增加時(shí),存儲(chǔ)設(shè)備可能會(huì)因硬件設(shè)備負(fù)載過重而形成性能瓶頸;存儲(chǔ)設(shè)備的用戶終端數(shù)據(jù)讀寫與數(shù)據(jù)備份均占用帶寬,因此會(huì)對(duì)用戶終端的讀寫造成影響,造成服務(wù)質(zhì)量下降。
技術(shù)實(shí)現(xiàn)要素:
為解決上述現(xiàn)有技術(shù)所存在的問題,本發(fā)明提出了一種數(shù)據(jù)庫部署方法,包括:
將多個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)組成數(shù)據(jù)陣列,每個(gè)數(shù)據(jù)陣列設(shè)置主控?cái)?shù)據(jù)庫節(jié)點(diǎn),統(tǒng)一管理數(shù)據(jù)陣列中的記錄信息;
當(dāng)某個(gè)數(shù)據(jù)庫節(jié)點(diǎn)的記錄信息發(fā)生更新時(shí),僅將更新的信息發(fā)送給主控節(jié)點(diǎn),再由主控節(jié)點(diǎn)將該信息廣播給數(shù)據(jù)陣列中其他數(shù)據(jù)庫節(jié)點(diǎn)。
優(yōu)選地,所述主控節(jié)點(diǎn)具有有效期,采用時(shí)間片輪轉(zhuǎn)機(jī)制通過優(yōu)化策略選擇產(chǎn)生下一個(gè)主控節(jié)點(diǎn);
除主控節(jié)點(diǎn)外,每個(gè)分布式數(shù)據(jù)陣列還選出備用主控節(jié)點(diǎn),時(shí)刻監(jiān)督主控節(jié)點(diǎn)的狀態(tài),當(dāng)主控節(jié)點(diǎn)出現(xiàn)意外不能正常工作時(shí),其將取代主控節(jié)點(diǎn),當(dāng)某個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)上的記錄信息發(fā)生改變時(shí),只將該修改信息發(fā)送給主控節(jié)點(diǎn),由主控節(jié)點(diǎn)將該修改信息同步到數(shù)據(jù)陣列中其它分布式數(shù)據(jù)庫節(jié)點(diǎn)上,并將更新結(jié)果同樣發(fā)送到其他數(shù)據(jù)陣列的主控節(jié)點(diǎn)上,其他數(shù)據(jù)陣列的主控節(jié)點(diǎn)將會(huì)更新其所屬數(shù)據(jù)陣列的分布式數(shù)據(jù)庫節(jié)點(diǎn),最后使整個(gè)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)都得到更新。
優(yōu)選地,
給每個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)設(shè)定一個(gè)權(quán)值Wi,當(dāng)超過有效期時(shí),進(jìn)行下一輪的選擇,選擇Wi的最高的前兩個(gè)數(shù)據(jù)庫作為新的主控節(jié)點(diǎn)和備用主控節(jié)點(diǎn),其中權(quán)值Wi計(jì)算如下:
其中Ai表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的網(wǎng)絡(luò)帶寬容量與響應(yīng)時(shí)間的乘積;
Ui表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的處理器平均響應(yīng)時(shí)間;
Mi表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的剩余存儲(chǔ)器空間,n為數(shù)據(jù)陣列下的數(shù)據(jù)庫節(jié)點(diǎn)總數(shù)。
優(yōu)選地,所述每個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)上都維護(hù)自身的數(shù)據(jù)服務(wù),分布式數(shù)據(jù)庫節(jié)點(diǎn)通過采用分布式互動(dòng)控制策略、消息通信協(xié)議、負(fù)載均衡策略來工作;當(dāng)有用戶終端請(qǐng)求到達(dá)時(shí),根據(jù)預(yù)定策略指定特定的分布式數(shù)據(jù)庫節(jié)點(diǎn)來處理該請(qǐng)求,通過查找元數(shù)據(jù)檢索表后找到所請(qǐng)求的記錄所對(duì)應(yīng)的內(nèi)部節(jié)點(diǎn)地址,從而使用戶終端請(qǐng)求直接定位到所要讀寫的數(shù)據(jù)所在的分布式數(shù)據(jù)庫節(jié)點(diǎn)上,再進(jìn)行相應(yīng)操作或讀寫。
優(yōu)選地,所述分布式數(shù)據(jù)庫節(jié)點(diǎn)采用以下副本拷貝方法,首先對(duì)數(shù)據(jù)庫節(jié)點(diǎn)狀態(tài)進(jìn)行估計(jì),然后將數(shù)據(jù)庫節(jié)點(diǎn)映射到基于散列構(gòu)造的圓形列表,將副本映射到圓形列表;根據(jù)預(yù)設(shè)策略存儲(chǔ)到某一數(shù)據(jù)庫節(jié)點(diǎn)上,完成副本部署拷貝;
在構(gòu)造的圓形列表中,每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)i具有權(quán)值Vi。
Vi=ζLi+(1-ζ)Dij,(1<i<n,n為數(shù)據(jù)陣列中的節(jié)點(diǎn)數(shù))
Li=(Ai-Amin)/(Amax-Amin)
Dij=(dij-Dmin)/(Dmax-Dmin)
Ai表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的網(wǎng)絡(luò)帶寬容量與響應(yīng)時(shí)間的乘積,Amax與Amin分別為Ai的最大值和最小值;
dij表示第i個(gè)節(jié)點(diǎn)到第j個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)距離,Dmax與Dmin分別為dij的最大值和最小值;
ζ是調(diào)節(jié)因子,用于調(diào)節(jié)節(jié)點(diǎn)負(fù)載Li和節(jié)點(diǎn)間距離參數(shù)Dij在權(quán)值估計(jì)中的比重;
通過散列運(yùn)算,得到每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)產(chǎn)生的散列節(jié)點(diǎn)在圓形列表中的映射值,其映射值的集合用HG表示;每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)i產(chǎn)生的散列節(jié)點(diǎn)集合為HGi,包含的散列節(jié)點(diǎn)個(gè)數(shù)為v1*gwi/gwmin;
其中g(shù)wmin為節(jié)點(diǎn)權(quán)值集合中最小的權(quán)值,v1為有最小權(quán)值的節(jié)點(diǎn)產(chǎn)生的散列節(jié)點(diǎn)個(gè)數(shù),并且每個(gè)節(jié)點(diǎn)占有的權(quán)值為:
節(jié)點(diǎn)映射到圓形列表之后,接著將數(shù)據(jù)副本映射到圓形列表,通過對(duì)數(shù)據(jù)副本r進(jìn)行SHA1散列運(yùn)算,得到在散列表對(duì)應(yīng)的key值,輸出用p表示;
在圓形列表從p開始順時(shí)針方向映射到散列節(jié)點(diǎn)集合中,找到距離p最近的數(shù)據(jù)庫節(jié)點(diǎn);將數(shù)據(jù)存儲(chǔ)在找到的節(jié)點(diǎn)中。
本發(fā)明相比現(xiàn)有技術(shù),具有以下優(yōu)點(diǎn):
本發(fā)明提出了一種數(shù)據(jù)庫部署方法,在大數(shù)據(jù)存儲(chǔ)的實(shí)時(shí)性、可擴(kuò)展性和可靠性等方面均有較好的性能。
附圖說明
圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫部署方法的流程圖。
具體實(shí)施方式
下文與圖示本發(fā)明原理的附圖一起提供對(duì)本發(fā)明一個(gè)或者多個(gè)實(shí)施例的詳細(xì)描述。結(jié)合這樣的實(shí)施例描述本發(fā)明,但是本發(fā)明不限于任何實(shí)施例。本發(fā)明的范圍僅由權(quán)利要求書限定,并且本發(fā)明涵蓋諸多替代、修改和等同物。在下文描述中闡述諸多具體細(xì)節(jié)以便提供對(duì)本發(fā)明的透徹理解。出于示例的目的而提供這些細(xì)節(jié),并且無這些具體細(xì)節(jié)中的一些或者所有細(xì)節(jié)也可以根據(jù)權(quán)利要求書實(shí)現(xiàn)本發(fā)明。
本發(fā)明的一方面提供了一種數(shù)據(jù)庫部署方法。圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫部署方法流程圖。
本發(fā)明改進(jìn)的分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)由分布式數(shù)據(jù)庫節(jié)點(diǎn)組成,多個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)組成一個(gè)數(shù)據(jù)陣列,多個(gè)數(shù)據(jù)陣列組成分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)。每個(gè)數(shù)據(jù)陣列都有一個(gè)主控?cái)?shù)據(jù)庫節(jié)點(diǎn),統(tǒng)一管理數(shù)據(jù)陣列中的記錄信息。當(dāng)數(shù)據(jù)陣列中某個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)的記錄信息發(fā)生變化時(shí),該分布式數(shù)據(jù)庫節(jié)點(diǎn)只需將變化的信息發(fā)送給主控節(jié)點(diǎn),再由主控節(jié)點(diǎn)將該信息廣播給數(shù)據(jù)陣列中其他分布式數(shù)據(jù)庫節(jié)點(diǎn);采用時(shí)間片輪轉(zhuǎn)機(jī)制通過優(yōu)化策略選擇產(chǎn)生下一個(gè)主控節(jié)點(diǎn)。
除主控節(jié)點(diǎn)外,每個(gè)分布式數(shù)據(jù)陣列還選出備用主控節(jié)點(diǎn),時(shí)刻監(jiān)督主控節(jié)點(diǎn)的狀態(tài),當(dāng)主控節(jié)點(diǎn)出現(xiàn)意外不能正常工作時(shí),其將取代主控節(jié)點(diǎn),當(dāng)某個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)上的記錄信息發(fā)生改變時(shí),只須將該修改信息發(fā)送給主控節(jié)點(diǎn),由主控節(jié)點(diǎn)負(fù)責(zé)將該修改信息同步到數(shù)據(jù)陣列中其它分布式數(shù)據(jù)庫節(jié)點(diǎn)上,并將更新結(jié)果同樣發(fā)送到其他數(shù)據(jù)陣列的主控節(jié)點(diǎn)上,其他數(shù)據(jù)陣列的主控節(jié)點(diǎn)將會(huì)更新其所屬數(shù)據(jù)陣列的分布式數(shù)據(jù)庫節(jié)點(diǎn),最后使得整個(gè)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)都得到更新。
主控節(jié)點(diǎn)具有有效期,給每個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)設(shè)定一個(gè)權(quán)值Wi,當(dāng)超過有效期時(shí),進(jìn)行下一輪的選擇,選擇Wi的最高的前兩個(gè)數(shù)據(jù)庫作為新的主控節(jié)點(diǎn)和備用主控節(jié)點(diǎn),其中權(quán)值Wi計(jì)算如下:
其中Ai表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的網(wǎng)絡(luò)帶寬容量與響應(yīng)時(shí)間的乘積;
Ui表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的處理器平均響應(yīng)時(shí)間;
Mi表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的剩余存儲(chǔ)器空間,n為數(shù)據(jù)陣列下的數(shù)據(jù)庫節(jié)點(diǎn)總數(shù)。
分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的用戶終端包括客戶請(qǐng)求模塊、業(yè)務(wù)處理模塊、傳輸模塊??蛻粽?qǐng)求模塊負(fù)責(zé)處理用戶在終端所提交的數(shù)據(jù)讀寫請(qǐng)求,并用于顯示分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)對(duì)于用戶所提交請(qǐng)求的處理結(jié)果,同時(shí)將用戶終端的數(shù)據(jù)讀寫請(qǐng)求發(fā)送至下層的業(yè)務(wù)處理模塊。業(yè)務(wù)處理模塊用于接收來自客戶請(qǐng)求模塊的數(shù)據(jù)讀寫請(qǐng)求,并以事務(wù)的方式對(duì)這些請(qǐng)求進(jìn)行處理,包括記錄信息的確認(rèn)以及數(shù)據(jù)分塊與重組,然后將相關(guān)的處理請(qǐng)求信息作為輸出發(fā)送至下層的傳輸模塊。傳輸模塊負(fù)責(zé)傳輸用戶終端的數(shù)據(jù)請(qǐng)求信息、消息確認(rèn)信息以及返回?cái)?shù)據(jù)記錄的傳輸,并將傳輸結(jié)果反饋給業(yè)務(wù)處理模塊,讓其進(jìn)行相關(guān)事務(wù)處理,并將結(jié)果發(fā)回客戶請(qǐng)求模塊。
分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)中還包括認(rèn)證中心,用來保存分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的網(wǎng)絡(luò)拓?fù)涑跏蓟渲?;監(jiān)控分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的網(wǎng)絡(luò)安全,只在整個(gè)分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的拓?fù)浒l(fā)生改變時(shí)才將新的拓?fù)湫畔V播出去,使得各分布式數(shù)據(jù)庫節(jié)點(diǎn)都能收到該信息。
分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的所有記錄信息保存在元數(shù)據(jù)檢索表中,元數(shù)據(jù)檢索表包括保留在內(nèi)存中的LRU列表,存儲(chǔ)在磁盤上的尋址表,以及用于根據(jù)預(yù)定義規(guī)則將尋址表的記錄進(jìn)行劃分的子組檢索表。
每個(gè)分布式數(shù)據(jù)庫節(jié)點(diǎn)上都維護(hù)自身的數(shù)據(jù)服務(wù),分布式數(shù)據(jù)庫節(jié)點(diǎn)通過采用分布式互動(dòng)控制策略、消息通信協(xié)議、負(fù)載均衡策略來使自身相對(duì)獨(dú)立地工作。元數(shù)據(jù)檢索表對(duì)系統(tǒng)中的元數(shù)據(jù)進(jìn)行管理和操作,分別包含以下字段:文件名、組編號(hào)、數(shù)據(jù)庫編號(hào)、已用存儲(chǔ)空間、最大容量、節(jié)點(diǎn)地址。根據(jù)元數(shù)據(jù)檢索表,系統(tǒng)將相應(yīng)的數(shù)據(jù)信息從不同的出口轉(zhuǎn)發(fā)出去,并根據(jù)表中記錄將有效的信息反饋給用戶終端。當(dāng)有用戶終端請(qǐng)求到達(dá)時(shí),分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)根據(jù)預(yù)定策略指定特定的分布式數(shù)據(jù)庫節(jié)點(diǎn)來處理該請(qǐng)求,通過查找元數(shù)據(jù)檢索表后找到所請(qǐng)求的記錄所對(duì)應(yīng)的內(nèi)部節(jié)點(diǎn)地址,從而使用戶終端請(qǐng)求直接定位到所要讀寫的數(shù)據(jù)所在的分布式數(shù)據(jù)庫節(jié)點(diǎn)上,再進(jìn)行相應(yīng)操作或讀寫。
所述數(shù)據(jù)庫的表的存儲(chǔ)采用獨(dú)立分組存儲(chǔ)和聯(lián)合分組存儲(chǔ),在對(duì)表進(jìn)行獨(dú)立分組時(shí),指定分組數(shù)N、分組所依據(jù)的分組鍵屬性列AP以及分布系數(shù)k。對(duì)于需要分組的表的每一條記錄,根據(jù)分組鍵AP的值計(jì)算出該記錄所屬的分組ID,然后將該記錄存儲(chǔ)到該分組對(duì)應(yīng)的一個(gè)或多個(gè)節(jié)點(diǎn)的數(shù)據(jù)庫中;如果表A的分組鍵AP上是表A的外鍵,表B的主鍵BP即表A的分組鍵AP也是表A與表B連接時(shí)使用的連接鍵,則將跨節(jié)點(diǎn)的連接操作轉(zhuǎn)化為本地的連接操作并下推到數(shù)據(jù)庫中執(zhí)行,此時(shí)將兩個(gè)表的數(shù)據(jù)聯(lián)合分組;在對(duì)表進(jìn)行聯(lián)合分組時(shí),使用基于散列的分組或者基于范圍的分組,將數(shù)據(jù)分組為p個(gè)獨(dú)立的分組,每個(gè)分組的數(shù)據(jù)存儲(chǔ)在k個(gè)不同節(jié)點(diǎn)上;若表B依賴于表A進(jìn)行聯(lián)合分組,則表B的分組數(shù)等于表A的分組數(shù),且:如果表B的分布系數(shù)kB等于表A的分布系數(shù)kA,則表B的每個(gè)分組的數(shù)據(jù)庫節(jié)點(diǎn)就是表A相應(yīng)分組的數(shù)據(jù)庫節(jié)點(diǎn);如果表B的分布系數(shù)kB小于表A的分布系數(shù)kA,則表B的每個(gè)分組的數(shù)據(jù)庫節(jié)點(diǎn)是表B相應(yīng)分組的數(shù)據(jù)庫節(jié)點(diǎn)中取前kB個(gè)節(jié)點(diǎn);如果表B的分布系數(shù)kB大于表A的分布系數(shù)kA,則表B的每個(gè)分組的數(shù)據(jù)庫節(jié)點(diǎn)除了包含表A的相應(yīng)分組的數(shù)據(jù)庫節(jié)點(diǎn)之外再進(jìn)行擴(kuò)展,擴(kuò)展的(kB-kA)個(gè)節(jié)點(diǎn)是緊接在原來的節(jié)點(diǎn)鏈之后的節(jié)點(diǎn)。
在將表的記錄進(jìn)行獨(dú)立分組時(shí),利用基于散列的分組或基于范圍的分組,基于散列的分組在記錄分組鍵AP上應(yīng)用合適的散列函數(shù),得到的散列值再對(duì)分組數(shù)n取模,即得到記錄的分組ID;基于范圍的分組預(yù)先將屬性列AP的候選值區(qū)間分成多個(gè)連續(xù)的范圍,每個(gè)范圍對(duì)應(yīng)一個(gè)分組,將記錄屬性列AP的值所在范圍作為記錄所述的分組。
本發(fā)明在緩存調(diào)度中為每個(gè)記錄計(jì)算讀寫時(shí)間和讀寫次數(shù)的比值,記為FW值,表示每個(gè)記錄被讀寫的概率,將緩存按照FW值分為多個(gè)等級(jí)。用戶終端讀寫緩存中的記錄時(shí),則從最高等級(jí)開始自頂向下讀寫,直到找到記錄。當(dāng)記錄的讀寫請(qǐng)求在緩存中命中時(shí),更新記錄的FW值,將FW值與所在等級(jí)的閾值比較,若大于閾值,則將該記錄修改至上一級(jí)的鏈頭位置,若不大于閾值,則將該塊添加到該等級(jí)的鏈頭位置;當(dāng)讀寫請(qǐng)求未命中時(shí),緩存先比較緩存最低等級(jí)中最后兩個(gè)記錄的FW值,若最后一個(gè)記錄的FW值大于倒數(shù)第二個(gè)記錄的FW值時(shí),則將兩個(gè)記錄位置互換,然后將最后一個(gè)記錄置換出去,再將倒數(shù)第二個(gè)記錄的FW值重置。
具體地,F(xiàn)W值定義為:FW=F(x)+W(y,R)
其中F(x)=(1/p)x,x=t-tlast,即當(dāng)前時(shí)間減去最后一次讀寫緩存的時(shí)間,權(quán)值調(diào)整參數(shù)p>1;
W(y,R)=(y+a)R
其中y表示記錄的讀寫次數(shù),R為布爾值,表示操作類型為讀還是寫,a為大于1的微調(diào)常數(shù)。
為提高元數(shù)據(jù)檢索表的緩存命中率,通過在日志中提取特征值,得出每個(gè)記錄的下一記錄,并以此構(gòu)造出DAG圖,最后根據(jù)DAG圖來劃分為組,組中包括當(dāng)前記錄和后繼記錄,當(dāng)需要某條記錄調(diào)入內(nèi)存中時(shí),就將該記錄所在的組同時(shí)調(diào)入內(nèi)存中。LRU列表是元數(shù)據(jù)檢索表的固定大小的子集,元數(shù)據(jù)檢索表中包含所有存入分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的記錄;子組檢索表用于根據(jù)記錄預(yù)取的規(guī)則,將元數(shù)據(jù)檢索表中的記錄劃分為子組,根據(jù)子組編號(hào),查找該子組的所有記錄。LRU列表是以子組為單位來進(jìn)行記錄替換的,當(dāng)LRU列表中記錄未命中時(shí),通過查找要讀寫的記錄所在組,然后將該組中所有記錄通過數(shù)據(jù)庫緩存調(diào)度算法調(diào)入緩存列表中,維持子組檢索表。
如果用戶終端的讀寫操作請(qǐng)求所請(qǐng)求的記錄不在LRU列表中,通過查找位于磁盤中的元數(shù)據(jù)檢索表并且該塊已經(jīng)劃分,則將該塊所在子組全部調(diào)入LRU列表中。如果所請(qǐng)求的記錄不在LRU列表中,通過查找位于磁盤中的元數(shù)據(jù)檢索表找到該記錄,但該記錄沒有劃分,則將該記錄送入子組模塊中進(jìn)行劃分。如果所請(qǐng)求的記錄不在LRU列表中,通過查找位于磁盤中的元數(shù)據(jù)檢索表也沒有發(fā)現(xiàn)該記錄,若該請(qǐng)求為讀操作,則向用戶終端返回未找到;若該請(qǐng)求為寫操作,則在LRU列表中新建一條記錄,并為該記錄分配一個(gè)新的子組ID。
基于DAG圖的記錄獲取包含以下步驟:
1.查找記錄的特征值,包括名稱、下一記錄、讀寫時(shí)間、初始和結(jié)尾時(shí)間戳;提取從時(shí)刻t0開始,時(shí)間段T內(nèi)每個(gè)記錄的下一個(gè)塊si以及最后一次讀寫時(shí)間ti。
2.通過每個(gè)塊的特征值,計(jì)算出下一記錄,具體包括根據(jù)每個(gè)記錄的后繼序列,統(tǒng)計(jì)出所有候選記錄在序列中所出現(xiàn)的次數(shù),計(jì)算出各自所占比率pi,定義F(x):
F(x)=α×pi+β×(ti-t0)/T
其中α和β分別為塊讀寫次數(shù)pi和讀寫時(shí)間ti的權(quán)值因子,取MAX(F(x))的候選記錄作為當(dāng)前塊的下一記錄;
3.通過各塊與下一記錄的映射關(guān)系,生成一個(gè)DAG圖;
4.根據(jù)DAG圖將記錄進(jìn)行劃分,即依次從各頂點(diǎn)開始遍歷,設(shè)定每個(gè)組中最多包含的記錄數(shù)閾值n,當(dāng)遍歷遇到以下情況中時(shí),將其分為一組:遍歷經(jīng)過的頂點(diǎn)數(shù)不大于n;而路徑形成未形成環(huán)路并且沒有下一個(gè)頂點(diǎn)。
設(shè)置一個(gè)標(biāo)記數(shù)組flag[n],該數(shù)組用于判斷記錄是否已經(jīng)調(diào)入內(nèi)存或者是否可以換出內(nèi)存,每個(gè)記錄在flag[n]數(shù)組中都對(duì)應(yīng)有一個(gè)標(biāo)記值,初始化為0,迭代地與其所在組的子組ID進(jìn)行同或運(yùn)算,在磁盤中時(shí),判斷記錄在flag[n]數(shù)組中所對(duì)應(yīng)的值是否為0,以此推斷出該記錄是否已經(jīng)進(jìn)入內(nèi)存;在內(nèi)存中時(shí),同樣只需判斷記錄在flag[n]數(shù)組中所對(duì)應(yīng)的值是否為0,來判斷該記錄是否可以作為其他組的成員留在內(nèi)存中,下面是具體的操作步驟。
(1)當(dāng)某一組將要替換到內(nèi)存中時(shí),在磁盤中查找該組的子組ID,找到該組所對(duì)應(yīng)的記錄,記為A、B、C;
(2)查找標(biāo)記數(shù)組中的flag[A]、flag[B]、flag[C],依次判斷其是否為0,若flag[A]為0,表示該記錄還未調(diào)入過內(nèi)存中,將記錄A調(diào)入內(nèi)存中,若不為0,則不重復(fù)調(diào)用;
(3)將該組的子組ID依次與flag[A]、flag[B]、flag[C]進(jìn)行同或運(yùn)算,并利用運(yùn)算結(jié)果更新flag[A]、flag[B]、flag[C];
(4)假設(shè)某一組有記錄D、E、F需要換出內(nèi)存時(shí),在內(nèi)存中將該組的子組ID依次與flag[D]、flag[E]、flag[F]進(jìn)行同或運(yùn)算,并利用運(yùn)算結(jié)果更新flag[D]、flag[E]、flag[F];
(5)依次判斷flag[D]、flag[E]、flag[F]是否為0,若為0,表示該記錄對(duì)應(yīng)的所有組都不在內(nèi)存中,可以換出,若不為0,該記錄暫不替換出內(nèi)存。
子組檢索表將元數(shù)據(jù)檢索表中的記錄劃分為記錄子組,每個(gè)子組以鏈表形式表示,子組ID就是鏈頭文件在元數(shù)據(jù)檢索表中的子組ID,將該檢索表以子組ID為鍵,索引項(xiàng)信息為值構(gòu)建散列表,當(dāng)需要調(diào)入某組記錄時(shí),首先在元數(shù)據(jù)檢索表中查詢?cè)撚涗浰鶎?duì)應(yīng)的子組ID,然后在子組檢索表中根據(jù)散列函數(shù)進(jìn)行查找,再將該組調(diào)入內(nèi)存中。當(dāng)超過預(yù)設(shè)超時(shí)閾值時(shí),將所有記錄的子組ID清零,進(jìn)行重新分組。
所述分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)的用戶終端的請(qǐng)求模塊還用于確定出的讀寫請(qǐng)求執(zhí)行順序。請(qǐng)求模塊包括數(shù)據(jù)收發(fā)與排序兩個(gè)單元。數(shù)據(jù)收發(fā)單元將存儲(chǔ)系統(tǒng)傳來的事務(wù)執(zhí)行請(qǐng)求接收到用戶終端中,并將有序的事務(wù)發(fā)送給用戶終端的業(yè)務(wù)處理模塊進(jìn)行執(zhí)行。排序單元用來對(duì)接收到讀寫請(qǐng)求進(jìn)行排序操作,在用戶終端中協(xié)商出一個(gè)事務(wù)執(zhí)行隊(duì)列。為了實(shí)現(xiàn)對(duì)存儲(chǔ)系統(tǒng)數(shù)據(jù)的接收,在傳輸模塊中設(shè)置專門的傳輸監(jiān)聽進(jìn)程,監(jiān)聽進(jìn)程隨著整個(gè)存儲(chǔ)系統(tǒng)一起初始化,并一直處于監(jiān)聽狀態(tài);當(dāng)存儲(chǔ)系統(tǒng)傳遞的事務(wù)數(shù)量符合監(jiān)聽進(jìn)程中預(yù)先設(shè)置的策略時(shí),則將接收的參數(shù)傳遞給用戶終端進(jìn)行處理。
業(yè)務(wù)處理模塊進(jìn)一步包括原子事務(wù)、加鎖與緩存管理三個(gè)單元。加鎖單元在對(duì)讀寫請(qǐng)求施加排他鎖,即在事務(wù)執(zhí)行前將事務(wù)所需的全部資源提前加鎖。緩存管理單元將底層數(shù)據(jù)庫中的數(shù)據(jù)存儲(chǔ)到緩存中。并將本地緩存中的數(shù)據(jù)發(fā)送給其他用戶終端的緩存。原子事務(wù)單元通過創(chuàng)建存儲(chǔ)過程,對(duì)接收到的讀寫請(qǐng)求進(jìn)行執(zhí)行,消除數(shù)據(jù)查詢的異常中斷。在業(yè)務(wù)處理模塊同樣也設(shè)置一個(gè)業(yè)務(wù)處理監(jiān)聽進(jìn)程,當(dāng)傳輸模塊對(duì)接收到的讀寫請(qǐng)求進(jìn)行排序之后,調(diào)用業(yè)務(wù)處理監(jiān)聽進(jìn)程,利用業(yè)務(wù)處理監(jiān)聽進(jìn)程將有序的讀寫請(qǐng)求傳遞給業(yè)務(wù)處理模塊。
在讀寫請(qǐng)求排序過程中,用戶終端在接收到傳來的讀寫請(qǐng)求之后,將其傳遞給存儲(chǔ)系統(tǒng)進(jìn)行處理。每個(gè)存儲(chǔ)系統(tǒng)接收到讀寫請(qǐng)求之后,分別創(chuàng)建事務(wù)通道對(duì)象,然后將讀寫請(qǐng)求封裝成觸發(fā)事件傳遞給事務(wù)通道對(duì)象,由事務(wù)通道對(duì)象負(fù)責(zé)具體觸發(fā)事件的處理,具體分為三個(gè)步驟:
(1)事務(wù)通道對(duì)象在接收到觸發(fā)事件之后,對(duì)觸發(fā)事件中指針類型進(jìn)行判斷后,然后判斷該數(shù)據(jù)庫是否是主控節(jié)點(diǎn)。如果是主控節(jié)點(diǎn)則將其發(fā)送給其他所有數(shù)據(jù)庫;如果不是主控節(jié)點(diǎn),則更新本地觸發(fā)事件的讀寫請(qǐng)求時(shí)間;
(2)非主控節(jié)點(diǎn)對(duì)接收到的觸發(fā)事件進(jìn)行處理,如果讀寫請(qǐng)求時(shí)間更新為觸發(fā)事件中的讀寫請(qǐng)求時(shí)間相同,則表示是同一周期接收到的讀寫請(qǐng)求,然后每個(gè)非主控節(jié)點(diǎn)發(fā)送讀寫應(yīng)答返回給主控節(jié)點(diǎn),表明自己同意該讀寫請(qǐng)求序列。如果不相同則發(fā)送拒絕應(yīng)答;
(3)主控節(jié)點(diǎn)對(duì)其他數(shù)據(jù)庫傳來的觸發(fā)事件進(jìn)行監(jiān)聽,判斷,并發(fā)送有序讀寫請(qǐng)求,如果與主控節(jié)點(diǎn)收到的讀寫應(yīng)答的請(qǐng)求時(shí)間不同則直接拋棄,如果相同,則將主控節(jié)點(diǎn)中應(yīng)答數(shù)量增1。當(dāng)該數(shù)量超過全部數(shù)據(jù)庫數(shù)量的一半以上時(shí),則確定讀寫請(qǐng)求已經(jīng)完成排序。主控節(jié)點(diǎn)將緩存中的讀寫請(qǐng)求取出,并將其交給事務(wù)傳輸模塊的存儲(chǔ)系統(tǒng)進(jìn)行處理,將最終排序后的讀寫請(qǐng)求發(fā)送給所有非主控節(jié)點(diǎn)的數(shù)據(jù)庫,從而完成排序。
其次,為使用戶以最快的速度,從最接近用戶的地方獲得所需的信息,分布式數(shù)據(jù)庫節(jié)點(diǎn)采用以下副本拷貝方法,首先對(duì)數(shù)據(jù)庫節(jié)點(diǎn)狀態(tài)進(jìn)行估計(jì),然后將數(shù)據(jù)庫節(jié)點(diǎn)映射到基于散列構(gòu)造的圓形列表,將副本映射到圓形列表;根據(jù)預(yù)設(shè)策略存儲(chǔ)到某一數(shù)據(jù)庫節(jié)點(diǎn)上,完成副本部署拷貝。
在構(gòu)造的圓形列表中,每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)i具有權(quán)值Vi。
Vi=ζLi+(1-ζ)Dij,(1<i<n,n為數(shù)據(jù)陣列中的節(jié)點(diǎn)數(shù))
Li=(Ai-Amin)/(Amax-Amin)
Dij=(dij-Dmin)/(Dmax-Dmin)
Ai表示第i個(gè)節(jié)點(diǎn)所在設(shè)備的網(wǎng)絡(luò)帶寬容量與響應(yīng)時(shí)間的乘積,Amax與Amin分別為Ai的最大值和最小值;
dij表示第i個(gè)節(jié)點(diǎn)到第j個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)距離,Dmax與Dmin分別為dij的最大值和最小值;
ζ是調(diào)節(jié)因子,用于調(diào)節(jié)節(jié)點(diǎn)負(fù)載Li和節(jié)點(diǎn)間距離參數(shù)Dij在權(quán)值估計(jì)中的比重。
通過散列運(yùn)算,得到每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)產(chǎn)生的散列節(jié)點(diǎn)在圓形列表中的映射值,其映射值的集合用HG表示。每個(gè)數(shù)據(jù)庫節(jié)點(diǎn)i產(chǎn)生的散列節(jié)點(diǎn)集合為HGi,包含的散列節(jié)點(diǎn)個(gè)數(shù)為v1*gwi/gwmin;
其中g(shù)wmin為節(jié)點(diǎn)權(quán)值集合中最小的權(quán)值,v1為有最小權(quán)值的節(jié)點(diǎn)產(chǎn)生的散列節(jié)點(diǎn)個(gè)數(shù),并且每個(gè)節(jié)點(diǎn)占有的權(quán)值為:
節(jié)點(diǎn)映射到圓形列表之后,接著將數(shù)據(jù)副本映射到圓形列表,通過對(duì)數(shù)據(jù)副本r進(jìn)行SHA1散列運(yùn)算,得到在散列表對(duì)應(yīng)的key值,輸出用p表示。
在圓形列表從p開始順時(shí)針方向映射到散列節(jié)點(diǎn)集合中,找到距離p最近的數(shù)據(jù)庫節(jié)點(diǎn);將數(shù)據(jù)存儲(chǔ)在該節(jié)點(diǎn)中。
綜上所述,本發(fā)明提出了一種數(shù)據(jù)庫部署方法,在大數(shù)據(jù)存儲(chǔ)的實(shí)時(shí)性、可擴(kuò)展性和可靠性等方面均有較好的性能。
顯然,本領(lǐng)域的技術(shù)人員應(yīng)該理解,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算系統(tǒng)來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算系統(tǒng)上,或者分布在多個(gè)計(jì)算系統(tǒng)所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算系統(tǒng)可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲(chǔ)在存儲(chǔ)系統(tǒng)中由計(jì)算系統(tǒng)來執(zhí)行。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。
應(yīng)當(dāng)理解的是,本發(fā)明的上述具體實(shí)施方式僅僅用于示例性說明或解釋本發(fā)明的原理,而不構(gòu)成對(duì)本發(fā)明的限制。因此,在不偏離本發(fā)明的精神和范圍的情況下所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。此外,本發(fā)明所附權(quán)利要求旨在涵蓋落入所附權(quán)利要求范圍和邊界、或者這種范圍和邊界的等同形式內(nèi)的全部變化和修改例。