基于分布式文件系統(tǒng)的文件讀取、寫入方法及節(jié)點服務(wù)器的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種文件處理的技術(shù)領(lǐng)域,具體涉及一種基于分布式文件系統(tǒng)的文件 讀取方法、一種基于分布式文件系統(tǒng)的文件寫入方法、W及一種節(jié)點服務(wù)器。
【背景技術(shù)】
[0002] 隨著信息技術(shù)的快速發(fā)展,海量的信息需要被可靠存儲的同時,還要滿足被大量 的使用者快速訪問的需求。傳統(tǒng)的存儲方案已經(jīng)從構(gòu)架上越來越難W適應(yīng)近幾年來的 業(yè)務(wù)的飛速發(fā)展,成為了業(yè)務(wù)發(fā)展的瓶頸和障礙,此時皿FS化adoop Distributed File System,化doop分布式文件系統(tǒng))應(yīng)運而生。
[0003] 皿FS是通過一個高效的分布式算法,將數(shù)據(jù)的訪問和存儲分布在大量服務(wù)器之 中,在可靠地多備份存儲的同時還能將訪問分布在集群中的各個服務(wù)器之上,是傳統(tǒng)存儲 構(gòu)架的一個顛覆性的發(fā)展。
[0004] 皿FS對數(shù)據(jù)存儲的最小單位為塊化lock),皿FS會將其存儲的大文件打散成很 多block。皿FS在進行block讀寫的時候是W packet為單位進行的,每一個packet由若 干個chunk (chunk是進行數(shù)據(jù)校驗的基本單位)組成,對每一個chunk生成一個校驗和 (checksum)并將校驗和進行存儲(在默認情況下一個chunk的大小是5^byte,生成的校 驗和是4byte)。參考圖1所示的block存儲方式,每個block分為數(shù)據(jù)塊文件化lock文 件)W及其對應(yīng)的數(shù)據(jù)塊驗證文件(meta文件),讀取block文件中的數(shù)據(jù)時,首先從meta 文件的checksum header中確定校驗算法等信息,繼而讀取block文件對應(yīng)的內(nèi)容,最后讀 取meta文件中的校驗和信息。
[0005] 從上述流程中可W看出,一次block文件的讀取過程,涉及到3次磁盤1/0(輸入 輸出)。在隨機讀取過程中,若每次磁盤操作需要約10ms,3次就是30ms,性能非常低下。
【發(fā)明內(nèi)容】
[0006] 鑒于上述問題,提出了本發(fā)明W便提供一種克服上述問題或者至少部分地解決上 述問題的一種基于分布式文件系統(tǒng)的文件讀取方法、一種基于分布式文件系統(tǒng)的文件寫入 方法和相應(yīng)的一種節(jié)點服務(wù)器。
[0007] 依據(jù)本發(fā)明的一個方面,提供了一種基于分布式文件系統(tǒng)的文件讀取方法,所述 方法包括:
[0008] 數(shù)據(jù)節(jié)點服務(wù)器接收客戶端發(fā)送的數(shù)據(jù)訪問請求,所述數(shù)據(jù)訪問請求包括需要讀 取的目標(biāo)數(shù)據(jù)塊的信息;
[0009] 獲得與所述目標(biāo)數(shù)據(jù)塊的信息匹配的目標(biāo)數(shù)據(jù)塊,所述目標(biāo)數(shù)據(jù)塊包括標(biāo)識信息 W及第一數(shù)據(jù)信息,所述標(biāo)識信息包括校驗屬性信息;
[0010] 將所述校驗屬性信息W及所述第一數(shù)據(jù)信息發(fā)送至所述客戶端。
[0011] 可選地,所述第一數(shù)據(jù)信息包括分片數(shù)據(jù)chunk W及對應(yīng)的校驗和數(shù)據(jù) checksum,其中,所述分片數(shù)據(jù)chunk W及所述校驗和數(shù)據(jù)checksum存儲在磁盤的同一個 存儲介質(zhì)中。
[0012] 可選地,將所述校驗屬性信息W及所述第一數(shù)據(jù)信息發(fā)送至所述客戶端的步驟包 括:
[0013] 從所述目標(biāo)數(shù)據(jù)塊的標(biāo)識信息中讀取所述校驗屬性信息發(fā)送至所述客戶端;
[0014] 從所述存儲介質(zhì)中讀取預(yù)設(shè)大小的分片數(shù)據(jù)chunk W及對應(yīng)的校驗和數(shù)據(jù) checksum發(fā)送至所述客戶端。
[0015] 可選地,所述目標(biāo)數(shù)據(jù)塊的信息包括目標(biāo)數(shù)據(jù)塊ID,目標(biāo)數(shù)據(jù)塊的時間戳 GenerationStamp,所述獲得與所述目標(biāo)數(shù)據(jù)塊的信息匹配的目標(biāo)數(shù)據(jù)塊的步驟包括:
[0016] 依據(jù)所述目標(biāo)數(shù)據(jù)塊ID W及所述目標(biāo)數(shù)據(jù)塊的時間戳GenerationStamp,遍歷磁 盤中存儲的數(shù)據(jù)塊,所述數(shù)據(jù)塊包括數(shù)據(jù)塊ID W及數(shù)據(jù)塊時間戳;
[0017] 查找所述數(shù)據(jù)塊ID與所述目標(biāo)數(shù)據(jù)塊ID相同,W及所述數(shù)據(jù)塊時間戳與所述目 標(biāo)數(shù)據(jù)塊的時間戳GenerationStamp相同的數(shù)據(jù)塊作為目標(biāo)數(shù)據(jù)塊。
[0018] 可選地,所述校驗屬性信息包括校驗和版本Inlinechecksumversion,校驗和類型 checksumtype, W及每個校驗和字節(jié)數(shù) bytesPerOiecksum。
[0019] 可選地,所述目標(biāo)數(shù)據(jù)塊的信息包括目標(biāo)數(shù)據(jù)塊的塊內(nèi)偏移量startOff set W及 目標(biāo)數(shù)據(jù)塊的長度,所述預(yù)設(shè)大小為第一數(shù)據(jù)包packet的大小,所述從所述存儲介質(zhì)中讀 取預(yù)設(shè)大小的分片數(shù)據(jù)chunk W及對應(yīng)的校驗和數(shù)據(jù)checksum發(fā)送至所述客戶端的步驟 包括:
[0020] 子步驟S11,創(chuàng)建第一數(shù)據(jù)包packet ;
[0021] 子步驟S12,依據(jù)所述目標(biāo)數(shù)據(jù)塊的塊內(nèi)偏移量startOffset計算起始位置;
[0022] 子步驟S13,從所述起始位置開始,在所述存儲介質(zhì)中依次讀取每個分片數(shù)據(jù) chunk W及與所述分片數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum到所述第一數(shù)據(jù)包packet 中,直到填滿所述第一數(shù)據(jù)包packet ;
[0023] 子步驟S14,將所述第一數(shù)據(jù)包packet發(fā)送至客戶端中;
[0024] 子步驟S15,重復(fù)上述子步驟S11至子步驟S14,直到發(fā)送至客戶端的數(shù)據(jù)的大小 等于所述目標(biāo)數(shù)據(jù)塊的長度。
[00巧]可選地,所述校驗和數(shù)據(jù)checksum在所述存儲介質(zhì)中的位置位于對應(yīng)的分片數(shù) 據(jù)chunk的存儲位置之后,位于所述對應(yīng)的分片數(shù)據(jù)chunk的下一個分片數(shù)據(jù)chunk的存 儲位置之前。
[0026] 可選地,在所述獲得與所述目標(biāo)數(shù)據(jù)塊的信息匹配的目標(biāo)數(shù)據(jù)塊的步驟之前,還 包括:
[0027] 依據(jù)所述數(shù)據(jù)訪問請求建立與所述客戶端的socket連接。
[0028] 根據(jù)本發(fā)明的另一方面,提供了一種基于分布式文件系統(tǒng)的文件寫入方法,所述 方法包括:
[0029] 數(shù)據(jù)節(jié)點服務(wù)器接收客戶端發(fā)送的第二數(shù)據(jù)包packet,所述第二數(shù)據(jù)包packet 中包括目標(biāo)數(shù)據(jù)塊ID、校驗屬性信息W及第二數(shù)據(jù)信息;
[0030] 依據(jù)所述目標(biāo)數(shù)據(jù)塊ID定位對應(yīng)的目標(biāo)數(shù)據(jù)塊;
[0031] 在所述目標(biāo)數(shù)據(jù)塊ID中添加所述校驗屬性信息,生成所述目標(biāo)數(shù)據(jù)塊的標(biāo)識信 息;
[0032] 將所述第二數(shù)據(jù)信息寫入所述目標(biāo)數(shù)據(jù)塊中。
[0033] 可選地,所述第二數(shù)據(jù)信息包括多個分片數(shù)據(jù)chunk, W及分別與所述多個分片數(shù) 據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum,所述將所述第二數(shù)據(jù)信息寫入所述目標(biāo)數(shù)據(jù)塊中的 步驟為:
[0034] 將所述分片數(shù)據(jù)chunk W及與所述分片數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum 寫入所述目標(biāo)數(shù)據(jù)塊ID對應(yīng)的目標(biāo)數(shù)據(jù)塊中,其中,所述分片數(shù)據(jù)chunk W及與所述分片 數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum存儲在磁盤的同一存儲介質(zhì)中。
[0035] 可選地,所述校驗屬性信息包括校驗和版本Inlinechecksumversion,校驗和類型 checksumtype, W及每個校驗和字節(jié)數(shù) bytesPerOiecksum。
[0036] 可選地,在所述將所述第二數(shù)據(jù)信息寫入所述目標(biāo)數(shù)據(jù)塊中的步驟之后,還包 括:
[0037] 當(dāng)前數(shù)據(jù)節(jié)點服務(wù)器將所述第二數(shù)據(jù)包packet傳遞至預(yù)先生成的節(jié)點隊列中的 下一數(shù)據(jù)節(jié)點服務(wù)器中。
[0038] 可選地,所述方法還包括:
[0039] 生成響應(yīng)信息,所述響應(yīng)信息為告知所述客戶端當(dāng)前第二數(shù)據(jù)包packet處理完 成的信息;
[0040] 將所述響應(yīng)信息返回所述客戶端。
[0041] 根據(jù)本發(fā)明的另一方面,提供了一種節(jié)點服務(wù)器,所述服務(wù)器包括:
[0042] 請求接收模塊,適于接收客戶端發(fā)送的數(shù)據(jù)訪問請求,所述數(shù)據(jù)訪問請求包括需 要讀取的目標(biāo)數(shù)據(jù)塊的信息;
[0043] 定位模塊,適于獲得與所述目標(biāo)數(shù)據(jù)塊的信息匹配的目標(biāo)數(shù)據(jù)塊,所述目標(biāo)數(shù)據(jù) 塊包括標(biāo)識信息W及第一數(shù)據(jù)信息,所述標(biāo)識信息包括校驗屬性信息;
[0044] 數(shù)據(jù)發(fā)送模塊,適于將所述校驗屬性信息W及所述第一數(shù)據(jù)信息發(fā)送至所述客戶 端。
[0045] 可選地,所述第一數(shù)據(jù)信息包括分片數(shù)據(jù)chunk W及對應(yīng)的校驗和數(shù)據(jù) checksum,其中,所述分片數(shù)據(jù)chunk W及所述校驗和數(shù)據(jù)checksum存儲在磁盤的同一個 存儲介質(zhì)中。
[0046] 可選地,數(shù)據(jù)發(fā)送模塊包括:
[0047] 屬性信息讀取子模塊,適于從所述目標(biāo)數(shù)據(jù)塊的標(biāo)識信息中讀取所述校驗屬性信 息發(fā)送至所述客戶端;
[0048] 數(shù)據(jù)讀取子模塊,適于從所述存儲介質(zhì)中讀取預(yù)設(shè)大小的分片數(shù)據(jù)chunk W及對 應(yīng)的校驗和數(shù)據(jù)checksum發(fā)送至所述客戶端。
[0049] 可選地,所述目標(biāo)數(shù)據(jù)塊的信息包括目標(biāo)數(shù)據(jù)塊ID,目標(biāo)數(shù)據(jù)塊的時間戳 GenerationStamp,所述定位模塊還適于:
[0050] 依據(jù)所述目標(biāo)數(shù)據(jù)塊ID W及所述目標(biāo)數(shù)據(jù)塊的時間戳GenerationStamp,遍歷磁 盤中存儲的數(shù)據(jù)塊,所述數(shù)據(jù)塊包括數(shù)據(jù)塊ID W及數(shù)據(jù)塊時間戳;
[0051] 查找所述數(shù)據(jù)塊ID與所述目標(biāo)數(shù)據(jù)塊ID相同,W及所述數(shù)據(jù)塊時間戳與所述目 標(biāo)數(shù)據(jù)塊的時間戳GenerationStamp相同的數(shù)據(jù)塊作為目標(biāo)數(shù)據(jù)塊。
[0052] 可選地,所述校驗屬性信息包括校驗和版本Inlinechecksumversion,校驗和類型 checksumtype, W及每個校驗和字節(jié)數(shù) bytesPerOiecksum。
[0053] 可選地,所述目標(biāo)數(shù)據(jù)塊的信息包括目標(biāo)數(shù)據(jù)塊的塊內(nèi)偏移量startOffset W及 目標(biāo)數(shù)據(jù)塊的長度,所述預(yù)設(shè)大小為第一數(shù)據(jù)包packet的大小,所述數(shù)據(jù)讀取模塊還適 于:
[0054] 創(chuàng)建第一數(shù)據(jù)包packet ;
[00巧]依據(jù)所述目標(biāo)數(shù)據(jù)塊的塊內(nèi)偏移量startOffset計算起始位置;
[0056] 從所述起始位置開始,在所述存儲介質(zhì)中依次讀取每個分片數(shù)據(jù)chunk W及與所 述分片數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum到所述第一數(shù)據(jù)包packet中,直到填滿所 述第一數(shù)據(jù)包packet ;
[0057] 將所述第一數(shù)據(jù)包packet發(fā)送至客戶端中。
[0058] 可選地,所述校驗和數(shù)據(jù)checksum在所述存儲介質(zhì)中的位置位于對應(yīng)的分片數(shù) 據(jù)chunk的存儲位置之后,位于所述對應(yīng)的分片數(shù)據(jù)chunk的下一個分片數(shù)據(jù)chunk的存 儲位置之前。
[0059] 可選地,所述節(jié)點服務(wù)器還包括:
[0060] 連接建立模塊,適于依據(jù)所述數(shù)據(jù)訪問請求建立與所述客戶端的socket連接。
[0061] 根據(jù)本發(fā)明的另一方面,提供了一種節(jié)點服務(wù)器,所述節(jié)點服務(wù)器包括:
[0062] 數(shù)據(jù)接收模塊,適于接收客戶端發(fā)送的第二數(shù)據(jù)包packet,所述第二數(shù)據(jù)包 packet中包括目標(biāo)數(shù)據(jù)塊ID、校驗屬性信息W及第二數(shù)據(jù)信息;
[0063] 數(shù)據(jù)塊定位模塊,適于依據(jù)所述目標(biāo)數(shù)據(jù)塊ID定位對應(yīng)的目標(biāo)數(shù)據(jù)塊;
[0064] 標(biāo)識信息生成模塊,適于在所述目標(biāo)數(shù)據(jù)塊ID中添加所述校驗屬性信息,生成所 述目標(biāo)數(shù)據(jù)塊的標(biāo)識信息;
[0065] 寫入模塊,適于將所述第二數(shù)據(jù)信息寫入所述目標(biāo)數(shù)據(jù)塊中。
[0066] 可選地,所述第二數(shù)據(jù)信息包括多個分片數(shù)據(jù)chunk, W及分別與所述多個分片數(shù) 據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum,所述寫入模塊還適于:
[0067] 將所述分片數(shù)據(jù)chunk W及與所述分片數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum 寫入所述目標(biāo)數(shù)據(jù)塊ID對應(yīng)的目標(biāo)數(shù)據(jù)塊中,其中,所述分片數(shù)據(jù)chunk W及與所述分片 數(shù)據(jù)chunk對應(yīng)的校驗和數(shù)據(jù)checksum存儲在磁盤的同一存儲介質(zhì)中。
[0068] 可選地,所述校驗屬性信息包括校驗和版本Inlinechecksumversion,校驗和類型 checksumtype, W及每個校驗和字節(jié)數(shù) bytesPerOiecksum。
[0069] 可選地,所述節(jié)點服務(wù)器還包括:
[0070] 數(shù)據(jù)傳遞模塊,適于當(dāng)前數(shù)據(jù)節(jié)點服務(wù)器將所述第二數(shù)據(jù)包packet傳遞至預(yù)先 生成的節(jié)點隊列中的下一數(shù)據(jù)節(jié)點服務(wù)器中。
[0071] 可選地,所述節(jié)點服務(wù)器還包括:
[0072] 響應(yīng)信息生成模塊,適于生成響應(yīng)信息,所述響應(yīng)信息為告知所述客戶端當(dāng)前第 二數(shù)據(jù)包packet處理完成的信息;
[0073] 響應(yīng)信息發(fā)送模塊,適于將所述響應(yīng)信息返回所述客戶端。
[0074] 在本發(fā)明實