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