前幾天我的一個同事在對計划采購的存儲進行測試,期間聊到了raid5的話題,我和他的意見產生了分歧。他的說法是raid5不能掛太多盤是因為如果掛太多盤寫懲罰會非常嚴重導致性能下降。而我的觀點則是對於raid5來說,磁盤越多性能越好,不能掛太多盤是因為容錯性下降的原因。
首先,先明確raid5的寫懲罰是怎么一回事。我們都知道raid5的特點是N+1的冗余方式,N越大,冗余度越低,而且我們也都知道raid5會把校驗信息打散在各個磁盤。這么做的目的當然不是為了好玩,而是為了避免出現校驗盤爭用的現象。
raid3采用的校驗盤放在一起,當兩個命令同時對磁盤進行操作的時候,就需要同時操作校驗條帶。如果這兩個操作不屬於同一個條帶。那么這兩個操作就不能同時進行,也就是出現了校驗盤爭用的現象導致了校驗盤瓶頸。
現在問題來了,raid5是如何寫入數據的,這個問題直接決定了寫懲罰的原理。
raid5的寫入情況分成3種:
1.要寫入的數據布滿整個條帶。這種情況可以把要寫入的數據的校驗信息算好,直接把整個條帶寫入磁盤。
2.要寫入的數據大於半個條帶。這種情況可把這個條帶上不需要修改的數據讀出來,和要寫入的數據一起計算校驗,並寫入磁盤。rcw:read-construct-write,這個是重構一個stripe_head
3.要寫入的數據小於半個條帶。這種情況需要把要修改的舊數據和原始的校驗數據讀出來,並連同新數據一起計算校驗值。rmw:read-modified-write,這個是覆蓋寫的方式
4.同樣開支采用rcw方式
5.EC糾刪碼僅使用rcw方式進行,在"小寫"的時候所有速度慢
計算公式是 新校驗= 老數據 XOR 新數據 XOR 老校驗
證明比較簡單:
假設原來的校驗c=i[0] xor i[1] xor i[2]....xor i[n]
我要把i[0]修改為i1[0],那么c1=i1[0] xor i[1]....xor i[n]
因為 1 xor 0=1 0 xor 0=0 因此 i xor 0=i
得出 c1=i1[0] xor i[1]...xor i[n] xor 0
我們把0換成i[0] xor i[0],c1=i1[0] xor i[1]..xor i[n] xor (i[0] xor i[0])
因為xor 滿足結合律,所以c1=x1[0] xor i[0] xor (i[0] xor i[1]...xor i[n])=x1[0] xor x[0] xor c
這個計算公式得到的結論是,在我寫入一個segment的時候,不管這個raid有多少塊盤組成,我只需要操作兩個盤。一個是校驗盤,一個是要寫入的磁盤。對於這兩塊盤操作是並發的,可以同時進行。而寫懲罰的意義,就在於我需要先把數據讀出來,再寫入。
正因為如此,在有n塊盤的時候,想在不同條帶下同時寫入數據的並發成為可能。當然前提是每個隨機數據並不要太大,占據大部分條帶。對於典型的隨機讀寫數據來說,4k是一個比較常見的大小,而raid5的條帶深度往往大於4k。因此可以保證每個隨機讀寫都占據了一個segment。在這種情況下可以想象,最大的並發數量是n/2,即每個數據的數據和校驗同另外一個數據和校驗的segment所處的磁盤都不同。而增加磁盤就相當於增大並發的峰值或者增大並發的概率。這個是單憑直覺就能想到的。因此不管原來有多少塊盤,增加磁盤的數量對於隨機寫來說始終是有利的。
對於大塊連續寫入,因為都是整個條帶寫入,n值的升高更能提高寫入效率,而不需要考慮概率的影響。