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