本發(fā)明涉及文件讀取技術(shù)領(lǐng)域,特別是涉及一種分布式存儲中文件批量讀取方法。
背景技術(shù):
目前,隨著信息技術(shù)和互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,企業(yè)所需傳輸、存儲的數(shù)據(jù)也隨之劇增。在海量小文件的場景,如,如社交購物網(wǎng)站、廣電、網(wǎng)絡(luò)視頻等,系統(tǒng)產(chǎn)生文本、圖片、音樂等大量小文件,這些文件具有如下特點(diǎn):文件數(shù)量多,大小一般在1mb以下;文件的讀取一般都是順序讀取。
分布式數(shù)據(jù)存儲系統(tǒng)中,文件讀取時(shí),客戶端首先要向mds端發(fā)送請求,獲取文件的權(quán)限和元數(shù)據(jù)信息,然后客戶端通過獲取到的元數(shù)據(jù)信息,找到對應(yīng)的存儲文件數(shù)據(jù)osd,從osd中讀取文件的數(shù)據(jù)信息。整個(gè)文件讀取過程需要經(jīng)過較長的io流程。當(dāng)批量讀取大量文件時(shí),每個(gè)文件都獨(dú)立經(jīng)過所有io流程,這樣會頻繁地向mds請求文件的元數(shù)據(jù)信息,然后又頻繁調(diào)用objectcacher中的讀接口,從osd中讀取數(shù)據(jù)。文件讀取過程中重復(fù)請求發(fā)送、處理頻繁,對系統(tǒng)壓力大。
分布式文件系統(tǒng)中,文件讀取時(shí)每次都需客戶端向mds端請求待讀取文件的元數(shù)據(jù)信息,獲取元數(shù)據(jù)信息之后再從osd中獲取文件的數(shù)據(jù)信息。文件讀取時(shí)需要較長的io流程,讀取速度較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種分布式存儲中文件批量讀取方法,以實(shí)現(xiàn)減少文件讀取的io流程,提高讀取速度。
為解決上述技術(shù)問題,本發(fā)明提供一種分布式存儲中文件批量讀取方法,應(yīng)用于客戶端,包括:
在文件進(jìn)行open操作時(shí),向元數(shù)據(jù)服務(wù)器mds發(fā)送請求,獲取當(dāng)前文件以及當(dāng)前文件之后的若干待讀文件的元數(shù)據(jù)信息;
將元數(shù)據(jù)信息中的索引號ino和目錄項(xiàng)dentry存入dentry_map結(jié)構(gòu)中;
依據(jù)元數(shù)據(jù)信息查找到存儲文件數(shù)據(jù)的對應(yīng)的對象存儲設(shè)備osd,從osd中讀取待讀文件的數(shù)據(jù);
完成待讀文件的數(shù)據(jù)讀取后,根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀。
優(yōu)選的,所述將元數(shù)據(jù)信息中的索引號ino和目錄項(xiàng)dentry存入dentry_map結(jié)構(gòu)中,包括:
按照索引號ino遞增的方式,將元數(shù)據(jù)信息中的索引號ino及相應(yīng)的目錄項(xiàng)dentry存放到客戶端的dentry_map結(jié)構(gòu)中。
優(yōu)選的,所述根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀,包括:
根據(jù)dentry目錄結(jié)構(gòu)獲取相應(yīng)的inode結(jié)構(gòu),根據(jù)inode結(jié)構(gòu)從相應(yīng)的osd中讀取指定個(gè)數(shù)的文件。
優(yōu)選的,所述請求為在當(dāng)前文件元數(shù)據(jù)請求中同時(shí)獲取相鄰文件元數(shù)據(jù)。
優(yōu)選的,所述元數(shù)據(jù)信息的數(shù)量通過配置項(xiàng)動態(tài)配置。
優(yōu)選的,所述完成待讀文件的數(shù)據(jù)讀取后,根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀之后,還包括:
順序讀取下一個(gè)文件,命中客戶端緩存,從客戶端緩存中獲取文件數(shù)據(jù)。
優(yōu)選的,所述順序讀取下一個(gè)文件,命中客戶端緩存,從客戶端緩存中獲取文件數(shù)據(jù)之后,還包括:
若待讀取的文件沒有命中客戶端緩存,從osd中預(yù)讀指定個(gè)數(shù)的文件到客戶端緩存中。
本發(fā)明所提供的一種分布式存儲中文件批量讀取方法,應(yīng)用于客戶端,在文件進(jìn)行open操作時(shí),向元數(shù)據(jù)服務(wù)器mds發(fā)送請求,獲取當(dāng)前文件以及當(dāng)前文件之后的若干待讀文件的元數(shù)據(jù)信息;將元數(shù)據(jù)信息中的索引號ino和目錄項(xiàng)dentry存入dentry_map結(jié)構(gòu)中;依據(jù)元數(shù)據(jù)信息查找到存儲文件數(shù)據(jù)的對應(yīng)的對象存儲設(shè)備osd,從osd中讀取待讀文件的數(shù)據(jù);完成待讀文件的數(shù)據(jù)讀取后,根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀??梢?,文件批量讀取時(shí),每次從mds端獲取文件元數(shù)據(jù)信息時(shí),一次獲取多個(gè)文件元數(shù)據(jù)信息,減少客戶端與mds之間的交互次數(shù),減輕mds端的請求處理壓力,同時(shí)縮短文件讀取過程中的io流程。并且,在讀取當(dāng)前待讀取文件后,按照dentry_map中存儲的順序,進(jìn)行文件預(yù)讀,如此順序讀取場景下,能大概率地命中預(yù)讀緩存,減少文件讀取的io流程,加快讀取速度。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明所提供的一種分布式存儲中文件批量讀取方法的流程圖;
圖2為文件批量讀取流程示意圖;
圖3為文件讀取原理圖;
圖4為文件批量讀取原理圖。
具體實(shí)施方式
本發(fā)明的核心是提供一種分布式存儲中文件批量讀取方法,以實(shí)現(xiàn)減少文件讀取的io流程,提高讀取速度。
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
術(shù)語解釋如下:
mds:元數(shù)據(jù)服務(wù)器,用于管理文件元數(shù)據(jù)信息;
osd:對象存儲設(shè)備,用于存儲數(shù)據(jù)信息。
請參考圖1,圖1為本發(fā)明所提供的一種分布式存儲中文件批量讀取方法的流程圖,該方法應(yīng)用于客戶端,包括:
步驟s11:在文件進(jìn)行open操作時(shí),向元數(shù)據(jù)服務(wù)器mds發(fā)送請求,獲取當(dāng)前文件以及當(dāng)前文件之后的若干待讀文件的元數(shù)據(jù)信息;
步驟s12:將元數(shù)據(jù)信息中的索引號ino和目錄項(xiàng)dentry存入dentry_map結(jié)構(gòu)中;
步驟s13:依據(jù)元數(shù)據(jù)信息查找到存儲文件數(shù)據(jù)的對應(yīng)的對象存儲設(shè)備osd,從osd中讀取待讀文件的數(shù)據(jù);
步驟s14:完成待讀文件的數(shù)據(jù)讀取后,根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀。
可見,文件批量讀取時(shí),每次從mds端獲取文件元數(shù)據(jù)信息時(shí),一次獲取多個(gè)文件元數(shù)據(jù)信息,減少客戶端與mds之間的交互次數(shù),減輕mds端的請求處理壓力,同時(shí)縮短文件讀取過程中的io流程。并且,在讀取當(dāng)前待讀取文件后,按照dentry_map中存儲的順序,進(jìn)行文件預(yù)讀,如此順序讀取場景下,能大概率地命中預(yù)讀緩存,減少文件讀取的io流程,加快讀取速度。
基于上述方法,進(jìn)一步的,步驟s12的過程具體包括:按照索引號ino遞增的方式,將元數(shù)據(jù)信息中的索引號ino及相應(yīng)的目錄項(xiàng)dentry存放到客戶端的dentry_map結(jié)構(gòu)中。
進(jìn)一步的,步驟s14中,根據(jù)dentry_map結(jié)構(gòu)中的存儲順序進(jìn)行文件預(yù)讀的過程具體包括:根據(jù)dentry目錄結(jié)構(gòu)獲取相應(yīng)的inode結(jié)構(gòu),根據(jù)inode結(jié)構(gòu)從相應(yīng)的osd中讀取指定個(gè)數(shù)的文件。
其中,步驟s11中,所述請求為在當(dāng)前文件元數(shù)據(jù)請求中同時(shí)獲取相鄰文件元數(shù)據(jù)。
其中,步驟s11中,元數(shù)據(jù)信息的數(shù)量通過配置項(xiàng)動態(tài)配置。
其中,步驟s11中,獲取到當(dāng)前文件的元數(shù)據(jù)信息和當(dāng)前文件之后的若干待讀文件的元數(shù)據(jù)信息。
進(jìn)一步的,步驟s14之后,還包括:順序讀取下一個(gè)文件,命中客戶端緩存,從客戶端緩存中獲取文件數(shù)據(jù)。
其中,順序讀取下一個(gè)文件,命中客戶端緩存,從客戶端緩存中獲取文件數(shù)據(jù)之后,還包括:若待讀取的文件沒有命中客戶端緩存,從osd中預(yù)讀指定個(gè)數(shù)的文件到客戶端緩存中。
小文件場景中,在文件open操作時(shí),從mds端獲取當(dāng)前文件及指定數(shù)目的相鄰文件的元數(shù)據(jù)信息。文件讀取時(shí),完成當(dāng)前文件的數(shù)據(jù)讀取之后,根據(jù)獲取的元數(shù)據(jù)信息,從osd端讀取指定數(shù)目的相鄰文件。在順序讀取時(shí),能命中客戶端緩存,減少文件讀取的整體io流程,提高讀取速度。本方法每次讀取文件時(shí)順序讀取其相鄰文件到客戶端緩存中,當(dāng)讀取文件命中緩存時(shí)能縮短文件讀取的io流程,提高文件的讀取速度。
其中,海量小文件場景中文件的創(chuàng)建一般是批量順序創(chuàng)建,因此,相鄰文件的ino在很大概率上也是相鄰的。當(dāng)順序批量讀取文件時(shí),可認(rèn)為待讀取文件的ino是順序遞增的。
基于本方法,詳細(xì)的,在文件open操作時(shí),向mds發(fā)送請求,獲取當(dāng)前open文件之后的若干文件的元數(shù)據(jù)信息。通過一次獲取元數(shù)據(jù)請求,得到批量元數(shù)據(jù)信息。每次元數(shù)據(jù)請求獲取元數(shù)據(jù)數(shù)量可通過配置項(xiàng)動態(tài)配置。
然后,在獲取當(dāng)前目錄下待讀取文件的元數(shù)據(jù)信息后,按照ino遞增的方式,將文件ino及其相應(yīng)的dentry存放到一個(gè)map結(jié)構(gòu):dentry_map中。在客戶端目錄結(jié)構(gòu)中存儲當(dāng)前目錄下的文件信息。
接著,文件讀取時(shí),如果待讀取文件未命中客戶端緩存,需要調(diào)用objectcacher中的讀接口從osd中讀取文件的數(shù)據(jù)信息時(shí),在讀取當(dāng)前待讀取文件后,按照dentry_map中存儲的順序,進(jìn)行文件預(yù)讀,從osd中讀取指定數(shù)目的文件。順序讀取場景下,能大概率地命中預(yù)讀緩存,減少文件讀取的io流程,加快讀取速度。參考圖2,圖2為文件批量讀取流程示意圖。
本方法在文件讀取中,減少客戶端與mds端交互次數(shù),減輕大量讀取文件時(shí)mds端元數(shù)據(jù)請求處理壓力,并且縮短文件讀取的io流程,提高客戶端緩存命中率,提升文件讀取速度。
如圖3所示,文件讀取過程中,每個(gè)文件都需先向mds請求元數(shù)據(jù)信息,mds成功處理,回復(fù)請求后,客戶端根據(jù)獲取的元數(shù)據(jù)信息,找到存儲數(shù)據(jù)的相應(yīng)osd,從osd中讀取數(shù)據(jù)信息。整個(gè)過程中客戶端需同mds和osd交互。當(dāng)文件數(shù)量較多時(shí),客戶端同mds和osd的交互次數(shù)劇增。造成系統(tǒng)請求處理壓力大。
如圖4所示,文件批量讀取時(shí),每次從mds端獲取文件元數(shù)據(jù)信息時(shí),一次獲取多個(gè)文件元數(shù)據(jù)信息,減少client與mds之間的交互次數(shù),減輕mds端的請求處理壓力,同時(shí)縮短文件讀取過程中的io流程。從osd中讀取文件時(shí),每次成功讀完當(dāng)前指定的待讀取文件時(shí),根據(jù)從mds端獲取的元數(shù)據(jù)信息,依次預(yù)讀后續(xù)指定數(shù)目文件。順序讀取場景中,指定預(yù)讀數(shù)目為n時(shí),從osd中批量讀取文件一次,可在后續(xù)文件讀取中命中n次客戶端緩存。
在海量小文件場景中,文件具有數(shù)量多,大小較小,一般進(jìn)行順序操作的特點(diǎn)。這對這些特點(diǎn)提出小文件讀取過程中進(jìn)行批量讀取,減少客戶端與mds之間的請求交互,縮短文件讀取過程的io流程,提高文件讀取速度?;诒痉椒?,具體實(shí)施步驟如下:
1、客戶端讀取文件時(shí),需要先獲取文件元數(shù)據(jù)信息,客戶端向mds發(fā)送元數(shù)據(jù)請求;mds從osd中讀取文件的元數(shù)據(jù)信息,向客戶端返回;客戶端獲取元數(shù)據(jù)信息后open文件;
2、在open操作中,客戶端向mds發(fā)送當(dāng)前文件的元數(shù)據(jù)信息請求,從mds端獲取批量元數(shù)據(jù)信息,包含當(dāng)前文件及當(dāng)前文件之后的若干待讀文件的元數(shù)據(jù)信息;
3、將從mds端獲取的元數(shù)據(jù)信息中的ino和相應(yīng)dentry存入客戶端dentry_map結(jié)構(gòu)中;
4、根據(jù)文件的元數(shù)據(jù)信息,找到存儲文件數(shù)據(jù)對應(yīng)的osd,從osd中讀取待讀文件的數(shù)據(jù);
5、完成待讀文件的數(shù)據(jù)讀取之后,根據(jù)dentry_map中的存儲順序進(jìn)行文件預(yù)讀;
其中,根據(jù)dentry結(jié)構(gòu)獲取相應(yīng)的inode,根據(jù)inode結(jié)構(gòu)從相應(yīng)的osd中讀取指定個(gè)數(shù)的文件;
6、順序讀取下一個(gè)文件時(shí),由于已經(jīng)進(jìn)行文件預(yù)讀,因此命中客戶端緩存,從緩存中獲取文件數(shù)據(jù);
其中,直到待讀取的文件未命中客戶端緩存時(shí)再從osd中預(yù)讀指定個(gè)數(shù)的文件到客戶端緩存中。
本方法主要在海量小文建場景中,大量順序讀取文件時(shí),在一次讀請求中批量從mds獲取相鄰文件元數(shù)據(jù)信息,并從osd中讀取文件相鄰的文件,通過文件預(yù)讀的方式加快文件讀取速度。
以上對本發(fā)明所提供的一種分布式存儲中文件批量讀取方法進(jìn)行了詳細(xì)介紹。本文中應(yīng)用了具體個(gè)例對本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想。應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以對本發(fā)明進(jìn)行若干改進(jìn)和修飾,這些改進(jìn)和修飾也落入本發(fā)明權(quán)利要求的保護(hù)范圍內(nèi)。