羅繼堯
信息系統(tǒng)在運行過程中,部分數據的損壞或失效將影響整體運維能力。為此,應當盡可能地保障全域節(jié)點數據的可用性,當主節(jié)點無法自行修復其損壞或失效的數據時,應當能夠從其他節(jié)點獲取數據進行修復。提高數據可用性和可靠性的一種有效方法是采用數據容錯技術。數據容錯是指通過對原始數據進行冗余編碼以使得部分數據損壞或失效時能夠恢復出原始數據。對數據進行冗余編碼會帶來一定的計算和存儲開銷,因此,在保證數據可用性的同時,要均衡考慮計算資源和存儲資源的消耗,盡可能地提高信息系統(tǒng)的性能。
本文提出了一種信息系統(tǒng)數據可用性恢復方法。首先將數據劃分為數據塊,并且在數據塊級別對數據進行編碼,以使得當只有部分數據損壞時能夠提高修復效率。此外,本文還采用兩級編碼結構。在節(jié)點間采用網絡編碼作為外部編碼,在主節(jié)點內采用糾刪碼作為內部編碼。采用兩級編碼結構的好處在于,當主節(jié)點內部出現少量數據損壞或失效時,可以利用糾刪碼的冗余信息修復出原始數據,無需從其他節(jié)點上獲取數據,從而節(jié)省了網絡通信開銷。而當主節(jié)點上的數據整體損壞或失效時,可以從其他節(jié)點上獲取數據,通過網絡編碼修復出原始數據,并且節(jié)省通信開銷。當冗余編碼不能修復數據時,則采用備份恢復的方法修復出原始數據。為了使主節(jié)點能夠主動發(fā)現其他節(jié)點上的數據損壞情況,本文利用可聚合的廣播簽名加密算法(aggregated signature-based broadcast encryption)[1]對編碼數據塊進行簽名,并對數據的完整性進行定期的輪詢檢查。
常用的數據容錯方法有數據備份、糾刪碼和網絡編碼[2]。本節(jié)將對數據備份、糾刪碼和網絡編碼三種容錯方法進行簡單的介紹和比較。
數據備份是指為原始數據文件創(chuàng)建多個相同的副本,并將每一個副本分別存儲在分布式文件系統(tǒng)的每一個存儲節(jié)點上。當某個節(jié)點上的數據有損壞或整個節(jié)點失效時,通過任一其他有效節(jié)點上的副本就能恢復出原始數據。數據備份方法簡單直觀、穩(wěn)定性強,易于實現和部署。但是,由于需要為每個數據文件都創(chuàng)建若干個相同大小的副本,數據備份的存儲開銷很大。圖1給出了數據備份的一個示例圖。
圖1 數據備份示例圖
糾刪碼的基本思想是將數據分割成數據子塊,并將冗余信息添加到這些數據子塊中,原始數據可以從編碼后數據子塊的子集中恢復出來。恢復原始數據時所需要的子塊數量取決于編碼時加入到每個子塊中的冗余信息量,冗余量越大,恢復原始數據時所需要的子塊數越少。在分布式存儲系統(tǒng)中,可用參數(m,n,k)來表征一個糾刪碼,即原始的m個數據塊編碼后分布在n個存儲節(jié)點中,每個節(jié)點只需存儲m k個編碼塊,由其中的任意k個節(jié)點上的數據就能恢復出數據。
相對于數據備份方法,糾刪碼在數據恢復過程中消耗的網絡帶寬要更多。在RS碼中,為了生存一個編碼塊通常需要重構所有的原始數據塊,也就是說,在有單個節(jié)點失效時,為了生成m k個編碼塊,需要獲取到m個原始塊。圖2給出了一個參數為(2,4,2)的糾刪碼示例圖。原始數據塊mi首先被分為兩個等大小的中間塊,這兩個中間塊再被編碼成為4個編碼塊Ci,j,l,并被存儲在4個信息系統(tǒng)中,每個計算系統(tǒng)中存儲一個編碼塊,并且編碼塊Ci,j,l的大小與中間塊的大小相同。
圖2 糾刪碼示例圖
網絡編碼將傳統(tǒng)的存儲轉發(fā)路由方法與編碼技術融合在一起,由路由節(jié)點將接收到的多個數據包進行編碼為一個數據包,并進行路由轉發(fā),從而增加單次路由過程中所轉發(fā)的信息量,能夠從整體上提高網絡的性能。
文獻[2]將網絡編碼稱之為再生碼(regenerating codes),并將其應用于分布式存儲系統(tǒng)中。再生碼的生成矩陣是由經過精心選取的特殊編碼系數構造的,需要修復原始數據時,節(jié)點對存儲其上的多個數據塊進行組合,以降低需要傳輸的數據量,節(jié)省網絡帶寬。再生碼為原始數據提供了精確修復的功能,但對于冗余數據塊,只能提供相同的容錯能力,不能做到原始冗余信息與修復后的冗余信息保持一致。
本文所用到的網絡編碼采用的是代數構造法[3],其基本思想是對于參數為(n,k)的網絡編碼,首先將給定的數據文件等分為k(n-k)個中間塊,然后再對這些中間塊進行線性組合得到編碼塊。編碼塊被分布存儲在n>k個計算系統(tǒng)中,從n個計算系統(tǒng)中的任意k個計算系統(tǒng)中的編碼塊就能夠解碼恢復出原始數據。故其可以容忍n-k個計算系統(tǒng)中的數據失效。圖3給出了一個參數為(4,2)的網絡編碼示例圖。原始數據塊mi首先被等分為4個中間塊,這種中間塊進一步被編碼成8個編碼塊Pi,j,l,并被存儲在4個計算系統(tǒng)中,每個計算系統(tǒng)存儲2個編碼塊。編碼塊Pi,j,l的大小與中間塊的大小相同。
圖3 網絡編碼示例圖
在數據備份、糾刪碼和網絡編碼中,數據備份的存儲開銷很大,而糾刪碼在修復數據時的通信開銷比數據備份要高。與數據備份和糾刪碼相比較,網絡編碼可以在存儲開銷和通信開銷方面做一個均衡。信息系統(tǒng)主節(jié)點與其他節(jié)點之間是通過無線網絡通信的,網絡帶寬就成了信息系統(tǒng)性能的關鍵因素之一。因此,本文定義了一個修復通信因子(Repair Traffic Factor,RTF)來衡量修復數據時的通信開銷。RTF被定義為從其他存活服務器上獲取的數據量與新生成的編碼塊量的比值。在圖1、圖2和圖3中,假定原始數據塊mi的大小都為1MB,并且mi的每個子塊都是等大小的,那么數據備份、糾刪碼和網絡編碼的存儲開銷及RTF分別為(4MB,1)、(2MB,2)和(2MB,1.5)??梢钥吹较鄬τ跀祿浞荩W絡編碼可以節(jié)省50%的存儲開銷;相對于糾刪碼,在相同的存儲開銷下,網絡編碼可以節(jié)省25%的修復通信開銷。
圖4是本文的總體框架圖。主節(jié)點首先對原始數據進行兩級編碼,即在域內采用糾刪碼,在節(jié)點間采用網絡編碼,再將編碼數據發(fā)布給其他節(jié)點,主節(jié)點對原始數據在本地作備份。主節(jié)點可與驗證節(jié)點進行協商,將數據完整性驗證任務委托給驗證節(jié)點進行。由驗證節(jié)點定期地向其他節(jié)點1、節(jié)點2和節(jié)點s發(fā)起數據完整性驗證詢問請求,并驗證其他各個節(jié)點返回的示證響應,再將驗證結果報告給主節(jié)點。主節(jié)點也可以自己對數據的完整性發(fā)起驗證。當驗證發(fā)現數據被損壞,但損壞的比例在預期的范圍內時,由主節(jié)點或各個節(jié)點對數據進行修復,以保證數據的可用性。如果只是單節(jié)點內部的少量數據損壞了,則由該節(jié)點就地修復數據。當發(fā)現整個節(jié)點上的數據失效或是單點無法修復數據時,則由主節(jié)點從其他節(jié)點上獲取完好數據并修復損壞數據,并將修復后的數據再次發(fā)布給該節(jié)點。
圖4 總體框架圖
本文采用的網絡編碼方式為文獻[4~5]中所采用的功能最小存儲再生碼(Functional Minimum Storage Regenerating,FMSR),FMSR屬于最大距離可分碼(Maximum Distance Separable,MDS)的一種[6]。一個MDS碼可由參數 (s,k)確定,其中k<s,表示編碼后的數據分布在s個節(jié)點計算系統(tǒng)中,并且從其中任意k個計算系統(tǒng)中能夠恢復出原始數據。FMSR碼將一個大小為 ||F的文件F編碼成s(s-k)個數據塊,每個數據塊大小為|F|/k(s-k)。
1)節(jié)點間的編碼。令F=(m1,m2,…,mn)為原始數據,EM=[αl,j]為編碼矩陣,編碼因子αl,j是伽羅瓦域GF(28)中的元素,并且 l=1,…,s(s-k),j=1,…,k(s-k)。稱編碼矩陣EM中的每一行為一個編碼因子向量(Encoding Coefficient Vector,ECV),其包含了k(s-k)個元素。用ECVi來表示EM 的第i個行向量。對于每個數據塊mi,首先將其分為k(s-k)個等大小的中間數據塊,然后再將這k(s-k)個數據塊編碼成為s(s-k)個編碼塊,并用符號Pi,l來表示這s(s-k)個編碼塊。Pi,l是將ECVi與原始數據塊mi的中間數據塊進行標量相乘而得到的,也即
所有的運算都是在域GF(28)中進行的。每一個Pi,l都是k(s-k)個中間數據塊的一個線性組合。編碼后的數據塊Pi,l被存儲在s個節(jié)點計算系統(tǒng)中,每個計算系統(tǒng)中存儲s-k個數據塊。進一 步 的 ,本 文 用 符 號 Pi,t,j(1≤i≤n,1≤t≤s,1≤j≤s-k)來表示一個計算系統(tǒng)中的數據塊,也即原始數據塊mi的在第t個計算系統(tǒng)中的第 j個編碼塊。編碼矩陣EM的構造方法有很多種,只要其滿足MDS碼的特性和修復MDS碼特性。
2)節(jié)點內編碼。為了節(jié)省通信開銷,本文用參數為(s′,k′)的糾刪碼作為內部編碼,將每一個Pi,t,j編碼成一個新的編碼塊P'i,t,j,q(1 ≤ q ≤ s′)。 (s′,k′)糾刪碼將k′個數據片段編碼成s′個片段,以達到能夠糾正個錯誤或是 s′-k′個抹除。當節(jié)點內部只有一小段數據被損壞時,可以在本地修復出原始編碼數據,而不需要從其他節(jié)點上獲取數據。
圖5給出了一個兩級編碼的示例圖,節(jié)點間采用的是一個(4,2)的FMSR碼,節(jié)點內部采用的是一個(5,3)的R-S碼。
圖5 兩級編碼示例圖
通過上述兩級編碼結構對數據進行編碼后,主節(jié)點還需要為每個數據塊生成相應的標簽信息,并與驗證節(jié)點協商,發(fā)起數據完整性驗證[7~9],以主動發(fā)現各個節(jié)點上的數據是否完整。
假定G和GT是兩個具有相同素數階 p的乘法循環(huán)群,e為一個可計算的雙線性映射e:G×G→GT,也即對于G任意的生成元 g有e(g,g)≠1,并 且 對 于 所 有 的 u,v∈?p,有e(gu,gv)=e(g,g)uv。令 h(?):{0,1}*→ G 為一個安全哈希函數,將字符串與G中的元素一一映射。數據驗證的算法和過程如下。
1)密鑰生成算法KeyGen:主節(jié)點隨機選擇兩個 元 素 r∈Z*p,X∈G{1},并計 算 R=g-r,A=e(X,g)。公開參數為(g,h,p,G,GT,e),公鑰為 pk=(R,A),私鑰為sk=(r,X)。
2)標簽生成算法TagGen:給定一個數據文件F,主節(jié)點為其生成一個標識符 fid,并將其等分為 n個數據塊,也即 F=(m1,m2,…,mn),并且mi∈。對于每一個數據塊mi,主節(jié)點通過參數為(s,k)的FMSR碼和參數為 (s′,k′)的糾刪碼將其編碼為s′s(s-k)個編碼塊,將mi的編碼數據塊表示為 Pi,l,q(1≤i≤n,1≤l≤s(s-k),1≤q≤s′)。主節(jié)點將F的所有ns′s(s-k)個編碼塊存儲在s個節(jié)點的計算系統(tǒng)中,每個計算系統(tǒng)存儲ns′(s-k)個編碼塊。
對于存儲在每個節(jié)點計算系統(tǒng)中t(1≤t≤s)中的mi的s′(s-k)個編碼塊,主節(jié)點計算其哈希值,也 即 Hi,t=h(fid||Pen),,即 Pen為 mi的 s′(s-k)個編碼塊的串聯值。最后,主節(jié)點為mi在每個節(jié)點t上編碼塊計算標簽值 σi,t=(Hi,t)r。用φt={σi,t}(1≤i≤n,1≤t≤s)表示一個節(jié)點上所有數據標簽的集合。主節(jié)點將編碼塊以及標簽信息發(fā)送給對應的節(jié)點,將 fid發(fā)送給驗證節(jié)點,在本地保存 fid以及編碼矩陣EM。
3)質詢生成算法ChalGen:在每輪輪詢中,驗證節(jié)點首先隨機選取一個元素t1∈Z*p,并計算c1=。然后驗證節(jié)點從集合{1,…,n}中隨機選取c個元素 I={s1,…,sc}。不失一般性,假定s1≤…≤sc(可以通過一個偽隨機排列算法實現)。對于 I中的每個si,驗證節(jié)點選取一個隨機數vi∈。驗證節(jié)點將質詢chal={(i,vi)i∈I,c1}發(fā)送給其他每個節(jié)點,每個節(jié)點根據該質詢chal返回Hi,t(i∈I,1≤t≤s)給TPA。接到其他每個節(jié)點返回的Hi,t后,驗證節(jié)點選取一個隨機元素m∈GT,計算c2=,ωt=m?e(∏i∈I,c2),將 ωt返回給其他每個節(jié)點。
4)示證生成算法ProofGen:每個節(jié)點都運行該算法生成各自的示證,以證明存儲在本地節(jié)點的數據是完整的。每個節(jié)點都獨立地進行式(1)所示的運算,并將m*t和μt作為響應返回給驗證節(jié)點。
5)示證驗證算法VerifyProof:驗證節(jié)點運行該算法以驗證其他每個節(jié)點返回的示證的有效性。對于 t=1,…,s,驗證節(jié)點首先根據 μt計算Bt=e(X,,然后驗證等式(2)是否成立。如果對于所有的t=1,…,s,上述關系式都成立,Verify-Proof輸出1,表示所抽樣的數據塊是完整的。否則,VerifyProof輸出0,表示有數據塊損壞。驗證節(jié)點可以通過類似二分查找的方法定位到有數據塊損壞的節(jié)點編號以及數據索引號,并將結果返回給主節(jié)點,由主節(jié)點決定如何對受損數據進行修復。
通過周期性的抽樣檢查,當有數據被損壞時,驗證節(jié)點能夠以高置信率發(fā)現數據被損壞了;并且可以通過類似二分查找的方法定位到有數據塊損壞的節(jié)點編號以及數據索引號,并將結果返回給主節(jié)點[10~11]。
當一個節(jié)點上的數據仍然可用,但是有小部分數據片段損壞時,也即對于編碼塊(1≤i≤n,1≤t≤s,1≤j≤s-k,1≤q≤s′),發(fā)生錯誤的片段數少于或是被抹除了的片段數目少于s′-k′,那么節(jié)點可以通過糾刪碼的冗余信息修復這些錯誤或抹除,不需要消耗通信帶寬從其他節(jié)點上獲取數據,也不需要重新計算數據塊的標簽值。
本文重點討論當整個節(jié)點的計算系統(tǒng)中的數據失效或是單節(jié)點不能修復損壞數據的情況[12~15]。網絡編碼在每次修復損壞數據時,都會生成不同于損壞編碼塊的新編碼塊,因此,需要確保在多次修復之后MDS性質(即原始數據能由n個編碼塊中的任意k個解碼出來)仍然滿足。假定第r-1(r≥1)次修復是成功的,則對于第r次單節(jié)點失效的修復過程如下所示:
步驟1:假定數據塊mi在節(jié)點t上的編碼塊被 損 壞 了 。主節(jié)點從本地存儲的編碼矩陣EM中隨機選取s-1個ECV,選取方法為排除從(t-1)(s-k)+1到(t-1)(s-k)+s-k的 s-k個 ECV ,還 剩 下(s-1)(s-k)個 ECV,其中t=1,…,s。對于每一個 j=1,…,s并 且 j≠t,從 (j-1)(s-k)+1到(j-1)(s-k)+s-k中隨機選取一個ECV,則一共選取了s-1個ECV。編碼矩陣EM中的每一個ECV與網絡編碼后的一個編碼塊相對應。將這s-1個ECV表示為EC,EC,…,EC。
步驟2:主節(jié)點生成一個修復矩陣RM=[γi,j],其中 i=1,…,s-k,j=1,…,s-1,每個元素 γi,j都是隨機從伽羅瓦域GF(28)中選取的。
步驟3:主節(jié)點將步驟2中生成的修復矩陣RM與步驟1中的選取的ECV相乘構造s-k個新的 ECV′,,…,s-k 。然后按以下方法生成一個的編碼矩陣EM′。當節(jié)點t(1≤t≤s)上的數據完好時,EM′的s-k個新行向量為EC,其中 (t-1)(s-k)+1≤j≤(t-1)(s-k)+s-k,并且每個ECVi從原始編碼矩陣EM 中選取的。當節(jié)點t失效時,EM'的s-k個新行向量為ECV'j,其中1≤j≤s-k。
步驟4:檢測新編碼矩陣的MDS特性和修復MDS特性[5]是否成立,只要其中一個特性不成立就跳轉到步驟1重新執(zhí)行以上步驟。
步驟5:用修復矩陣RM 乘以從s-1個完好節(jié)點上選取的s-1個數據塊得到一個新的編碼塊,這s-1個數據塊與步驟1中的選取的s-1個ECV是一一對應的。進一步的,對新生成的編碼塊用參數為(s′,k′)的糾刪碼編碼。新的編碼塊、對應的標簽值將被再次存儲到該節(jié)點上。
在本文的構造方法中,每個原始數據塊mi都是用相同的編碼矩陣EM編碼的,而在單節(jié)點失效修復時,將生成一個新的編碼矩陣EM′。這將導致用EM編碼的數據塊將不能由EM′解碼。但是,新編碼矩陣EM′包含有ECVi和ECV'i,因此,本文采用增量存儲的方式存儲編碼矩陣。在每輪單節(jié)點失效修復過程中,本文將失效節(jié)點編號、數據塊索引、ECVi的索引以及ECV'i記錄在一張表中,這樣通過原始存儲的編碼矩陣EM和ECV'i就能生成新的編碼矩陣EM′。
當有1<d≤k個節(jié)點上的數據失效時,可從任意s-k個完好節(jié)點上下載數據,解碼這些存活數據得到原始數據。然后,對這些原始數據再次編碼,并將對應的標簽值存儲到這些節(jié)點上。解碼過程如下所示:
主節(jié)點首先從s個節(jié)點中選取任意k個節(jié)點,并從這k個節(jié)點上獲取到k(s-k)個編碼塊,然后選取這k(s-k)個編碼塊對應的ECV,這些ECV可以構造一個k(s-k)×k(s-k)的方陣。如果MDS特性滿足,則根據定義,該方陣的逆矩陣存在。因此,主節(jié)點可以用該方陣的逆矩陣乘以編碼塊,從而得到k(s-k)個中間塊,進而合并中間塊得到原始塊。
當有d>k個節(jié)點上的數據失效時,糾刪碼和網絡編碼都不能修復出原始數據,這時只能通過主節(jié)點上的備份數據對各個節(jié)點上的數據進行修復。
為提高信息系統(tǒng)數據的可用性,本文在數據備份、糾刪碼和網絡編碼的基礎上,提出了一種節(jié)點間數據可用性恢復方法。本文首先在數據塊級別對數據進行編碼,以使得當只有部分數據損壞時能夠提高修復效率。此外,為了節(jié)省數據修復過程中的通信開銷,本文采用兩級編碼結構。在節(jié)點間采用網絡編碼作為外部編碼,在節(jié)點內采用糾刪碼作為內部編碼。本文重點討論了單節(jié)點數據整體損壞或失效時的數據修復過程。為了使主節(jié)點能夠主動發(fā)現其他節(jié)點上的數據損壞情況,本文利用可聚合的廣播簽名加密算法對編碼數據塊進行簽名,給出了數據的完整性檢查的詳細過程。
[1]Q Wu,Y Mu,W Susilo,et al.Asymmetric Group Key Agreement[C]//Proceedings of 28th Annual International Conference on Theory and Applications of Cryptography Techniques(EUROCRYPT'09),Berlin:Springer,2009:153-170.
[2]A G Dimakis,P B Godfrey,M Wainwright,et al.Network Coding for Distributed Storage Systems[C]//Proceedings of 26th Annual IEEE Conference on Computer Communications(INFOCOM'07).Los Alamitos,CA:IEEE Computer Society,2007:2000-2008.
[3]H C H Chen,PP CLee.Enabling Data Integrity Protection in Regenerating-Coding-Based Cloud Storage[C]//Proceedings of 31st International on Symposium Reliable Distributed Systems(SRDS'12),Los Alamitos,CA:IEEEComputer Society,2012:51-60.
[4]Y Hu,H CH Chen,PPCLee,et al.NCCloud:Applying Network Coding for the Storage Repair in a Cloud-of-Clouds[C]//Proceedings of 10th USENIX conference on File and Storage Technologies(FAST'12),Berkeley:USENIX,2012:265-273.
[5]QZheng,SXu.Fair and Dynamic Proofs of Retrievability[C]//Proceedings of First ACM Conference on Data and Application Security and Privacy(CODASPY'11).New York:ACM,2011:237-248.
[6]I SReed,G Solomon.Polynomial Codes over Certain Finite Fields[J].Journal of the Society for Industrial and Applied Mathematics,1960,8(2):300-304.
[7]QWang,CWang,JLi,et al.Enabling Public Verifiability and Data Dynamic for Storage Security in Cloud Computing[C]//Proceedings of 14th European Symposium on Research in Computer Security(ESORICS'09).Berlin,Springer-Verlag,2009:355-370.
[8]B Chen,R Curtmola,G Ateniese,et al.Remote Data Checking for Network Coding-Based Distributed Storage Systems[C]//Proceedings of 2010 ACM Workshop on Cloud Computing Security Workshop(CCSW'10),New York:ACM,2010:31-42.
[9]G Ateniese,R Burns,R Curtmola,et al.Provable Data Possession at Untrusted Stores[C]//Proceedings of 14th ACM Conference on Computer and Communications Security(CCS'07).New York:ACM,2007:598-609.
[10]C Wang,Q Wang,K Ren,et al.Privacy-Preserving Public Auditing for Data Storage Security in Cloud Computing[C]//Proceedings of 2010 IEEE International Conference on Computer Communication(INFOCOM'10),Los Alamitos,CA:IEEEComputer Society,2010:1-9.
[11]H Shacham,B Water.Compact Proofs of Retrievability[C]//Proceedings of 14th International Conference on the Theory and Application of Cryptology and Information Security(Asiacrypt'08).Berlin,Springer-Verlag,2008:90-107.
[12]K Bowers,A Juels,A Oprea.HAIL:a High-Availability and Integrity Layer for Cloud Storage[C]//Proceedings of the 16th ACM Conference on Computer and Communications Security(CCS'09).New York:ACM,2009:187-198.
[13]B Chen,R Curtmola,G Ateniese,et al.Remote Data Checking for Network Coding-Based Distributed Storage Systems[C]//Proceedings of 2010 ACM Workshop on Cloud Computing Security Workshop(CCSW'10),New York:ACM,2010:31-42.
[14]N Cao,S Yu,Z Yang,et al.LT Codes-Based Secure and Reliable Cloud Storage Service[C]//Proceedings of 31st Annual IEEE International Conference on Computer Communication(INFOCOM'12),Los Alamitos,CA:IEEEComputer Society,2012:693-701.
[15]D Cash,A Kupcu,D Wichs.Dynamic Proofs of Retrievability via Oblivious RAM[C]//Proceedings of 32nd Annual International Conference on Theory and Applications of Cryptographic Techniques(EUROCRYPT'13),Berlin:Springer,2013:279-295.