解碼方法和裝置及云存儲(chǔ)方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及云存儲(chǔ)技術(shù)領(lǐng)域,具體涉及一種解碼方法和裝置及云存儲(chǔ)方法和系統(tǒng)。
【背景技術(shù)】
[0002]云存儲(chǔ)是指通過集群應(yīng)用、網(wǎng)絡(luò)技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類型的存儲(chǔ)設(shè)備通過應(yīng)用軟件集合起來協(xié)同工作,共同對(duì)外提供數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)訪問功能的一個(gè)系統(tǒng)。在云存儲(chǔ)系統(tǒng)中,文件一般被分片保存在多個(gè)云存儲(chǔ)服務(wù)器中。此外,在數(shù)據(jù)通訊時(shí),需要通訊的數(shù)據(jù)也會(huì)被分為多個(gè)分片,逐片傳送給對(duì)方。
[0003]在數(shù)據(jù)存儲(chǔ)和通訊時(shí),為了解決可靠性的問題,可采用糾刪碼(Erasure Codes,簡(jiǎn)稱為EC)技術(shù),將文件進(jìn)行編碼,分為若干個(gè)原始數(shù)據(jù)分片和校驗(yàn)分片,分別進(jìn)行存儲(chǔ)或通訊。里德-所羅門(Reed-Solomon,簡(jiǎn)稱為RS)糾刪碼是一種常用的EC技術(shù),它將原始文件編碼后,分為大小相同的m個(gè)原始數(shù)據(jù)分片和η個(gè)校驗(yàn)分片,分別進(jìn)行存儲(chǔ)或通訊。對(duì)于文件存儲(chǔ)或者通訊接收方,只要獲得其中任意m個(gè)分片,即可通過解碼方式恢復(fù)原文件或者數(shù)據(jù),因此可以抗η個(gè)分片損壞或者丟失,大大提高了系統(tǒng)的可靠性。對(duì)于計(jì)算機(jī)文件存儲(chǔ),糾刪碼系統(tǒng)的存儲(chǔ)空間利用率為m/(m+n),遠(yuǎn)遠(yuǎn)高于副本存儲(chǔ)方式,因此,RS糾刪碼通過使用計(jì)算能力換取存儲(chǔ)能力,顯著降低了存儲(chǔ)成本和運(yùn)維成本。
[0004]1960年,里德(1.S.Reed)和所羅門(G.Solomon)提出了一種構(gòu)造糾刪碼的方法,使用該方法的糾刪碼被稱作Reed-Solomon碼,簡(jiǎn)稱RS碼?;赗S編碼技術(shù)構(gòu)造的糾刪碼則稱作RS糾刪碼。一個(gè)(n,k)糾刪碼是把k個(gè)源數(shù)據(jù)編碼為n (n>k)個(gè)數(shù)據(jù),使得用這η個(gè)數(shù)據(jù)中任意k個(gè)數(shù)據(jù)均可重構(gòu)原來的k個(gè)源數(shù)據(jù)。采用m個(gè)分片和η個(gè)校驗(yàn)分片的糾刪碼體制就是(m+n,m)糾刪碼。
[0005]RS糾刪碼的實(shí)現(xiàn)技術(shù)關(guān)鍵是尋找一個(gè)生成矩陣G,該矩陣中任意k列均線性無關(guān)。RS編碼技術(shù)中,生成矩陣可以是范德蒙矩陣和柯西矩陣。使用范德蒙矩陣生成的編碼叫范德蒙碼(Vandermond Code),使用柯西矩陣生成的編碼叫柯西碼(Cauchy Code)。其編碼原理是:原始數(shù)據(jù)D[D1,D2,..Dm]乘以生成矩陣G,產(chǎn)生m個(gè)原始數(shù)據(jù)D [Dl,D2,..Dm]和η個(gè)校驗(yàn)數(shù)據(jù)Ρ[Ρ1,Ρ2,..., Pn] ο解碼原理是:在m+n個(gè)原始數(shù)據(jù)和校驗(yàn)數(shù)據(jù)中任意獲得m個(gè)數(shù)據(jù),組成待解碼數(shù)據(jù)D’,例如[Dl,一Di,Pl..Pj]。在生成矩陣中去掉η個(gè)未出現(xiàn)數(shù)據(jù)對(duì)應(yīng)的那一列,組成一個(gè)新的生成矩陣G,然后計(jì)算G的逆矩陣G’,最后D’*G’ =D0為了使矩陣運(yùn)算的結(jié)果保持在實(shí)數(shù)域,運(yùn)算改為限定在伽羅瓦(Galois)域G(2~8)或者G(2~16)進(jìn)行。具體運(yùn)算流程和特性,早已被研究透徹,在相關(guān)數(shù)學(xué)書籍和刊物上可以查到,因此在此不再贅述。
[0006]但是,無論范德蒙矩陣和柯西矩陣的RS糾刪碼體制的系統(tǒng),在解碼上都有一個(gè)共同的缺點(diǎn),即通過D’ *G’ = D才能計(jì)算出D,因此只有收齊任意的m個(gè)分片后,如果其中含有校驗(yàn)分片,對(duì)應(yīng)的解碼生成矩陣G’和待解碼數(shù)據(jù)D’才能確定,系統(tǒng)才能開始解碼。在系統(tǒng)收到第m個(gè)分片前,即使知道該分片的編號(hào),能夠獲得對(duì)應(yīng)解碼生成矩陣G’,但由于待解碼數(shù)據(jù)D’ = [Dl, -Di,Pl..Pj],其中至少丟掉了一個(gè)分片數(shù)據(jù),因此不能確定D’。只有獲得第m個(gè)分片后,D’才能最終確定,系統(tǒng)才能開始解碼,因此系統(tǒng)解碼性能受制于任意m個(gè)分片中最慢的那個(gè)。在現(xiàn)有系統(tǒng)中,網(wǎng)絡(luò)傳輸模塊和解碼計(jì)算模塊是串行的,在收齊第m個(gè)分片前,網(wǎng)絡(luò)傳輸模塊在工作,而解碼計(jì)算模塊空閑;開始解碼后,解碼計(jì)算模塊工作而網(wǎng)絡(luò)傳輸模塊空閑,降低了系統(tǒng)性能。
[0007]另一個(gè)缺點(diǎn)是,根據(jù)RS解碼算法,解碼計(jì)算量為O (η),即和校驗(yàn)分片數(shù)量η成正t匕。因此,待解碼數(shù)據(jù)中含有的原始分片越多,校驗(yàn)分片越少,解碼的性能就越好??紤]基于公網(wǎng)的P2P存儲(chǔ)模型,對(duì)于m+n分片配置,客戶端已經(jīng)收到m_k個(gè)原始分片和k個(gè)校驗(yàn)分片,開始進(jìn)行解碼。在解碼完成前,又收到t個(gè)原始分片。顯然,t = k時(shí)表示客戶端收到了全部原始分片,可以中止解碼。但t〈k時(shí),還是需要解碼的,按照m-k+t個(gè)原始分片和k-t個(gè)校驗(yàn)分片解碼,比以前m-k原始分片+k校驗(yàn)分片的配置更好。但如果終止編碼重新開始,則以前的計(jì)算量和時(shí)間都浪費(fèi)掉了。由于RS解碼是一種相對(duì)耗時(shí)的計(jì)算,在解碼時(shí)使用較少的校驗(yàn)分片能減少計(jì)算量,很好的提高性能。
[0008]因此,現(xiàn)有技術(shù)基于RS糾刪碼的解碼方法中,存在受制于獲得的m個(gè)任意節(jié)點(diǎn)中最大延遲節(jié)點(diǎn)的問題,以及一旦解碼開始后,又獲得新的數(shù)據(jù)分片后,系統(tǒng)無法利用從而降低性能的問題。此外,現(xiàn)有的解碼方式,對(duì)輸入數(shù)據(jù)的順序有特定要求,一般分為兩部分,前一部分是原數(shù)據(jù)集合,后一部分是校驗(yàn)數(shù)據(jù)的集合,解碼方法不靈活。
【發(fā)明內(nèi)容】
[0009]本發(fā)明提供一種解碼方法和裝置及云存儲(chǔ)方法和系統(tǒng),其可以解決現(xiàn)有技術(shù)中解碼操作和數(shù)據(jù)獲取工作串行進(jìn)行,從而降低解碼效率的問題。
[0010]為實(shí)現(xiàn)上述目的,一方面,本發(fā)明的實(shí)施例中提供了一種解碼方法,包括步驟:
[0011]讀取輸入緩沖區(qū)的待解碼數(shù)據(jù),將讀取到的包括原數(shù)據(jù)分片和校驗(yàn)數(shù)據(jù)分片的待解碼數(shù)據(jù)移送至輸出模塊,并在輸出模塊中對(duì)待解碼數(shù)據(jù)進(jìn)行處理;
[0012]根據(jù)處理后輸出模塊中原數(shù)據(jù)區(qū)和待解碼區(qū)域中數(shù)據(jù)分片的數(shù)量,選取相應(yīng)的數(shù)據(jù)分片進(jìn)行解碼操作,將解碼操作結(jié)果組合成全部原數(shù)據(jù)。
[0013]優(yōu)選地,所述方法中,所述在輸出模塊中對(duì)待解碼數(shù)據(jù)進(jìn)行處理具體包括:
[0014]若讀取到校驗(yàn)數(shù)據(jù)分片,則將所述校驗(yàn)數(shù)據(jù)分片與輸出模塊的待解碼區(qū)域的相應(yīng)位置處的已有數(shù)據(jù)進(jìn)行異或操作,并將異或結(jié)果作為該位置處新的已有數(shù)據(jù);
[0015]若讀取到原數(shù)據(jù)分片,則將所述原數(shù)據(jù)分片移動(dòng)到輸出模塊的原數(shù)據(jù)區(qū)的相應(yīng)位置處,同時(shí)將所述原數(shù)據(jù)分片分別乘以生成矩陣對(duì)應(yīng)行的全部元素,將各結(jié)果分別與輸出模塊的待解碼區(qū)域的相應(yīng)位置處的已有數(shù)據(jù)進(jìn)行異或操作,并將異或結(jié)果作為該位置處新的已有數(shù)據(jù)。
[0016]優(yōu)選地,所述方法中,所述根據(jù)處理后輸出模塊中原數(shù)據(jù)區(qū)和待解碼區(qū)域中數(shù)據(jù)分片的數(shù)量,選取相應(yīng)的數(shù)據(jù)分片進(jìn)行解碼操作具體包括:
[0017]若輸出模塊中原數(shù)據(jù)區(qū)和待解碼區(qū)域中數(shù)據(jù)分片的數(shù)量之和不小于編碼時(shí)的原數(shù)據(jù)分片的總數(shù)量m,則將原數(shù)據(jù)區(qū)中可獲得的全部m-k個(gè)原數(shù)據(jù)分片和從待解碼區(qū)域中選用的k個(gè)校驗(yàn)數(shù)據(jù)分片進(jìn)行解碼。
[0018]優(yōu)選地,所述進(jìn)行解碼具體包括:
[0019]根據(jù)丟失的k個(gè)原數(shù)據(jù)分片的位置、和選用待解碼區(qū)域的k個(gè)數(shù)據(jù)分片的位置,從生成矩陣中選取對(duì)應(yīng)的元素構(gòu)成選定矩陣,求出選定矩陣的逆矩陣作為解碼矩陣;
[0020]同時(shí)將從待解碼區(qū)域中選用的k個(gè)數(shù)據(jù)分片組成待解碼矩陣;
[0021]將所述待解碼矩陣與所述解碼矩陣相乘,得到所述丟失的k個(gè)原數(shù)據(jù)分片。
[0022]另一方面,本發(fā)明的實(shí)施例中還同時(shí)提供一種云存儲(chǔ)方法,包括步驟:
[0023]將原數(shù)據(jù)進(jìn)行編碼,分為至少一個(gè)原數(shù)據(jù)分片和至少一個(gè)校驗(yàn)數(shù)據(jù)分片,分別進(jìn)行存儲(chǔ)和/或通訊;
[0024]在用戶要獲取所述原數(shù)據(jù)時(shí),執(zhí)行如上所述的解碼方法。
[0025]再一方面,本發(fā)明的實(shí)施例中還提供了一種解碼裝置,包括:
[0026]數(shù)據(jù)獲取模塊,用于讀取輸入緩沖區(qū)的待解碼數(shù)據(jù),將讀取到的包括原數(shù)據(jù)分片和校驗(yàn)數(shù)據(jù)分片的待解碼數(shù)據(jù)移送至輸出模塊,并在輸出模塊中對(duì)待解碼數(shù)據(jù)進(jìn)行處理;
[0027]數(shù)據(jù)解碼模塊,用于根據(jù)處理后輸出模塊中原數(shù)據(jù)區(qū)和待解碼區(qū)域中數(shù)據(jù)分片的數(shù)量,選取相應(yīng)的數(shù)據(jù)分片進(jìn)行解碼操作,將解碼操作結(jié)果組合成全部原數(shù)據(jù)。
[0028]優(yōu)選地,所述數(shù)據(jù)獲取模塊具體包括:
[0029]輸入緩沖區(qū)模塊,用于接收并存放包括原數(shù)據(jù)分片和校驗(yàn)數(shù)據(jù)分片的待解碼數(shù)據(jù);
[0030]判斷和讀取模塊,用于讀取輸入緩沖區(qū)模塊內(nèi)的待解碼數(shù)據(jù),若讀取到校驗(yàn)數(shù)據(jù)分片,則將所述校驗(yàn)數(shù)據(jù)分片與輸出模塊的待解碼區(qū)域的相應(yīng)位置處的已有數(shù)據(jù)進(jìn)行異或操作,并將異或結(jié)果作為該位置處新的已有數(shù)據(jù);若讀取到原數(shù)