1、RAID 0
RAID 0是把n個物理磁盤虛擬成一個邏輯磁盤,即形成RAID 0的各個物理磁盤會組成一個邏輯上連續,物理上也連續的虛擬磁盤。一級磁盤控制器(指使用這個虛擬磁盤的控制器,如果某台主機使用配適卡鏈接外部盤陣,則指的就是主機上的磁盤控制器)對這個虛擬磁盤發出的指令,都被RAID控制器收到並分析處理,根據Block映射關系算法公式轉換成對組成RAID0的各個物理盤的真實物理磁盤IO請求指令,收集或寫入數據之后,再提交給主機磁盤控制器。
RAID 0也稱為條帶化存儲,它代表了所有RAID級別中最高的存儲性能。無數據校驗,下面分析從上到下訪問RAID 0磁盤的過程。
假如某一時刻,主機控制器發出指令:讀取初始扇區10000長度128
RAID控制器接收到這個指令之后,立即進行計算,根據對應公式算出10000號邏輯扇區所對應的物理磁盤的扇區號,然后依次算出邏輯上連續的下128個扇區所在物理磁盤的扇區號。分別向對應這些扇區的磁盤再次發出指令。這次是真是的讀取數據了,磁盤接受到指令,各自將數據提交給RAID控制器,經過控制器在Cache中的組合,再提交給主機控制器。
經過以上過程,發現如果這128個扇區都落在同一個Segment中的話,也就是說條帶深度容量大於128個扇區的容量(64KB),則這次IO就只能真實地從這一塊物理盤上讀取,性能和單盤相比會減慢,因為沒有任何優化,反而還增加了RAID控制器額外的計算開銷。所以,在某種特定條件下要提升性能,讓一個IO盡量擴散到多塊物理盤上,就要減小條帶深度。在磁盤數量不變的條件下,也就是減小條帶大小(Stripe SIZE,也就是條帶長度),讓這個IO的數據被控制器分割,同時放滿一個條帶的第一個Segment、第二個Segment等,以此類推,這樣就能極大地占用多塊物理盤。
所以RAID 0要提升性能,條帶做的越小越好。但是有一個矛盾出現了,就是條帶太小,導致並發IO幾率降低,因為如果條帶太小,則每次IO一定會占用大部分物理盤,隊列中的IO就只能等待這次IO結束后才能使用物理盤,而條帶太大,又不能充分提高傳輸速度。這兩個是一對矛盾,要根據需求采用不同的方式。
2、RAID 1
RAID 1稱為鏡像,它將數據完全一致地分別寫到工作磁盤和鏡像 磁盤,它的磁盤空間利用率為 50% 。 RAID1 在數據寫入時,響應時間會有所影響,但是讀數據的時候沒有影響。
對於RAID 1的寫IO,速度不但沒有提升,而且有所下降,應為數據要同時向多塊物理盤寫,時間以最慢的那個為准,因為是同步的。而對於RAID 1的讀IO請求,不但可以並發,而且就算順序IO的時候,控制器也可以像RAID 0一樣,從兩塊物理盤上同時讀數據,提升速度。
在讀、並發IO模式下,由於可以並發N個IO,每個IO占用一個物理盤,這就相當於提升了N倍的IOPS。由於每個IO只獨占了一個物理盤,所以數據傳輸速度相對於單盤並沒有改變,所以不管是隨機還是順序IO,相對單盤都不變
3、RAID 2
RAID2 稱為糾錯海明碼磁盤陣列,其設計思想是利用海明碼實現數據校驗冗余。海明碼是一種在原始數據中加入若干校驗碼來進行錯誤檢測和糾正的編碼技術,其中第 2n 位( 1, 2, 4, 8, … )是校驗碼,其他位置是數據碼。因此在 RAID2 中,數據按位存儲,每塊磁盤存儲一位數據編碼,磁盤數量取決於所設定的數據存儲寬度,可由用戶設定。圖 4 所示的為數據寬度為 4 的 RAID2 ,它需要 4 塊數據磁盤和 3 塊校驗磁盤。如果是 64 位數據寬度,則需要 64 塊 數據磁盤和 7 塊校驗磁盤。可見, RAID2 的數據寬度越大,存儲空間利用率越高,但同時需要的磁盤數量也越多。
海明碼自身具備糾錯能力,因此 RAID2 可以在數據發生錯誤的情況下對糾正錯誤,保證數據的安全性。它的數據傳輸性能相當高,設計復雜性要低於后面介紹的 RAID3 、 RAID4 和 RAID5 。
4、RAID 3
RAID 3是使用專用校驗盤的並行訪問陣列,它采用一個專用的磁盤作為校驗盤,其余磁盤作為數據盤,數據按位可字節的方式交叉存儲到各個數據盤中。RAID3 至少需要三塊磁盤,不同磁盤上同一帶區的數據作 XOR 校驗,校驗值寫入校驗盤中。 RAID3 完好時讀性能與 RAID0 完全一致,並行從多個磁盤條帶讀取數據,性能非常高,同時還提供了數據容錯能力。向 RAID3 寫入數據時,必須計算與所有同條帶的校驗值,並將新校驗值寫入校驗盤中。一次寫操作包含了寫數據塊、讀取同條帶的數據塊、計算校驗值、寫入校驗值等多個操作,系統開銷非常大,性能較低。
如果 RAID3 中某一磁盤出現故障,不會影響數據讀取,可以借助校驗數據和其他完好數據來重建數據。假如所要讀取的數據塊正好位於失效磁盤,則系統需要讀取所有同一條帶的數據塊,並根據校驗值重建丟失的數據,系統性能將受到影響。當故障磁盤被更換后,系統按相同的方式重建故障盤中的數據至新磁盤。
RAID3 只需要一個校驗盤,陣列的存儲空間利用率高,再加上並行訪問的特征,能夠為高帶寬的大量讀寫提供高性能,適用大容量數據的順序訪問應用,如影像處理、流媒體服務等。目前, RAID5 算法不斷改進,在大數據量讀取時能夠模擬 RAID3 ,而且 RAID3 在出現壞盤時性能會大幅下降,因此常使用 RAID5 替代 RAID3 來運行具有持續性、高帶寬、大量讀寫特征的應用。
RAID 3的每一個條帶,其長度被設計為一個文件系統快的大小,深度隨磁盤數量而定,但是最小深度為1個扇區,這樣的話,每個Segment的大小一般就是1個扇區或者幾個扇區的容量
例解:RAID 3的作用機制
用一個4塊數據盤和1塊校驗盤的RAID 3系統,Segment SIZE為兩個扇區大小(1KB),條帶長度為4KB
RAID 3控制器接收到了這樣一個IO:寫入初始扇區10000 長度8,即總數量為8*512B=4KB
控制器先定位LBA10000所對應的真是物理LBA,假如LBA10000恰好在第一個條帶的第一個Segment的第一個扇區上,那么控制器將這個IO數據里的第1、2個512B寫入這個扇區。同一時刻,第3、4個Segment中,此時恰好是4KB的數據量。也就是說這4KB的IO數據同時被分別寫入了4塊磁盤,沒塊磁盤寫入了兩個扇區,也就是一個Segment。它們是並行寫入的,包括校驗盤也是並行寫入的,所以RAID 3的校驗盤沒有瓶頸,但是有延遲,因為增加了計算校驗的開銷。
如果IO SIZE大於條帶長度,如控制器收到的IO SIZE為16KB,則控制器一次所能並行寫入的是4KB,這16KB就需要分4批來寫入4個條帶,其實這里的分4批寫入不是先后寫入,而是同時寫入,也就是這16KB中的第1、5、9、13KB將由控制器連續寫入磁盤1,第2、6、10、14連續寫入磁盤2,以此類推。直到16KB數據全部寫完,是並行一次寫完。這樣校驗盤也可以一次性計算校驗值並且和數據一同並行寫入,而不是分批。
5、RAID 4
RAID 4並不常見,其原理是在一級磁盤控制器驅動程序的上層,也就是文件系統層將隊列中的IO目標LBA進行掃描,將目標處於同一條帶的IO讓其並發寫入。也就是將兩個不同事務的IO寫操作,盡量放到相同的條帶上,以提升寫效率。最典型的的就是NetApp公司著名的WAFL文件系統,WAFL文件系統的設計方式確保了能夠最大限度地實現整條寫操作。WAFL總是把可以合並寫入的數據塊盡量同時寫到一個條帶中,以消除寫懲罰,增加IO並發系數。
6、RAID 5
先介紹幾個概念:
整條寫(Full-Stripee Write):需要修改奇偶校驗群組中所有的條帶單元,因此新的XOR校驗值可以根據所有新的條帶數據計算得到,不需要額外的讀、寫操作。因此,整條寫是最有效的寫類型。整條寫的例子,RAID 2、RAID 3.它們每次IO總是幾乎能保證占用所有盤,因此每個條帶上的每個Segment都被寫更新,所以控制器可以直接利用這些更新的數據計算出校驗數據之后,在數據被寫入數據盤的同時,將計算好的校驗信息寫入校驗盤。
重構寫(Reconstruct Write):如果要寫入的磁盤數目超過陣列磁盤數目的一半,可采取重構寫方式。在重構寫中,從這個條帶中不需要修改的Segment中讀取原來的數據,再和本條帶中所有需要修改的Segment上的新數據一起計算XOR校驗值,並將新的Segment數據和沒有更改過的Segment數據以及新的XOR校驗值一並寫入。顯然,重構寫要牽扯更多的I/O操作,因此效率比整條寫低。
讀改寫(Read-Modify Write):如果要寫入的磁盤數目不足陣列磁盤數目的一半,可采取讀改寫方式。讀改寫過程是:先從需要修改的Segment上讀取舊的數據,再從條帶上讀取舊的奇偶校驗值;根據舊數據、舊奇偶校驗值和需要修改的Segment上的新數據計算出這個條帶上的新的校驗值;最后寫入新的數據和新的奇偶校驗值。這個過程中包括讀取、修改和寫入的一個循環周期,因此稱為讀改寫。讀改寫計算新校驗值的公式為:新數據的校驗數據=(老數據 EOR 新數據)EOR 老校驗數據。如果待更新的Segment已經超過了條帶中總Segment數量的一半,則此時不適合用讀改寫,因為讀改寫需要讀出這些Segment中的數據和校驗數據。而如果采用重構寫,只需要讀取剩余不准備更新數據的Segment中的數據即可,而后者數量比前者要少。所以超過一半用重構寫,不到一半用讀改寫,整條更新就用整條寫。
寫效率排列順序為:整條寫>重構寫>讀改寫。
RAID 5解決了校驗盤爭用這個問題,RAID 5采用分布式校驗盤的做法,將校驗盤打散在RAID組中的每塊磁盤上。每個條帶都有一個校驗Segment,但是不同條帶中其位置不同,在相鄰條帶之間循環分布。為了保證並發IO,RAID 5同樣將條帶大小做得較大,以保證每次IO數據不會占滿整個條帶,造成隊列中其他IO的等待。所以,RAID 5要保證高並發率,一旦某時刻沒有成功進行並發,則這個IO幾乎就是讀改寫模式,所以RAID 5擁有較高的寫懲罰。
分析一下RAID 5具體的作用機制,假設條帶大小80KB,每個Segment大小16KB。某一時刻,上層產生一個寫IO:寫入初始扇區10000長度8,即寫入4KB的數據。控制器收到這個IO之后,首先定位真是LBA地址,假設定位到了第1個條帶的第2個Segment(位於磁盤2)的第1個扇區,則控制器首先對這個Segment所在的磁盤發起IO讀請求,讀取這8個扇區中原來的數據到Cache。與此同時,控制器也向這個條帶的校驗Segment所在的磁盤發起IO讀請求,讀出對應的校驗扇區數據並保存到Cache。利用EOR校驗電路來計算新的校驗數據,公式為:新數據的校驗數據=(老數據 EOR 新數據)EOR 老校驗數據。現在Cache中存在:老數據、新數據、老校驗數據和新校驗數據。控制器立即再次向相應的磁盤同時發起IO寫請求,將新數據寫入數據Segment,將新校驗數據寫入校驗Segment,並刪除老數據和老校驗數據。
在上述過程中,這個IO占用的始終只有1、2兩塊盤,因為所要更新的數據Segment對應的校驗Segment位於1盤,自始至終都沒有用到其他任何磁盤。如果此時隊列中有那么一個IO,它的LBA初始目標假如位於磁盤4中的數據Segment中,IO長度也不超過Segment的大小,而這個條帶對應的校驗Segment位於磁盤3上。這兩塊盤未被其他任何IO占用,所以此時控制器就可以並發的處理這個IO和上一個IO,達到並發。
RAID 5相對於經過特別優化的RAID 4來說,在底層就實現了並發,可以脫離萎蔫系統的干預。
7、RAID 6
RAID 6之前的任何RAID級別,最多能保障在壞掉一塊盤的時候,數據仍然可以訪問。如果同時壞掉兩塊盤,則數據將會丟失。為了增加RAID 5的保險系數,RAID 6被創立了。RAID 6比RAID 5多增加了一塊校驗盤,也是分布打散在每塊盤上,只不過是用另一個方程式來計算新的校驗數據。這樣,RAID 6同時在一個條帶上保存了兩份數學上不相關的校驗數據,這樣能夠保證同時壞兩塊盤的情況下,數據依然可以通過聯立這兩個數學關系等式來求出丟失的數據。RAID 6與RAID 5相比,在寫的時候會同時讀取或者寫入額外的一份校驗數據。不過由於是並行同時操作,所以不比RAID 5慢多少。其他特性則和RAID 5類似。