本發(fā)明涉及云計(jì)算技術(shù)領(lǐng)域,特別涉及針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架及構(gòu)建方法。
背景技術(shù):
以下對本發(fā)明的相關(guān)技術(shù)背景進(jìn)行說明,但這些說明并不一定構(gòu)成本發(fā)明的現(xiàn)有技術(shù)。
Swift(Openstack Object Storage)是由全球第二大數(shù)據(jù)中心的Rackspace開發(fā),構(gòu)架中主要由代理服務(wù)(代理服務(wù)器)、賬戶服務(wù)(Account Server)、容器服務(wù)(Container Server)、對象服務(wù)(對象存儲(chǔ)器)四大部分組成。Swift搭建在比較便宜的標(biāo)準(zhǔn)硬件設(shè)備上,出于成本的考慮并沒有使用RAID(磁盤冗余陣列),通過軟件層面引入一致性哈希和數(shù)據(jù)容災(zāi)技術(shù)。Swift支持多租戶模式、容器和對象的讀寫操作。為了得到更高的可用性和擴(kuò)展性,其犧牲一定的數(shù)據(jù)一致性,適合解決互聯(lián)網(wǎng)的應(yīng)用場景下非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)問題。其具有穩(wěn)定、擴(kuò)展性強(qiáng)、成本低等特點(diǎn),受到越來越多的人重視。
但是Swift在存儲(chǔ)節(jié)點(diǎn)中通過操作系統(tǒng)的VFS層調(diào)用本地文件系統(tǒng)對文件進(jìn)行磁盤讀寫操作。對于本地文件系統(tǒng),無論是讀操作還是寫操作都要經(jīng)過文件的元數(shù)據(jù)處理,隨著存儲(chǔ)小文件數(shù)量的增加,讀取一次小文件是元數(shù)據(jù)處理所占的實(shí)踐比例越來越大,最終導(dǎo)致讀寫效率偏低。雖然操作系統(tǒng)提供了對元數(shù)據(jù)的緩存機(jī)制,但在面對小文件的時(shí)候,由于其數(shù)量眾多,在內(nèi)存中緩存的元數(shù)據(jù)只占總數(shù)量的一小部分。隨機(jī)訪問的情況下,其緩存命中率較低。并且由于在云存儲(chǔ)系統(tǒng)外往往有CDN服務(wù)器存在,其具備緩存功能,基于時(shí)間局部性的文件數(shù)據(jù)往往都通過外部的CDN服務(wù)器的緩存中讀取,而通過存儲(chǔ)節(jié)點(diǎn)的訪問請求這種時(shí)間局部性被進(jìn)一步削弱,其元數(shù)據(jù)緩存命中率進(jìn)一步降低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提出針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架及構(gòu)建方法,能夠改善磁盤的I/O瓶頸,節(jié)省網(wǎng)絡(luò)開銷,提高存儲(chǔ)系統(tǒng)的效率。
根據(jù)本發(fā)明的一個(gè)方面,提供針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架構(gòu)建方法,包括如下步驟:
S1、遍歷對象存儲(chǔ)器中的所有對象以及每個(gè)對象的訪問記錄,以未合并進(jìn)入數(shù)據(jù)塊的任意一個(gè)對象為核心對象;將與核心對象的歐氏距離小于距離半徑閾值的所有對象合并為一個(gè)數(shù)據(jù)塊;
S2、針對所有數(shù)據(jù)塊中的每個(gè)對象,若對象的被訪問次數(shù)不小于第一次數(shù)閾值,將對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊;
S3、針對存儲(chǔ)節(jié)點(diǎn)緩存模塊中的每個(gè)對象,若對象的被訪問次數(shù)不小于第二次數(shù)閾值、和/或?qū)ο笏跀?shù)據(jù)塊中所有對象的歐氏距離總和小于距離總和閾值,將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊;
其中,存儲(chǔ)節(jié)點(diǎn)緩存模塊設(shè)置在存儲(chǔ)節(jié)點(diǎn)服務(wù)器與代理服務(wù)器之間,代理節(jié)點(diǎn)緩存模塊設(shè)置在代理服務(wù)器與客戶端之間;
對象存儲(chǔ)器、存儲(chǔ)節(jié)點(diǎn)緩存模塊和存儲(chǔ)節(jié)點(diǎn)服務(wù)器設(shè)置在存儲(chǔ)層,代理服務(wù)器和代理節(jié)點(diǎn)緩存模塊設(shè)置在代理層,客戶端設(shè)置在客戶層;
歐氏距離總和是指:數(shù)據(jù)塊中核心對象與數(shù)據(jù)塊中其他對象之間的歐氏距離的總和。
優(yōu)選地,第一次數(shù)閾值為1,和/或第二次數(shù)閾值為2。
優(yōu)選地,按照如下步驟確定任意兩個(gè)對象之間的歐式距離:
設(shè)兩個(gè)對象的訪問時(shí)間分別為A=(A1,A2,...,Am)和B=(B1,B2,...,Bn),tth為訪問時(shí)間距離的閾值,當(dāng)兩個(gè)對象的訪問時(shí)間小于tth時(shí)認(rèn)為該兩個(gè)對象的訪問時(shí)間相近;
依次將|Ai-Bj|<tth的訪問記錄選出,形成兩組訪問時(shí)間相近的時(shí)間序列a=(a1,a2,...,ak)和b=(b1,b2,...,bk);A和B中被選出的訪問記錄之間的歐式距離D1如公式1所示:
A和B中沒被選出的訪問記錄之間的歐式距離D2如公式2所示:
D2=M×(m+n-2k) 公式2
兩個(gè)對象的歐氏距離D如公式3所示:
式中,m和n分別為兩個(gè)對象的訪問次數(shù);k為被選出的訪問記錄的個(gè)數(shù);i為時(shí)間序列a中訪問記錄的序號(hào);j為時(shí)間序列b中訪問記錄的序號(hào)。
優(yōu)選地,存儲(chǔ)節(jié)點(diǎn)緩存模塊包括FIFO隊(duì)列和LRU隊(duì)列;步驟S2包括:
S21、針對所有數(shù)據(jù)塊中的每個(gè)對象,若對象的被訪問次數(shù)不小于第一次數(shù)閾值,將對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊的FIFO隊(duì)列中;
S21、若對象的被訪問次數(shù)不小于第二次數(shù)閾值,將對象所在的數(shù)據(jù)塊從FIFO隊(duì)列轉(zhuǎn)入LRU隊(duì)列。
優(yōu)選地,步驟S3中將所述對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊之前進(jìn)一步包括:
S30、確定所述對象的代理緩存價(jià)值。
優(yōu)選地,步驟S3中將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊具體為:
當(dāng)對象的代理緩存價(jià)值大于預(yù)設(shè)的緩存價(jià)值閾值時(shí),將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊。
優(yōu)選地,步驟S3中將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊具體為:
當(dāng)對象的代理緩存價(jià)值大于最低緩存價(jià)值時(shí),以對象所在數(shù)據(jù)塊替換最低緩存價(jià)值對應(yīng)的數(shù)據(jù)塊,并將最低緩存價(jià)值對應(yīng)的數(shù)據(jù)塊從代理節(jié)點(diǎn)緩存模塊中轉(zhuǎn)出;
其中,最低緩存價(jià)值是指代理節(jié)點(diǎn)緩存模塊中所有對象的代理緩存價(jià)值中的最小值。
優(yōu)選地,按照如下公式確定對象的代理緩存價(jià)值H:
式中,f為對象的被訪問次數(shù);cost為緩存服務(wù)器與對象存儲(chǔ)節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲;size為對象的文件大小;L為增長因子,其初值為0,當(dāng)代理節(jié)點(diǎn)緩存模塊中有對象被轉(zhuǎn)出時(shí),L的取值更新為被轉(zhuǎn)出對象的代理緩存價(jià)值;tnow為對象的當(dāng)前訪問時(shí)間,tlast為對象的上次訪問時(shí)間。
根據(jù)本發(fā)明的另一個(gè)方面,提供針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架,包括:對象存儲(chǔ)器、關(guān)聯(lián)性計(jì)算模塊、數(shù)據(jù)合并模塊、存儲(chǔ)節(jié)點(diǎn)緩存模塊和代理節(jié)點(diǎn)緩存模塊;其中,
關(guān)聯(lián)性計(jì)算模塊,遍歷對象存儲(chǔ)器中的所有對象,以未合并進(jìn)入數(shù)據(jù)塊的任意一個(gè)對象為核心對象,確定核心對象與其他任意一個(gè)對象的歐氏距離;
數(shù)據(jù)合并模塊,將歐氏距離小于距離半徑閾值的對象合并為一個(gè)數(shù)據(jù)塊;針對所有數(shù)據(jù)塊中的每個(gè)對象,若對象的被訪問次數(shù)不小于第一次數(shù)閾值,數(shù)據(jù)合并模塊將對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊;針對存儲(chǔ)節(jié)點(diǎn)緩存模塊中的每個(gè)對象,若對象的被訪問次數(shù)不小于第二次數(shù)閾值、和/或?qū)ο笏跀?shù)據(jù)塊中所有對象的歐氏距離總和小于距離總和閾值,數(shù)據(jù)合并模塊將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊;
存儲(chǔ)節(jié)點(diǎn)緩存模塊,設(shè)置在存儲(chǔ)節(jié)點(diǎn)服務(wù)器與代理服務(wù)器之間,代理節(jié)點(diǎn)緩存模塊設(shè)置在代理服務(wù)器與客戶端之間;關(guān)聯(lián)性計(jì)算模塊、數(shù)據(jù)合并模塊、對象存儲(chǔ)器、存儲(chǔ)節(jié)點(diǎn)緩存模塊和存儲(chǔ)節(jié)點(diǎn)服務(wù)器設(shè)置在存儲(chǔ)層,代理服務(wù)器和代理節(jié)點(diǎn)緩存模塊設(shè)置在代理層,客戶端設(shè)置在客戶層;
歐氏距離總和是指:數(shù)據(jù)塊中核心對象與數(shù)據(jù)塊中其他對象之間的歐氏距離的總和。
優(yōu)選地,存儲(chǔ)節(jié)點(diǎn)緩存模塊包括FIFO隊(duì)列和LRU隊(duì)列;針對所有數(shù)據(jù)塊中的每個(gè)對象,
若對象的被訪問次數(shù)不小于第一次數(shù)閾值,對象所在的數(shù)據(jù)塊存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)緩存模塊的FIFO隊(duì)列中;
若對象的被訪問次數(shù)不小于第二次數(shù)閾值,對象所在的數(shù)據(jù)塊存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)緩存模塊的LRU隊(duì)列中。
本發(fā)明通過計(jì)算不同對象之間的關(guān)聯(lián)性,將關(guān)聯(lián)度高的對象合并為一個(gè)數(shù)據(jù)集合,通過對這些數(shù)據(jù)集合進(jìn)行緩存來達(dá)到數(shù)據(jù)預(yù)取的目的。一方面可以將隨機(jī)磁盤訪問轉(zhuǎn)變?yōu)檫B續(xù)磁盤訪問,提高存儲(chǔ)系統(tǒng)的效率;另一方面通過一次性將對象集合轉(zhuǎn)入外部緩存服務(wù)進(jìn)行預(yù)讀,節(jié)省網(wǎng)絡(luò)開銷。
附圖說明
通過以下參照附圖而提供的具體實(shí)施方式部分,本發(fā)明的特征和優(yōu)點(diǎn)將變得更加容易理解,在附圖中:
圖1是根據(jù)本發(fā)明的針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架構(gòu)建方法流程圖;
圖2是根據(jù)本發(fā)明的針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架示意圖;
圖3是本發(fā)明數(shù)據(jù)塊中對象索引字段的示意圖;
圖中,10為數(shù)據(jù)庫中的對象,20為數(shù)據(jù)塊。
具體實(shí)施方式
下面參照附圖對本發(fā)明的示例性實(shí)施方式進(jìn)行詳細(xì)描述。對示例性實(shí)施方式的描述僅僅是出于示范目的,而絕不是對本發(fā)明及其應(yīng)用或用法的限制。
圖1示出了根據(jù)本發(fā)明的針對小文件的二級緩存預(yù)取的云存儲(chǔ)框架構(gòu)建方法流程圖。在步驟S1中首先遍歷對象存儲(chǔ)器中的所有對象以及每個(gè)對象的訪問記錄,計(jì)算不同對象之間的關(guān)聯(lián)性,并將關(guān)聯(lián)度高的對象合并為一個(gè)數(shù)據(jù)集合。例如利用主題模型中的概率潛在語義分析(Probabilistic Latent Semantic Analysis,PLSA),以訪問時(shí)間是否接近、或者對象主題是否接近等作為考察因素來計(jì)算對象關(guān)聯(lián)度。本領(lǐng)域技術(shù)人員可以實(shí)際情況選擇表征對象關(guān)聯(lián)性的指標(biāo),本實(shí)施例中以歐氏距離作為表征對象關(guān)聯(lián)性的指標(biāo)。具體地:遍歷對象存儲(chǔ)器中的所有對象以及每個(gè)對象的訪問記錄,以未合并進(jìn)入數(shù)據(jù)塊的任意一個(gè)對象為核心對象,將與該核心對象的歐氏距離小于距離半徑閾值的所有對象合并為一個(gè)數(shù)據(jù)塊。
關(guān)聯(lián)度較高的對象可以認(rèn)為是訪問時(shí)間較為相近的對象,對象關(guān)聯(lián)性可以理解為多維空間點(diǎn)的聚類問題。因此,可以以對象每次被訪問次數(shù)作為維度求兩個(gè)對象的歐式距離,歐式距離越小,表明二者的關(guān)聯(lián)性越高。由于關(guān)聯(lián)性高的兩個(gè)對象并不是100%同時(shí)被訪問,如果直接根據(jù)每次的被訪問記錄求歐氏距離將造成很大的誤差,所以需要進(jìn)行時(shí)間校對。優(yōu)選地,可以按照如下步驟確定任意兩個(gè)對象之間的歐式距離:
設(shè)兩個(gè)對象的訪問時(shí)間分別為A=(A1,A2,...,Am)和B=(B1,B2,...,Bn),tth為訪問時(shí)間距離的閾值,當(dāng)兩個(gè)對象的訪問時(shí)間小于tth時(shí)認(rèn)為該兩個(gè)對象的訪問時(shí)間相近;
依次將|Ai-Bj|<tth的訪問記錄選出,形成兩組訪問時(shí)間相近的時(shí)間序列a=(a1,a2,...,ak)和b=(b1,b2,...,bk);A和B中被選出的訪問記錄之間的歐式距離D1如公式1所示:
A和B中沒被選出的訪問記錄之間的歐式距離D2如公式2所示:
D2=M×(m+n-2k) 公式2
兩個(gè)對象的歐氏距離D如公式3所示:
式中,m和n分別為兩個(gè)對象的訪問次數(shù);k為被選出的訪問記錄的個(gè)數(shù);i為時(shí)間序列a中訪問記錄的序號(hào);j為時(shí)間序列b中訪問記錄的序號(hào)。
通過分別計(jì)算兩個(gè)對象的訪問時(shí)間小于tth的訪問記錄之間的歐式距離D1、以及兩個(gè)對象的訪問時(shí)間不小于tth的訪問記錄之間的歐式距離D2,能夠更準(zhǔn)確第確定兩個(gè)對象之間的關(guān)聯(lián)度,提高同一個(gè)數(shù)據(jù)庫中各個(gè)對象的關(guān)聯(lián)度。
S2、針對所有數(shù)據(jù)塊中的每個(gè)對象,若該對象的被訪問次數(shù)不小于第一次數(shù)閾值,將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊。通過將關(guān)聯(lián)度高的對象合并保存在一個(gè)數(shù)據(jù)塊中,能夠減少對象文件的數(shù)量,提高本地文件系統(tǒng)的索引速度,減少對元數(shù)據(jù)的操作開銷,從而增加小對象的訪問效率,并將隨機(jī)的磁盤讀寫轉(zhuǎn)變?yōu)閷?shù)據(jù)塊的一次讀寫,借此改善磁盤I/O瓶頸。
圖3示出了本發(fā)明優(yōu)選實(shí)施例中對象索引字段的示意圖。通過數(shù)據(jù)塊20的對象索引字段可以查找到相應(yīng)的對象10。在創(chuàng)建對象索引字段時(shí),可以按照如下方法進(jìn)行:關(guān)聯(lián)度高的對象合并保存在一個(gè)數(shù)據(jù)塊中,當(dāng)數(shù)據(jù)塊的緩沖區(qū)填滿之后,鎖死緩沖器,將其寫入一個(gè)數(shù)據(jù)塊DataBlock中,并為其賦予一個(gè)唯一的DataBlock ID,將其一次性寫入到磁盤中,并在對象的索引中添加Block ID、flag、Offset、dataLength字段。其中,F(xiàn)lag:表示該對象是否處于某個(gè)合并數(shù)據(jù)塊中。Block ID正常情況下表示對象所在的DataBlock的ID號(hào);Offset表示對象數(shù)據(jù)在DataBlock中的偏移量;Metadata length表示對象的屬性信息長度;Data length表示對象的數(shù)據(jù)長度。
第一次數(shù)閾值可以根據(jù)存儲(chǔ)節(jié)點(diǎn)緩存模塊的緩存空間、對象文件的大小、以及緩存與去的其他要求等因素進(jìn)行設(shè)置。當(dāng)存儲(chǔ)節(jié)點(diǎn)緩存模塊的緩存空間較大時(shí),能夠同時(shí)緩存較多的數(shù)據(jù)塊,此時(shí)可以適當(dāng)減小第一次數(shù)閾值的取值,使更多的數(shù)據(jù)塊被轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊;當(dāng)存儲(chǔ)節(jié)點(diǎn)緩存模塊的緩存空間較小時(shí),由于緩存空間有限,可以適當(dāng)增大第一次數(shù)閾值的取值,使關(guān)聯(lián)度更高的數(shù)據(jù)塊被轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊。例如當(dāng)?shù)谝淮螖?shù)閾值為1時(shí),針對所有數(shù)據(jù)塊中的每個(gè)對象,若該對象被首次訪問,則將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊。
在本發(fā)明的一個(gè)優(yōu)選實(shí)施例中,存儲(chǔ)節(jié)點(diǎn)緩存模塊包括FIFO隊(duì)列和LRU隊(duì)列。步驟S2包括:
S21、針對所有數(shù)據(jù)塊中的每個(gè)對象,若該對象的被訪問次數(shù)不小于第一次數(shù)閾值,將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊的FIFO隊(duì)列中;
S21、若該對象的被訪問次數(shù)不小于第二次數(shù)閾值,將該對象所在的數(shù)據(jù)塊從FIFO隊(duì)列轉(zhuǎn)入LRU隊(duì)列。
由于服務(wù)器中存儲(chǔ)容量的限制,有必要使用一定的替換策略對存儲(chǔ)節(jié)點(diǎn)緩存模塊中的緩存數(shù)據(jù)塊進(jìn)行更新,存儲(chǔ)節(jié)點(diǎn)的替換算法可以采用FIFO(First Input First Output,先入先出)算法和LRU(Least Recently Used,近期最少使用)算法結(jié)合的2Q替換算法。在上述實(shí)施例中,F(xiàn)IFO隊(duì)列可以采用FIFO算法進(jìn)行管理,用于緩存當(dāng)前的活躍數(shù)據(jù)塊;LRU隊(duì)列可以采用LRU算法進(jìn)行管理,用于緩存多次訪問的數(shù)據(jù)塊。FIFO算法和LRU算法的算法原理為本領(lǐng)域常用技術(shù)手段,本發(fā)明對此不再贅述。
S3、針對存儲(chǔ)節(jié)點(diǎn)緩存模塊中的每個(gè)對象,若該對象的被訪問次數(shù)不小于第二次數(shù)閾值、和/或?qū)ο笏跀?shù)據(jù)塊中所有對象的歐氏距離總和小于距離總和閾值,將該對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊。
本發(fā)明中,存儲(chǔ)節(jié)點(diǎn)緩存模塊設(shè)置在存儲(chǔ)節(jié)點(diǎn)服務(wù)器與代理服務(wù)器之間,代理節(jié)點(diǎn)緩存模塊設(shè)置在代理服務(wù)器與客戶端之間;對象存儲(chǔ)器、存儲(chǔ)節(jié)點(diǎn)緩存模塊和存儲(chǔ)節(jié)點(diǎn)服務(wù)器設(shè)置在存儲(chǔ)層,代理服務(wù)器和代理節(jié)點(diǎn)緩存模塊設(shè)置在代理層,客戶端設(shè)置在客戶層,如圖2所示。
Swift中訪問小對象請求由代理服務(wù)器向?qū)ο蟠鎯?chǔ)器轉(zhuǎn)發(fā),多次請求的發(fā)送消耗過多的網(wǎng)絡(luò)資源以及對象存儲(chǔ)器內(nèi)部的業(yè)務(wù)處理(如計(jì)算Etag等)。通過一次性將整個(gè)數(shù)據(jù)塊轉(zhuǎn)入外部緩存服務(wù)進(jìn)行預(yù)讀,能夠大大節(jié)省網(wǎng)絡(luò)開銷。
本發(fā)明中,可以僅以存儲(chǔ)節(jié)點(diǎn)緩存模塊中每個(gè)對象的被訪問次數(shù)確定是否將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊中。被訪問次數(shù)越多,表明該對象被訪問的可能性越大,轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊緩存的緩存價(jià)值越大。
對于某些對象,短時(shí)間內(nèi)被多次訪問后,有可能之后的很長一段時(shí)間內(nèi)沒有再被訪問,此時(shí)該對象的被訪問次數(shù)仍然很高,但是緩存價(jià)值很低。為了避免這種情況的發(fā)生,可以僅以對象所在數(shù)據(jù)塊中所有對象的歐氏距離總和確定是否將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊中。其中,歐氏距離總和是指數(shù)據(jù)塊中核心對象與數(shù)據(jù)塊中其他對象之間的歐氏距離的總和。數(shù)據(jù)塊中所有對象的歐氏距離總和越大,表明內(nèi)內(nèi)部各個(gè)對象的關(guān)聯(lián)度越高。Swift中訪問小對象請求由代理服務(wù)器向?qū)ο蟠鎯?chǔ)器轉(zhuǎn)發(fā),多次請求的發(fā)送消耗過多的網(wǎng)絡(luò)資源以及對象存儲(chǔ)器內(nèi)部的業(yè)務(wù)處理(如計(jì)算Etag等)。通過一次性將關(guān)聯(lián)度更高的數(shù)據(jù)塊轉(zhuǎn)入外部緩存服務(wù)進(jìn)行預(yù)讀,能夠大大節(jié)省網(wǎng)絡(luò)開銷。
為了進(jìn)一步提高對象小對象的讀取性能,也可以同時(shí)以對象的被訪問次數(shù)和對象所在數(shù)據(jù)塊中所有對象的歐氏距離總和確定是否將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊中。如此便可以既兼顧對象被再次讀取的可能性和對象所在數(shù)據(jù)塊的關(guān)聯(lián)性,提高轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊中每個(gè)對象的緩存價(jià)值。
在代理節(jié)點(diǎn)緩存模塊進(jìn)行緩存時(shí),緩存對象由存儲(chǔ)節(jié)點(diǎn)緩存模塊通過網(wǎng)絡(luò)傳輸至代理節(jié)點(diǎn)緩存模塊,數(shù)據(jù)的傳輸代價(jià)比較高,為了考慮其傳輸成本或者評估其緩存價(jià)值,步驟S3中將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊之前可以進(jìn)一步包括:S30、確定該對象的代理緩存價(jià)值。
以下以GDS(Greedy Dual Size)算法為例詳細(xì)說明代理緩存價(jià)值的計(jì)算方法。根據(jù)GDS算法,對象的理論代理緩存價(jià)值H1為:
式中,cost為緩存服務(wù)器與對象存儲(chǔ)節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲,cost越大,表示對象的重新取回成本越高,緩存價(jià)值也就越大,可以按照時(shí)間(例如ms)計(jì)算網(wǎng)絡(luò)延遲,也可以按照對象的文件大小(例如kb)計(jì)算網(wǎng)絡(luò)延遲。size為對象的文件大小,對象越大,占用的緩存空間越多,緩存的價(jià)值越低,其單位可以是kb。L為增長因子,其初值為0,當(dāng)代理節(jié)點(diǎn)緩存模塊中有對象被轉(zhuǎn)出時(shí),L的取值更新為被轉(zhuǎn)出對象的代理緩存價(jià)值。
GDS算法的優(yōu)點(diǎn)是簡單易實(shí)現(xiàn),但是沒有考慮流行度等因素對緩存價(jià)值的影響,為,改善了GDS算法中流行度較高的對象會(huì)被過早替換出的缺點(diǎn),可以引入對象的訪問頻率,使其更符合數(shù)據(jù)訪問的時(shí)間局部性規(guī)律。引入對象的訪問頻率,對象的代理緩存價(jià)值H2為:
式中,f為對象的被訪問次數(shù)。
通過引入訪問頻率增加熱度較高的緩存對象的緩存價(jià)值。但是在面對短時(shí)間內(nèi)的多次訪問造成對象緩存價(jià)值高、之后長時(shí)間內(nèi)沒有再被訪問的情況,上述算法無法考慮訪問時(shí)間間隔對緩存價(jià)值的影響,容易使緩存價(jià)值較高、但訪問時(shí)間間隔較大的對象長時(shí)間滯留于緩存中。如果一個(gè)對象的訪問時(shí)間間隔越大,其緩存價(jià)值也就越小。根據(jù)訪問時(shí)間間隔考量,可以按照如下公式確定對象的代理緩存價(jià)值H:
式中,tnow為對象的當(dāng)前訪問時(shí)間,tlast為對象的上次訪問時(shí)間。
在一些實(shí)施例中,步驟S3中將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊具體為:當(dāng)對象的代理緩存價(jià)值大于預(yù)設(shè)的緩存價(jià)值閾值時(shí),將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊。如此,使得代理緩存價(jià)值達(dá)到一定程度時(shí),該對象所在的數(shù)據(jù)塊才會(huì)被轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊,降低緩存預(yù)取成本,提高服務(wù)器小對象文件的讀取性能。
在另一些實(shí)施例中,步驟S3中將對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊具體為:當(dāng)對象的代理緩存價(jià)值大于最低緩存價(jià)值時(shí),以對象所在數(shù)據(jù)塊替換最低緩存價(jià)值對應(yīng)的數(shù)據(jù)塊,并將最低緩存價(jià)值對應(yīng)的數(shù)據(jù)塊從代理節(jié)點(diǎn)緩存模塊中轉(zhuǎn)出。其中,最低緩存價(jià)值是指代理節(jié)點(diǎn)緩存模塊中所有對象的代理緩存價(jià)值中的最小值。如此,當(dāng)緩存空間不足時(shí),把代理緩存價(jià)值最低的對象對應(yīng)的數(shù)據(jù)塊替換出去。
本發(fā)明還提供了采用上述云存儲(chǔ)框架構(gòu)建方法的云存儲(chǔ)框架,包括:對象存儲(chǔ)器、關(guān)聯(lián)性計(jì)算模塊、數(shù)據(jù)合并模塊、存儲(chǔ)節(jié)點(diǎn)緩存模塊和代理節(jié)點(diǎn)緩存模塊;其中,
關(guān)聯(lián)性計(jì)算模塊,遍歷對象存儲(chǔ)器中的所有對象,以未合并進(jìn)入數(shù)據(jù)塊的任意一個(gè)對象為核心對象,確定核心對象與其他任意一個(gè)對象的歐氏距離;
數(shù)據(jù)合并模塊,將歐氏距離小于距離半徑閾值的對象合并為一個(gè)數(shù)據(jù)塊;針對所有數(shù)據(jù)塊中的每個(gè)對象,若該對象的被訪問次數(shù)不小于第一次數(shù)閾值,數(shù)據(jù)合并模塊將該對象所在的數(shù)據(jù)塊轉(zhuǎn)入存儲(chǔ)節(jié)點(diǎn)緩存模塊;針對存儲(chǔ)節(jié)點(diǎn)緩存模塊中的每個(gè)對象,若該對象的被訪問次數(shù)不小于第二次數(shù)閾值、和/或該對象所在數(shù)據(jù)塊中所有對象的歐氏距離總和小于距離總和閾值,數(shù)據(jù)合并模塊將該對象所在數(shù)據(jù)塊轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊;
存儲(chǔ)節(jié)點(diǎn)緩存模塊,設(shè)置在存儲(chǔ)節(jié)點(diǎn)服務(wù)器與代理服務(wù)器之間,代理節(jié)點(diǎn)緩存模塊設(shè)置在代理服務(wù)器與客戶端之間;關(guān)聯(lián)性計(jì)算模塊、數(shù)據(jù)合并模塊、對象存儲(chǔ)器、存儲(chǔ)節(jié)點(diǎn)緩存模塊和存儲(chǔ)節(jié)點(diǎn)服務(wù)器設(shè)置在存儲(chǔ)層,代理服務(wù)器和代理節(jié)點(diǎn)緩存模塊設(shè)置在代理層,客戶端設(shè)置在客戶層;
歐氏距離總和是指:數(shù)據(jù)塊中核心對象與數(shù)據(jù)塊中其他對象之間的歐氏距離的總和。
優(yōu)選地,存儲(chǔ)節(jié)點(diǎn)緩存模塊包括FIFO隊(duì)列和LRU隊(duì)列;針對所有數(shù)據(jù)塊中的每個(gè)對象,
若對象的被訪問次數(shù)不小于第一次數(shù)閾值,該對象所在的數(shù)據(jù)塊存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)緩存模塊的FIFO隊(duì)列中;
若所述對象的被訪問次數(shù)不小于第二次數(shù)閾值,對象所在的數(shù)據(jù)塊存儲(chǔ)在存儲(chǔ)節(jié)點(diǎn)緩存模塊的LRU隊(duì)列中。
本發(fā)明的技術(shù)方案中,接收到訪問請求時(shí),首先從代理節(jié)點(diǎn)緩存模塊中數(shù)據(jù)塊的對象索引字段中查找待訪問對象,若代理節(jié)點(diǎn)緩存模塊命中該待訪問對象,直接從代理節(jié)點(diǎn)緩存模塊中讀取該對象;若代理節(jié)點(diǎn)緩存模塊沒有命中該對象,則從存儲(chǔ)節(jié)點(diǎn)緩存模塊中數(shù)據(jù)塊的對象索引字段中查找待訪問對象,若存儲(chǔ)節(jié)點(diǎn)緩存模塊命中該待訪問對象,從存儲(chǔ)節(jié)點(diǎn)緩存模塊中讀取該對象;若存儲(chǔ)節(jié)點(diǎn)緩存模塊未命中該待訪問對象,則從對象存儲(chǔ)器中讀取該待訪問對象。
與現(xiàn)有技術(shù)相比,本發(fā)明不僅能夠?qū)㈦S機(jī)磁盤訪問轉(zhuǎn)變?yōu)檫B續(xù)磁盤訪問,提高存儲(chǔ)系統(tǒng)的效率,還能一次性將關(guān)聯(lián)度較高的對象集合轉(zhuǎn)入代理節(jié)點(diǎn)緩存模塊進(jìn)行預(yù)讀,節(jié)省網(wǎng)絡(luò)開銷,另外小對象文件的合并也減少了元數(shù)據(jù)的數(shù)量,減少了在對象訪問時(shí)元數(shù)據(jù)的操作時(shí)間。
雖然參照示例性實(shí)施方式對本發(fā)明進(jìn)行了描述,但是應(yīng)當(dāng)理解,本發(fā)明并不局限于文中詳細(xì)描述和示出的具體實(shí)施方式,在不偏離權(quán)利要求書所限定的范圍的情況下,本領(lǐng)域技術(shù)人員可以對所述示例性實(shí)施方式做出各種改變。