《GlusterFS企業(yè)級功能之EC糾刪碼》要點:
本文介紹了GlusterFS企業(yè)級功能之EC糾刪碼,希望對您有用。如果有疑問,可以聯(lián)系我們。
在這個數(shù)據(jù)爆炸的時代,很多行業(yè)不得不面臨數(shù)據(jù)快速增長的挑戰(zhàn),為了應(yīng)對呈爆炸式增長態(tài)勢的數(shù)據(jù)量,構(gòu)建大規(guī)模的存儲系統(tǒng)成了一種普遍的應(yīng)用需求.但數(shù)據(jù)是如此重要,如何保證存儲可靠性、數(shù)據(jù)可用性成了大規(guī)模存儲系統(tǒng)的難點和要點.數(shù)據(jù)冗余是保障存儲可靠性、數(shù)據(jù)可用性的最有效手段,傳統(tǒng)的冗余機制主要有副本(Replication)和糾刪編碼(Erasure Code,以下簡稱糾刪碼或EC)兩種方式.
副本是將每個原始數(shù)據(jù)分塊都鏡像復(fù)制到另一存儲介質(zhì)上,從而保證在原始數(shù)據(jù)失效后,數(shù)據(jù)仍然可用并能通過副本數(shù)據(jù)恢復(fù).在副本機制中,數(shù)據(jù)的可靠性和副本數(shù)是呈正相關(guān),副本數(shù)越多,數(shù)據(jù)可用性越好,可靠性也越高,但也意味著更低的空間利用率以及更高的成本.在大規(guī)模存儲系統(tǒng)中,節(jié)點出現(xiàn)故障并發(fā)生失效是一種大概率事件,這也就意味著雙副本并不能滿足企業(yè)對存儲可靠性的需求,但三副本的存儲開銷太大,高達200%,且隨著存儲規(guī)模的增大,對存儲系統(tǒng)的開銷(如容量空間成本、運營成本等)都將顯著增加.
相較于副本機制,糾刪碼機制具有更高的存儲效率,在提供相同存儲可靠性的條件下,可以最小化冗余存儲開銷.糾刪碼機制在網(wǎng)路環(huán)境下,其高存儲效率的特性還能能顯著降低網(wǎng)絡(luò)中的數(shù)據(jù)流量,也就意味著在大規(guī)模存儲系統(tǒng)中使用糾刪碼機制能夠節(jié)約網(wǎng)路帶寬和存儲空間.所以在大規(guī)模存儲的應(yīng)用場景中,糾刪碼機制成了保證存儲可靠性、數(shù)據(jù)可用性的最佳選擇.
糾刪碼本身是一種編碼容錯技術(shù),起源于通信傳輸領(lǐng)域,用來解決通信過程中部分數(shù)據(jù)在傳輸過程中丟失的問題.其基本原理是傳送端把需要傳輸?shù)男盘柗侄?然后加入一定的校驗并讓各信號段之間間產(chǎn)生一定的聯(lián)系,最后統(tǒng)一把所有信號段向接收端發(fā)送;如果在傳輸過程中有部分信號丟失,接收端仍可以通過算法把完整的信息計算出來,從而保證了兩端之間的可靠通信.其原理如下圖所示:
圖1:糾刪碼的原理圖
客戶端,把原始數(shù)據(jù)信息切分為k塊source data,然后通過糾刪碼Encoder生成n塊encoded data,最后統(tǒng)一向服務(wù)端傳輸;服務(wù)端,只要能夠接收到k` >= k塊的encoded data,就能夠通過糾刪碼decoder出所有的source data.
按照誤碼控制的不同功能,可分為檢錯、糾錯和糾刪三種類型.檢錯碼僅具備識別錯碼功能而無糾正錯碼功能;糾錯碼不僅具備識別錯碼功能,同時還具備糾正錯碼功能;糾刪碼則不僅具備識別錯碼和糾正錯碼的功能,而且當(dāng)錯碼超過糾正范圍時,還可把無法糾錯的信息刪除.
按照存儲單元連接方式的不同,可分為基于高速總線方式的磁盤陣列、基于LAN方式的集群存儲和基于WAN/Internet方式的廣域網(wǎng)絡(luò)存儲系統(tǒng).陣列碼是一種特殊化的糾刪碼,其采用高效率的異或運算(XOR),如RAID5、RAID6等.集群存儲系統(tǒng)中,如HDFS的HDFS-RAID、PanFS支持RAID-5容錯編碼、Google的GFSⅡ、微軟的WAS等;廣域網(wǎng)下,如RACS、DepSky等;開源的集群存儲系統(tǒng)中,如GlusterFS的EC卷、ceph糾刪碼等.
糾刪碼常見的有里德-所羅門碼Reed-Solomen(簡稱RS)、級聯(lián)低密度糾刪碼和數(shù)字噴泉碼三類.目前在存儲行業(yè)內(nèi)的應(yīng)用中,主要使用的是RS類糾刪碼,比如光盤存儲中使用 RS 碼進行容錯,防止光盤上的劃痕導(dǎo)致數(shù)據(jù)不可讀;生活中經(jīng)常使用的二維碼就利用了RS碼來提高識別的成功率.主要原因就是,RS類碼是唯一可以滿足任意磁盤數(shù)目N和校驗數(shù)據(jù)M中丟失M塊后能恢復(fù)的Maximum Distance Separable(簡稱MDS)編碼,所以下文中主要以RS類碼來介紹糾刪碼在存儲應(yīng)用中的使用原理.
在大規(guī)模存儲應(yīng)用場景中,節(jié)點故障、數(shù)據(jù)失效是一種常態(tài),使用糾刪碼來保證存儲可靠性、數(shù)據(jù)可用性是目前的最有效方式之一.其原理是將文件數(shù)據(jù)分割成N個大小相同的原始數(shù)據(jù)塊,然后編碼生成M個大小相同的校驗數(shù)據(jù)塊(注:原始數(shù)據(jù)塊和校驗數(shù)據(jù)塊大小相同),最后將原始數(shù)據(jù)塊和校驗數(shù)據(jù)塊分別存儲在不同的位置,如不同的磁盤、不同的存儲節(jié)點等.糾刪碼的容錯能力正是來源于這些校驗數(shù)據(jù)塊,在1~M個數(shù)據(jù)塊(注:原始數(shù)據(jù)或校驗都行)損壞的情況下,整體數(shù)據(jù)仍然可以通過剩余的數(shù)據(jù)塊計算得出,確保了數(shù)據(jù)仍的高可用性.
糾刪碼存儲的存取過程包含編碼、修改、解碼三種基本操作.以(6,2)RS碼為例,文件劃分為4個原始數(shù)據(jù)塊{D1,D2,D3,D4},經(jīng)過編碼得到{P1,P2}2個校驗數(shù)據(jù)塊;當(dāng)原始數(shù)據(jù)塊D4被更新為D4’時,校驗數(shù)據(jù)塊{P1,P2 }也要重新編碼更新為{P1’,P2’ };借助解碼函數(shù),可根據(jù)任意4個數(shù)據(jù)塊(如{D1,D2,D3,P1’})重構(gòu)出所有的數(shù)據(jù)塊.
圖2:糾刪碼的三種基本操作
糾刪碼存儲的數(shù)據(jù)恢復(fù)過程主要利用編碼、解碼來恢復(fù)丟失的數(shù)據(jù).同樣以(6,2)RS碼為例,文件劃分為4個原始數(shù)據(jù)塊{D1,D2,D3,D4},經(jīng)過編碼得到{P1,P2}2個校驗數(shù)據(jù)塊,然后把所有數(shù)據(jù)塊統(tǒng)一存儲.
當(dāng)原始數(shù)據(jù)分塊D4丟失時,可根據(jù){D1,D2,D3,P1,P2}中任意4個數(shù)據(jù)塊解碼計算出原始數(shù)據(jù)塊D4.
圖3:糾刪碼存儲的數(shù)據(jù)分塊恢復(fù)
當(dāng)校驗數(shù)據(jù)塊P2丟失時,可根據(jù){D1,D2,D3,D4,P1 }中任意4個數(shù)據(jù)塊編碼計算出校驗數(shù)據(jù)塊P2.
圖4:糾刪碼存儲的校驗分塊恢復(fù)
在(6,2)RS碼為例的糾刪碼存儲中,其冗余度為2,即最多可以同時丟失2塊數(shù)據(jù)塊,當(dāng)丟失的數(shù)據(jù)塊個數(shù)大于2時,丟失數(shù)據(jù)塊就不可恢復(fù)了.
現(xiàn)今,基于糾刪碼的開源實現(xiàn)技術(shù)主要有Intel ISA-L、Jerasure等庫,以下就來簡單介紹一下這兩種庫:
Intel ISA-L(Intelligent Storage Acceleration Library),即英特爾智能存儲加速庫,是英特爾公司開發(fā)的一套專門用來加速和優(yōu)化基于英特爾架構(gòu)(IntelArchitecture,IA)存儲的lib庫,可在多種英特爾處理器上運行,能夠最大程度提高存儲吞吐量,安全性和靈活性,并減少空間使用量.該庫還可加速RS碼的計算速度,通過使用AES-NI、SSE、AVX、AVX2等指令集來提高計算速度,從而提高編解碼性能.同時還可在存儲數(shù)據(jù)可恢復(fù)性、數(shù)據(jù)完整性性、數(shù)據(jù)安全性以及加速數(shù)據(jù)壓縮等方面提供幫助,并提供了一組高度優(yōu)化的功能函數(shù),主要有:RAID函數(shù)、糾刪碼函數(shù)、CRC(循環(huán)冗余檢查)函數(shù)、緩沖散列(MbH)函數(shù)、加密函數(shù)壓縮函數(shù)等.
Jerasure是美國田納西大學(xué)Plank教授開發(fā)的C/C++糾刪碼函數(shù)庫,提供Reed-Solomon和Cauchy Reed-Solomon兩種編碼算法的實現(xiàn).Jerasure有1.2和 2.0兩個常用版本,Jerasure 2.0為目前的最新版本,可借助intel sse指令集來加速編解碼,相比1.2版本有較大的提升.Jerasure庫分為5個模塊,每個模塊包括一個頭文件和實現(xiàn)文件.
(1)galois.h/galois.c:提供了伽羅華域算術(shù)運算.
(2)jerasure.j/jerasure.c:為絕大部分糾刪碼提供的核心函數(shù),它只依賴galois模塊.這些核心函數(shù)支持基于矩陣的編碼與解碼、基于位矩陣的編碼與解碼、位矩陣變換、矩陣轉(zhuǎn)置和位矩陣轉(zhuǎn)置.
(3)reedsol.h/reedsol.c:支持RS編/解碼和優(yōu)化后的RS編碼.
(4)cauchy.h/Cauchy.c:支持柯西RS編解碼和最優(yōu)柯西RS編碼.
(5)liberation.h/liberation.c:支持Liberation RAID-6編碼啊、Blaum-Roth編碼和Liberation RAID-6編碼.其中,Liberation是一種最低密度的MDS編碼.這三種編碼采用位矩陣來實現(xiàn),其性能優(yōu)于現(xiàn)在有RS碼和EVENODD,在某種情況下也優(yōu)于RDP編碼.
Intel ISA-L庫和Jerasure庫都能加速RS碼的計算速度.其中,ISA-L 庫對于加速RS碼的計算速度效果更好,是目前業(yè)界最佳.ISA-L 之所以速度快,主要有兩點,一是由于Intel 諳熟匯編優(yōu)化之道,ISA-L直接使用匯編代碼;二是因為它將整體矩陣運算搬遷到匯編中進行.但這導(dǎo)致了匯編代碼的急劇膨脹,令人望而生畏.另外,ISA-L 未對 vandermonde 矩陣做特殊處理,而是直接拼接單位矩陣作為其編碼矩陣,因此在某些參數(shù)下會出現(xiàn)編碼矩陣線性相關(guān)的問題.
雖然Jerasure2.0庫相較ISA-L 庫對于加速RS碼的計算速度效果略差,但是Jerasure2.0庫在存儲應(yīng)用中仍具有一些ISA-L 庫所沒有的優(yōu)勢,如Jerasure2.0使用 C 語言封裝后的指令,讓代碼更加的友好.另外Jerasure2.0 不僅僅支持 GF(2^8) 有限域的計算,其還可以進行 GF(2^4) – GF(2^128) 之間的有限域.并且除了 RS 碼,還提供了 Cauchy Reed-Solomon code(CRS碼)等其他編碼方法的支持.且在工業(yè)應(yīng)用之外,其學(xué)術(shù)價值也非常高,是目前使用最為廣泛的編碼庫之一,開源的Ceph分布式存儲系統(tǒng)就是使用Jerasure庫作為默認的糾刪碼庫.
2011年,Linux系統(tǒng)廠商RedHat紅帽以1.36億美元收購了網(wǎng)紅Gluster,然后基于紅帽企業(yè)的Linux操作系統(tǒng)構(gòu)建了企業(yè)級的RedHat Gluster Storage存儲,并在過去的幾年里,為其添加了一系列的企業(yè)級新功能,如EC(Erasure Code)糾刪碼卷、SSD Tier分層、Geo-Replication遠程復(fù)制等,顯著增強了GlusterFS存儲的性能、可靠性、靈活性與安全性.
在早期版本的GlusterFS存儲中,其中有兩種基本卷,Striped卷和Replicated卷.其中Striped卷提供了較高的物理磁盤空間利用率機制,但不提供容錯機制,即可靠性較差;Replicated卷提供了容錯機制,但對物理磁盤空間利用率較低.那么可不可以結(jié)合Striped卷、Replicated卷兩者的優(yōu)點,開發(fā)一種具有即能提供容錯機制、又能提高物理磁盤空間利用率的卷呢?于是有了EC糾刪碼卷的出現(xiàn).在GlusterFS 3.6版本中發(fā)布了一種基于Erasure Code所開發(fā)的新類型卷Dispersed卷和Distributed Dispersed卷,簡稱EC卷,類似于RAID5/6.
在GlusterFS存儲中,EC卷是通過使用系統(tǒng)內(nèi)存儲的信息來重建丟失或損壞的數(shù)據(jù),從而進一步加強對數(shù)據(jù)的保護.下面就簡單介紹EC卷的自修復(fù)過程:首先客戶端檢查元數(shù)據(jù)是否一致;如果不一致,則向服務(wù)端發(fā)出數(shù)據(jù)修復(fù)請求;服務(wù)端接收到請求后則會調(diào)用entrylk()和inodelk()兩個函數(shù),先是和客戶端通信確認,確認后,如果修復(fù)準備就緒,就開始對元數(shù)據(jù)進行修復(fù);元數(shù)據(jù)修復(fù)成功后,下一步就是對數(shù)據(jù)塊的修復(fù)了,數(shù)據(jù)塊在修復(fù)期間是沒有鎖的;數(shù)據(jù)塊修復(fù)成功后會再次調(diào)用inodelk()函數(shù),用于同步元數(shù)據(jù)(如擴展屬性),同步成功后,自修復(fù)也就完成了.其架構(gòu)如下圖所示:
圖5:架構(gòu)圖
在GlusterFS存儲中,有兩種卷是基于erasure codes的,分別是Dispersed卷和Distributed Dispersed卷.其核心思想是以計算換容量,和RAID類似,同樣突破了單盤容量的限制,且能夠通過配置Redundancy(冗余)級別來提高數(shù)據(jù)的可靠性,也就是說存儲系統(tǒng)底層不做RAID,使用EC卷就能提供大容量的存儲空間,還能保證較高的存儲可靠性.
Dispersed卷可以有任意多個bricks(B),且可配置冗余度redunancy(R),R最小值為1,最大值為(B-1)/2.R的最小值不能為0的原因在于,如果當(dāng)R的值為0時,卷就不提供容錯機制了,其性能還不如直接使用哈希卷,所以限定R最小值為1;R的最大值為(B-1)/2的原因在于,當(dāng)R的值為B/2時,其存儲利用率和replica-2復(fù)制卷相同,但其性能就遠遠不如replica-2復(fù)制卷了,所以限定其最大值為(B-1)/2.R最小值、最大值的確定使得B的最小值被確定為3,也就是說創(chuàng)建EC卷至少需要3個brick,才能創(chuàng)建成功.
Dispersed卷提高了存儲空間的利用率,其存儲利用率計算公式為(B-R)/B,有效存儲空間為(B-R)*Brick_size,在理論上存儲空間利用率可以達到99.9%.也就是說,能夠保證在提供一定容錯機制的情況下,最大限度的提高存儲利用率.
Dispersed卷提高了存儲的可靠性,只要任意大于等于B-R個brick能夠正常則數(shù)據(jù)可正常讀寫,就能夠保證數(shù)據(jù)是可用的、可恢復(fù)的;同時還優(yōu)化了帶寬的使用,且部分文件數(shù)據(jù)的分片失效引起的降級讀寫不影響其他文件數(shù)據(jù)的讀寫.
Distributed Dispersed 卷可以通過擴展Dispersed 卷生成,即擴展一倍或n倍的bricks(B).對比于Dispersed卷,其原理相同,但在相同的erasure codeing配置下,具有更好的I/O性能.所以下文中將主要以Dispersed卷來介紹EC卷的原理.
1. Disperse卷的機制
Disperse卷中,會把每個讀寫請求切分為大小相同的Chunk塊,而每個Chunk塊又被分割成(B-R)個大小為512bytes的Fragment數(shù)據(jù)分片;然后使用算法Rabin IDA計算生成R個大小為512bytes的Fragment校驗分片;最后把(B-R)個數(shù)據(jù)分片和R個校驗分片以條帶的方式存儲在一起,即分別存儲于每個Brick上,從而降低訪問熱點;其中R個校驗分片會以輪詢輪的方式存儲于卷的每個brick上,用以提高卷的可靠性.(注:Fragment的大小在GlusterFS的源碼中是一個宏定義,其大小等于EC_METHOD_WORD_SIZE* EC_GF_BITS = 64*8 = 512 bytes)
Disperse卷中,Chunk的大小可配置,其大小與具體的Redundancy配置有關(guān),其大小等于512*(B-R) bytes.可通過調(diào)整Redundancy的配置(注:Redundancy的配置在Disperse卷創(chuàng)建之后就確定,不可修改),來修改Chunk的大小.那么以官方經(jīng)典的配置B=6,R=2的Disperse卷為例,得出Chunk的大小為(6-2)*512 = 2048 bytes.
Chunk的大小與性能有關(guān),而性能又與訪問模式以及文件大小有關(guān).其性能會隨著Chunk的大小改變而改變,用戶可以根據(jù)具體的應(yīng)用場景,通過調(diào)整Chunk的大小,在存儲利用和可靠性之間做均衡選擇,從而獲得更好的性能.
圖6:Dispersed卷的存儲機制
2. Disperse卷的編碼
Disperse卷使用算法Rabin IDA(Information Dispersal Algorithm)進行編碼,其中R(redundancy)個校驗數(shù)據(jù)由(B-R)個原始數(shù)據(jù)計算得出.
圖7:Dispersed卷的編碼
3. Disperse卷的失效數(shù)據(jù)恢復(fù)
任意數(shù)據(jù)/校驗塊的失效都可用(B-R)個數(shù)據(jù)/校驗塊通過解碼/編碼恢復(fù),數(shù)據(jù)塊通過解碼方式恢復(fù),校驗塊通過編碼方式恢復(fù).
圖8:Dispersed卷的失效數(shù)據(jù)恢復(fù)
4. Disperse卷的讀操作
讀操作,每個Chunk都必須從B-R個brick中成功讀取B-R個數(shù)據(jù)/校驗分片;盡量讀數(shù)據(jù)塊而不是校驗塊;校驗塊輪詢分布在各個brick上,達到更好的平衡負載.
圖9:Dispersed卷的讀操作
5. Disperse卷的寫操作
(1)普通的寫操作
根據(jù)(B-R)個原始數(shù)據(jù)塊使用算法IDA計算得出R(redundancy)個校驗塊,然后再把數(shù)據(jù)塊和校驗塊以條帶的方式一起寫入底層所有brick中.
圖10:Dispersed卷的寫操作
(2)部分寫
部分寫分為兩種情況,一是沒有失效的數(shù)據(jù)塊分片,首先將不完整的Chunk將讀出來,然后結(jié)合新寫入數(shù)據(jù)重新計算校驗塊,最后再把數(shù)據(jù)塊、校驗塊統(tǒng)一寫入底層brick中;二是有失效的數(shù)據(jù)塊分片,首先利用該Chunk中其他的分片通過編碼/解碼計算恢復(fù),然后結(jié)合新寫入數(shù)據(jù)重新計算校驗塊,最后再把數(shù)據(jù)塊、校驗塊統(tǒng)一寫入底層brick中.
在Gluster3.7版本中,EC卷有disperse.eager-lock、cluster.disperse-self-heal-daemon、cluster.heal-timeout、disperse.background-heals、disperse.heal-wait-qlength以及disperse.read-policy等幾個參數(shù),下面就對幾個重要的參數(shù)進行簡單介紹:
disperse.eager-lock:默認值為on,建議把這個參數(shù)設(shè)置為off.設(shè)置為off時,雖然會降低讀性能,但當(dāng)對于文件的操作完成后文件鎖能夠立即得到釋放,從而提升一些操作(如寫操作、修復(fù)等操作)的性能.
disperse.background-heals:默認值為8,用來控制平行修復(fù)時的個數(shù).
disperse.heal-wait-qlength:默認值為128,用來控制等待修復(fù)的個數(shù).
disperse.read-policy:默認值為round-robin,用來設(shè)置讀的策略.
cluster.heal-timeout:默認值為600,用來設(shè)置自修復(fù)進程檢查需要自修復(fù)文件的時間間隔.
在Gluster 3.9版本中,EC卷又增加了disperse.shd-max-threads、disperse.shd-wait-qlength、disperse.cpu-extensions等三個參數(shù),由于篇幅有限在這里就不做介紹了.
1、Disperse卷的創(chuàng)建
Disperse卷的創(chuàng)建與節(jié)點個數(shù)無關(guān)(節(jié)點個數(shù)大于等于1),只與bricks(B)、冗余度redunancy(R)相關(guān);其中bricks(B)必須大于等于3,disperse-data 的個數(shù)必須要大于等于2,redunancy(R)的值最小為1,最大為(B-1)/2、必須小于bricks(B)的一半且值是不能改變的.
2、Disperse卷的數(shù)據(jù)存儲
disperse卷的單個底層brick中不具有完整數(shù)據(jù),需整合多個brick上的數(shù)據(jù)片段才能看到完整的文件數(shù)據(jù);底層brick中存儲的不是原始數(shù)據(jù);數(shù)據(jù)塊和校驗塊是存儲在一起的.
3、Disperse卷的數(shù)據(jù)恢復(fù)
在配置bricks(B)為3,冗余度redunancy(R)為1的disperse卷中,任意掛掉一個brick后,數(shù)據(jù)都能夠恢復(fù),且不影響正常訪問;在修復(fù)大文件數(shù)據(jù)時,需要同步訪問來觸發(fā)才能修復(fù)數(shù)據(jù);修復(fù)小文件數(shù)據(jù),則不需要;手動刪除底層brick中的數(shù)據(jù),也能夠?qū)崿F(xiàn)修復(fù).
4、Disperse卷的擴展
三個brick的disperse卷不能同時擴展一個或兩個brick,只能同時擴展3n(n>=1)個brick,即disperse卷不能任意擴展卷,只能同時擴展n*B(n>=1)個brick;Distributed Dispersed 卷可以通過擴展Dispersed 卷生成;Dispersed 卷可在在線擴展,且擴展過程中不影響數(shù)據(jù)的訪問.
5、chunk的大小是否與性能有關(guān)
disperse卷的性能會隨著chunk的大小改變而改變,用戶可以根據(jù)需求改變chunk的大小來調(diào)整disperse卷的性能.可通過調(diào)整EC配置,來修改Chunk的大小.(注:冗余度Redundancy在Disperse卷創(chuàng)建之后就確定,且不可修改.)
6、Disperse卷的均衡
disperse卷在擴展卷時不會自動均衡卷,需要手動均衡卷;均衡時,小文件直接進行遷移均衡,大文件則是先建立黏著位鏈接,然后再進行數(shù)據(jù)遷移均衡.
7、Disperse卷的收縮
disperse卷在收縮卷時,不能任意收縮,只能同時收縮n*B(n>=1)個brick;必須先遷移數(shù)據(jù)然后才能刪除相應(yīng)的brick.
8、Disperse卷的替換
disperse卷在替換brick時,替換的brick不能是卷內(nèi)部的brick,也不能是其他卷里面的brick;目錄也能夠替換;替換正常運行的brick是通過計算所有節(jié)點中brick的數(shù)據(jù)來進行替換的;替換過不正常運行的brick是通過計算其他節(jié)點中正常運行的brick中數(shù)據(jù)來進行替換的;且替換過程中不影響卷的正常訪問.
9、Distributed Disperse卷的數(shù)據(jù)恢復(fù)
在配置B為6、R為2的Distributed Disperse卷中,最多只能同時掛掉不同組中的2個brick;寫文件時,文件的數(shù)據(jù)塊和校驗塊都只會存儲在一個組中,不會交叉存儲;同時具有Distributed卷和Disperse卷的特性,其中Disperse卷作為Distributed卷的子卷.
10、EC卷的性能總結(jié)
相同EC配置下Distributed-Disperse卷比Disperse卷具有更好的IO性能;相同disperse-data個數(shù)的Disperse卷的性能相近;相同冗余配置的EC卷比復(fù)制卷具有更大的空間利用率,但讀寫性能均比復(fù)制卷略差;相對于分布式復(fù)制卷,Distributed-Disperse卷的優(yōu)點是具有較高的磁盤利用率和容錯性,但是其IOPS性能下降較多.
在配置為1 x (2+1)的disperse卷中任意掛掉一個brick后,不影響數(shù)據(jù)的正常訪問;數(shù)據(jù)的修復(fù)是通過計算其他兩個節(jié)點中的brick來修復(fù)的;在修復(fù)100G數(shù)據(jù)時,替換brick用時約2.2秒,但是發(fā)現(xiàn)替換成功后新的brick中并沒有數(shù)據(jù),需要同步訪問來觸發(fā)才能修復(fù)數(shù)據(jù);修復(fù)100M 數(shù)據(jù),則不需要同步訪問來觸發(fā)修復(fù);EC卷的穩(wěn)定性良好,測試過程無報警.
1、測試環(huán)境
2、測試工具
IOzone,文件系統(tǒng)測試基準工具,可以測試不同操作系統(tǒng)中文件系統(tǒng)的讀寫性能.主要測試文件系統(tǒng)的write、re-write、read、re-read、random read、random write等性能.注意:在單進程的測試中,測試文件的大小一定要大過內(nèi)存的大小(最佳值為內(nèi)存大小的兩倍),否則linux會給讀寫的數(shù)據(jù)進行緩存,從而造成測試數(shù)值不準確.
3、測試方法
搭建3個節(jié)點的glusterfs集群,創(chuàng)建6x(2+1)的Distributed Dispersed卷,啟動卷.在每個節(jié)點使用Gluster原生協(xié)議本地掛載卷,然后分別在每個節(jié)點中使用測試工具iozone,測試進程數(shù)為4、塊大小為512KB、文件大小為16GB時,EC卷的讀寫性能,測試命令為:
# ./iozone -s 16g -r 512k -i 0 -i 1 –t 4.
4、測試結(jié)果
5、測試總結(jié)
在配置為6x(2+1)的Distributed-Disperse卷測試中,無論是寫性能,還是讀性能,都達到了1GB/s,特別是寫性能更是高達1.5GB/s.由此得出,EC卷是可以滿足企業(yè)對于性能的一般需求的,是可以在實際環(huán)境中使用的.
基于Glusterfs搭建的集群中,創(chuàng)建EC卷推薦以下幾種配置:
a. 冗余度為1,推薦創(chuàng)建配置為(2+1) EC卷;
b. 冗余度為2,推薦創(chuàng)建配置為(4 +2) EC卷;
c. 冗余度為3,推薦創(chuàng)建配置為(8 +3) EC卷;
d. 冗余度為4,推薦創(chuàng)建配置為(8 + 4) EC卷.
由于在相同的EC配置下,Distributed Disperse卷比Disperse卷具有更好的IO性能,所以推薦在硬盤數(shù)量足夠的情況下創(chuàng)建Distributed Disperse卷.
在底層的配置中,推薦邏輯盤(如/dev/sda)不分區(qū)直接格式化為塊大小512B的XFS文件系統(tǒng),且邏輯盤與brick是一一對應(yīng)的關(guān)系;推薦有n個節(jié)點,B就等于n,即同一組的Disperse卷配置中,一個brick對應(yīng)一個節(jié)點.比如,三個節(jié)點的gluster集群就推薦創(chuàng)建配為(B=3,R=1)的EC卷,每組Disperse卷配置中,一個brick對應(yīng)一個節(jié)點.
對于如何優(yōu)化EC卷的性能主要在于以下幾點:一是如何提高編/解碼的速度;二是如何提高編碼速度的穩(wěn)定性;三是EC卷參數(shù)的可配置;四是如何降低修復(fù)的開銷.
其中如何提高編/解碼的速度是最重要,也是最基礎(chǔ)的一點.編/解碼的運算速度主要依賴于分布式系統(tǒng)的計算能力以及網(wǎng)絡(luò)速度,那么可以從三個方面來提高.第一,服務(wù)器硬件性能的升級;第二,網(wǎng)絡(luò)環(huán)境的升級;第三,則是使用成熟的庫來加速RS碼的計算速度,如Intel ISA-L庫、Jerasure庫等.雖然從這三個方面都能夠提高糾刪碼的編/解碼的速度,但其中服務(wù)器硬件性能的升級以及網(wǎng)絡(luò)環(huán)境的升級都會增大企業(yè)的成本,所以推薦使用第三中方式,即使用成熟的庫來提高編/解碼的運算速度.其中Jerasure庫早已成為開源Ceph分布式存儲系統(tǒng)的默認糾刪碼庫,相對于ISA-L庫,Jerasure庫在這一點上具有一定的先天優(yōu)勢,所以在Gluster存儲中推薦使用Jerasure庫來加速EC卷的編/解碼速度.除了以上幾點外,還可以從分布式集群這一特性入手,分布式集群存儲中單一節(jié)點的計算能力不算很好,但如果能讓集群中每個節(jié)點協(xié)同完成編/解碼的計算,就能夠擁有足夠的計算能力,集群中節(jié)點越多,集群的計算能力越強,編/解碼的運算速度也就越快,相應(yīng)的EC卷性能也就越好.
編碼策略在理論范圍內(nèi)可隨意切換,即參數(shù)可配置,可以大大降低了后續(xù)的開發(fā)和維護所需要的精力.在Gluster存儲中,EC卷的性能會隨著chunk的大小改變而改變,那么實現(xiàn)chunk大小的參數(shù)可配置就顯得尤為必要了.實踐中,得知chunk的大小等于Fragment_size*(B-R),但其中R的大小在Disperse卷創(chuàng)建之后就確定,且不可修改;而Fragment_size在GlusterFS的源碼中又是一個宏定義,其大小等于EC_METHOD_WORD_SIZE * EC_GF_BITS = 64*8 = 512 bytes,這也就是說chunk的大小在disperse卷創(chuàng)建成功后就不可修改,而這極大降低了EC卷在實際應(yīng)用中的靈活度,例如根據(jù)數(shù)據(jù)的冷熱程度和數(shù)據(jù)重要程度選擇不同冗余配置、根據(jù)存儲文件的大小調(diào)整底層塊大小從而提高性能等.
EC卷具有很大的修復(fù)開銷,這主要是由于RS碼本身的特性所導(dǎo)致的,在配置為(D+R)的RS碼中修復(fù)任何一個數(shù)據(jù)塊時,都需要從磁盤上讀取D塊的其他數(shù)據(jù)塊,然后在網(wǎng)絡(luò)上傳輸,最后使用算法計算恢復(fù).比如在4+2的配置中,丟失任何一個數(shù)據(jù)塊都將必須讀取至少4個數(shù)據(jù)塊來修復(fù),在整個修復(fù)過程中會占用大量磁盤I/O以及網(wǎng)絡(luò)流量,并且會使得系統(tǒng)暴露在一種降級的不穩(wěn)定狀態(tài).那么使用較小的D值就能在很大程度上降低修復(fù)的開銷,還能提高存儲的可靠性,但這會降低存儲利用率,這就需要在性能和存儲空間利用率之間做權(quán)衡了.
在EC卷中,無論是讀操作、寫操作,還是修改操作都需要做大量的計算、通信、下發(fā)文件鎖等操作.就拿寫操作來說,以在配置為(4+2)的EC卷中寫一個chunk數(shù)據(jù)塊為例,a.把這個chunk塊切分為4個fragment原始數(shù)據(jù)塊;b.讀4個原始數(shù)據(jù)塊;c.計算得出2個校驗數(shù)據(jù)塊;d.對每個數(shù)據(jù)塊下發(fā)文件鎖,并添加擴展屬性;e.把6個數(shù)據(jù)塊統(tǒng)一寫入底層brick中;f.寫入成功后,擦除擴展屬性.當(dāng)然,這僅僅只是大概流程,在這其中至少包含10個文件鎖、20次通信、5個狀態(tài)機等等操作.那么是否可以考慮從優(yōu)化Gluster中關(guān)于EC卷的源碼這方面來提升EC卷的性能,例如把其中的一些重復(fù)操作合并,去除一些不必要的操作,優(yōu)化算法,從根本上去解決問題,當(dāng)然這屬于對Gluster做二次研發(fā)了,還需做具體的調(diào)研,在這里就不細說了.
EC卷的的核心是以計算換容量,其性能較復(fù)制卷略差,但具有更高的存儲利用率.那么從實際應(yīng)用的角度出發(fā),可以這樣使用EC卷:創(chuàng)建Tier分層來存儲數(shù)據(jù),熱卷使用復(fù)制卷,冷卷使用EC卷.在實際應(yīng)用中熱數(shù)據(jù)就直接存入復(fù)制卷中,當(dāng)熱數(shù)據(jù)變?yōu)槔鋽?shù)據(jù)后再把數(shù)據(jù)遷移到EC卷中,這樣就既提供了較高的性能,又保證了較高的存儲利用率.
文章來 自微信公眾號:運維幫
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4134.html