RAID系統是用來對存儲數據進行數據保護的有效手段。在RAID創建過程中往往會存在一個時間極長的系統初始化過程,為什么RAID初始化過程中會存在這樣的一個操作呢?這個操作對SSD會導致什么方面的影響呢?存儲老吳從技術研發的角度和大家一起對RAID初始化過程進行分析、研究。
傳統RAID的基本組織結構如下圖所示:
所有加入RAID Group的盤會按照LBA地址切分成一系列的切片,這些切片被稱之為Stripe Unit,不同盤中相同LBA地址所對應的Stripe Unit會組織成一個條帶(Stripe)。在一個條帶中對所有數據進行編碼,例如RAID6生成兩個編碼數據塊P和Q,可以允許兩個數據盤同時損壞。
所以,在RAID系統中,所有條帶中的數據都需要滿足編解碼算法規則,即條帶中的所有數據可以按照一定規則生成編碼數據,並且該編碼數據和條帶中存儲的編碼數據相同。這種情況被稱之為該條帶中的數據是一致的。當一個磁盤發生故障時,可以通過存儲在條帶中的編碼數據恢復丟失的數據塊。
如果一個條帶中的數據不一致,即條帶中的數據計算得到的編碼結果和存儲的編碼數據不相同,那么一旦一個磁盤發生故障,那么通過存儲在條帶中的編碼數據將無法正確恢復丟失的數據塊。所以,一個數據不一致的條帶將會在故障發生時導致數據正確性問題。
在創建一個RAID系統時,RAID Group中的磁盤可能是新盤,也可能是一塊已經被使用過的數據盤,這些盤上的數據不會全是零。在這種情況下,采用這些盤構建的數據條帶一定不能滿足數據一致性的需求。即每個條帶中的數據按照一定規則計算得到的編碼數據和條帶中的編碼數據是不相符的。這種數據不一致的條帶將會對RAID數據正確性問題引入極大的風險。
正因為這個原因,在創建一個RAID的時候需要考慮將系統中所有的條帶進行初始化,以此來保證條帶中數據的一致性。條帶初始化通常可以采用兩種方式來解決:
1, 通過全盤寫零的方式初始化RAID系統中的所有的條帶。數據全零的條帶,其校驗數據也為零。因此,全零數據可以保證條帶的一致性。
2, 將所有條帶進行校驗計算,更新條帶中的校驗數據,以此達到條帶數據的一致性。
當一個RAID系統被初始化完成后,所有條帶中的數據將會變得一致,如下圖所示:
RAID系統初始化過程是一個非常漫長的過程,其主要原因是需要對系統中所有條帶進行初始化。還需要考慮和前端用戶IO之間的性能平衡,所以,RAID系統初始化往往是一個后台執行的一個過程,會持續較長時間,並且對前端應用的性能造成影響。
對於SSD而言,RAID系統初始化過程還會引入其他問題。在系統初始化過程中,無論是采用寫零還是校驗數據更新的方式,都需要向SSD盤寫入數據,這個過程會導致無謂的數據寫放大。用戶數據還沒有被寫入的時候,通過初始化的方式就已經在SSD內部建立了數據映射表。對SSD而言降低了使用壽命和性能。因此,一個針對SSD的RAID系統需要考慮對系統初始化過程的優化,傳統RAID是不會考慮到SSD這個特殊特性的。所以,傳統RAID不能直接在SSD上進行部署,會對SSD本身的壽命和性能造成影響。
RAID系統采用數據條帶化的方式對數據進行保護,但是在條帶化數據保護的過程同樣引入了一系列問題,系統初始化就是一個典型的條帶一致性問題。一個優秀的RAID數據保護系統在設計的過程中都會解決掉這個問題,例如EMC的Data Domain RAID就不存在系統初始化過程,當然其需要和文件系統進行配合,並且在RAID條帶數據分布上做了很多的優化。