引言:RAID技術是現代大規模存儲的基礎,“基礎(技術)是拿來革命的”。我查raid相關資料時,查布爾運算,竟然一路查到“香農原理”,這不是有個視頻中HW的任總提到的嗎,多基礎的東西,任總卻毫不含糊,他的認知真不是蓋的,我們這等小輩又有什么理由不去努力提高自己的認知呢。同時我突然也意識到了,為什么國家和這些偉大的企業家重視基礎技術的研究,所以就冒出來了上面的語錄!思量了許久!!這也是為什么冬瓜頭在他的書里面花了大量篇幅來寫RAID,甚至把編小說的功夫都用上了!嗯,進入正題。
背景:前面章節介紹過磁盤讀寫速度主要限制在於磁頭臂的切換即尋道,為了避免磁頭被不斷打斷的問題,人們發明了RAID技術,讓一個硬盤的磁頭在換道時,另一個磁盤的磁頭在讀寫。如果很多磁盤聯合起來,同一時刻總有某塊硬盤的磁頭在讀寫狀態而不是都在換道狀態,這就相當於一個大虛擬磁盤的磁頭總是處於讀寫狀態,極大的提升傳輸速率。
RAID,Redundant Array of Independent Disks,獨立硬盤冗余陣列,簡稱磁盤陣列。從技術提出的背景可以看出,RAID是大量磁盤緊密合作的方式,既可以提升速率,同時又可以做到冗余,而對用戶和操作系統來說看起來像一個單獨的更大的硬盤或邏輯存儲單元。RAID功能的實現可以用獨立的RAID卡來支持,也可以有效地與主板進行集成。隨着技術的發展,目前RAID已經形成很多個規范,每個規范又可稱作一種級別。
一、基礎概念
在介紹RAID級別之前,有必要先介紹下相關的基礎技術。最重要的就是條帶和IO:條帶是隨着RAID提出來的;IO這里指數據的寫入和讀出,在存儲系統中可以分成很多類別。
1、條帶,Stripe
首先,條帶是虛擬的概念。硬盤物理上划分的最小單位是扇區(以往文章提到過)。而文件系統有時會將多個(2的n次方)扇區作為塊或者簇來作為數據操作的最小單位,即邏輯最小單位。
條帶和扇區、塊沒有必然的關系。但是任何磁盤讀寫都離不開文件系統和硬盤,所以后面會用到扇區、塊這兩個概念。
條帶是將多個並排的磁盤橫向切割,即在每個磁盤相同偏移處橫向邏輯切割。
跨過的磁盤磁盤個數(或塊的個數或字節容量)稱為條帶長度,Stripe Length;或者叫條帶寬度,Stripe Width。
而單個磁盤上占有的區域為段,Segment。
段包含的字節數(或塊的個數或扇區的個數)為條帶深度,Stripe Depth。
條帶化是RAID技術抽象出來的一種設計方法,便於多個磁盤之間建立一種邏輯關系,便於提高IO並發能力。
從上面概念看,條帶長度一般不變,所以整個條帶大小和條帶深度有關,所以條帶深度也指的是條帶的大小,也叫條帶大小。
2、IO相關概念
存儲IO,都是圍繞數據的Input和Output,這里既有最終磁盤的讀寫,也有傳輸的IO,控制器緩存IO等等。這里介紹常見的幾個概念:
(1)IOPS
磁盤的IOPS,即每秒能進行多少次IO。計算方式每個系統每個模塊的定義和要求不一樣。我們這里指一般情況下,一條I或O命令對應磁盤寫或讀一定范圍內連續的數據的操作,除了開始執行讀寫命令前可能需要尋道外,其他時間不需要換道。那么完成一次IO所用的時間=尋道時間+旋轉延遲時間+數據傳輸時間。該值越少,IOPS越高。由於尋道時間相對於傳輸時間要大幾個數量級。所以影響IOPS的關鍵因素是降低尋道時間。而在連續IO的情況下,尋道時間很短,僅在換磁道時候需要尋道,所以此時傳輸時間越少,IOPS越高。
(2)連續IO/隨機IO
連續和隨機指本次IO給出的初始扇區地址和上一次IO結束扇區地址是不是完全連續的或者相隔不多的,是則是連續IO,否則隨機IO。
(3)順序IO/並發IO
磁盤控制器如果可以同時對一個RAID系統中的多塊磁盤同時發送IO指令(這里的同時是宏觀的概念,即如果所有磁盤都在一個總線或者環路上,則這里的同時是指向一塊一塊磁盤依次發送IO指令,只是不必等待每次的回應),並且這些最底層的IO數據包含了文件系統下發的多個IO數據,則為並發IO,即多個IO流同時傳輸和讀寫。
如果這些發向磁盤的IO只包含了文件系統的一個IO的數據,則為順序IO,即一個時間點只有一個IO流傳輸和讀寫。所以我覺得改為“串行IO”更好理解。
二、RAID基本級別
RAID分為8個級別,不同的級別滿足不同的應用程序的需求。
1、RAID 0:並發IO
按條帶化,將數據並行發送給所有磁盤。
最大的優勢,讀寫性能很高。
致命缺點:數據沒有冗余,如果一個磁盤損壞,整個存儲崩潰。
注意:前面提到,這種並發是”宏觀的同時“,RIAD0要提升性能,條帶越小越好。但是太小了,要等待下一輪IO的時間變成長次數變多。因為每次IO占用較多物理盤,而隊列中的IO必須等待這次IO結束后才能使用物理盤。
IO SIZE/Stripe SIZE 較小,性能提升明顯。
2、RAID 1:鏡像IO
RAID 1將數據在兩個以上的磁盤中形成鏡像,讀可以並發,寫一般不能並發,除非事務性寫。
優勢:數據有冗余,讀性能提高。
缺點:有效空間只能占一半,空間利用率低。寫性能有所下降,因為需要寫兩次,所以時間以最慢的磁盤為准。
注:條帶可有可無。
3、RAID 2:漢明碼校驗
Hamming Code ECC漢明碼錯誤檢測與修正,一種早期的糾錯技術。在原有數據位中插入一定數量的校驗位來進行錯誤檢測和糾錯。
RAID 2中,每個IO下發的數據被以位為單位平均打散在所有數據盤上,同時計算出漢明碼並寫入校驗盤。數據盤和校驗盤都有多塊,即有各自的陣列。漢明碼只能糾正一個位的錯誤,所以只允許一個盤損壞。
缺點:校驗盤數量太多(四塊數據盤需要三塊校驗盤),開銷太大以及成本昂貴,目前基本已經被淘汰。
補:磁盤數據以位單位?磁盤的最小單位是扇區512字節,怎么以位為單位呢?假如四個數據盤,如果一次寫入4KB,第一塊存放的是第1.5.9.13等位的數據,第二塊存放的是2.6.10.14等位的數據,如此分割。
RAID 2不能實現並發IO,因為每次IO都占用了所有物理盤。
4、RAID 3:奇偶校驗
對數據磁盤采用高效的XOR運算,將結果放在單獨的校驗盤。所以同樣允許一塊磁盤損壞。
RAID 3分割的單位是字節或者扇區(各個文獻上說法不一樣,總之是比較小),比RAID2增大了,但還是很小。IO傳輸和磁盤讀寫操作和RAID 2類似。
優點:校驗盤只需一塊,成本降低了;持續讀和寫性能幾乎是單盤的N倍。
注:RAID 3和RAID 2一樣不能並發IO,因為一個IO占用所有磁盤。兩者也同樣適合連續大塊IO的環境,而RAID3成本更低,更容易部署。
5、RAID 4
6、RAID 5:並發IO+奇偶校驗
采用和RAID 3一樣的高效的XOR運算,不同的是將校驗數據打散在各個盤,即不是固定某個盤,所以也稱作分布式校驗盤。
正是因為校驗數據位置不固定,所以每次IO可以不需要所有的磁盤參與,從而可以實現並發IO。
所以最低可以並發IO的RAID5至少需要4塊盤。同理,如果數據盤足夠多,校驗盤打散的部分就會分布的足夠廣泛,多IO並發的幾率就會顯著增大。
最大的優勢是,隨機讀性能很高,所有RAID模式中首屈一指。
但是,RAID 5的連續讀性能沒有RAID 3高。
缺點:寫性能較差,根本原因在於每寫一扇區的數據就要產生其校驗扇區,一並寫入校驗區。龍其實更改數據(隨機寫)的時候,這種效應非常明顯,因為要有寫懲罰。
補:(1)寫懲罰(Write Penalty )
RAID 5一次寫的動作,其實要浪費3個其他動作,也就是先讀出老數據,讀出老校驗數據,然后寫新數據和校驗數據。而目的只是寫新數據。
而RAID 2和RAID 3都比RAID 5寫性能強,因為它們在條帶深度很小,任何一次正常點的IO幾乎覆寫所有盤,均會將整個條帶上的位都改變,即不要顧忌是否有未被更新的數據,所以可以直接寫入新數據和校驗數據,比RAID 5少了兩次讀操作。
(2)RAID 5E和RAID 5EE
RAID 5E在RAID 5的基礎上,每個數據盤預留一塊固定的空間,深度為條帶深度,所以也就是說預留一個條帶,作為熱備。當出現磁盤壞塊時,能及時備份數據。
RAID 5EE在RAID 5E的基礎上有所改進:將固定的”熱備盤“打散到各個數據磁盤中。
實際上,現在的LSI工具能支持外圍設置熱備盤,而且可以靈活使用,可以每個RAID組做熱備盤,也可以全部磁盤(多個RAID組)做一個熱備,兩種還可以同時出現。
注:在RAID策略中,隨機並發與寫性能二者取其一。
這里提到的是順序寫。一般的RAID對隨機IO,(特別是隨機寫)其性能與單盤都沒有大的優勢,因為RAID所做的只是提高傳輸速率、並發IO和容錯。
但是RAID 5在隨機寫頻發的情況下,由於頻發的隨機IO提高了潛在的並發幾率,如果碰巧並發的IO同處一個條帶,還可以降低寫懲罰的記錄。這樣其IOPS下降的趨勢比其他RAID級別要平緩一些。
所以,磁盤越多,可並發的幾率越大;RAID 5最適合小塊IO。而若使用“回寫高速緩存”可以讓性能改善不少。
應用:關系型數據、讀密集型數據庫表格、文件共享和Web應用程序。
7、RAID 6:並發IO+雙奇偶校驗
與RAID 5相比,RAID 6增加了第二個獨立的奇偶校驗信息塊。仍然保留RAID 5的條帶化校驗,RAID 6加了另一種奇偶校驗:條帶數據乘以逆矩陣再奇偶校驗(注【1】)。可以同時壞兩個盤。
優點,冗余度更好,提高了可靠性。
缺點,比RAID 5的寫性能更差,因為有更大的寫懲罰,一次寫入需要6次操作。
8、RAID 7
RAID 7全稱叫“Optimized Asynchrony for High I/O Rates as well as high Data Transfer Rates(最優化的異步高I/O速率和高數據傳輸率)”,它與以前我們見到RAID級別具有明顯的區別。RAID 7完全可以理解為一個獨立存儲計算機,它自身帶有操作系統和管理工具,完全可以獨立運行。
二、RAID組合級別
1、RAID 01(RAID 0+1)
RAID 01兼容RAID 0和RAID 1的優點,提供RAID 1一樣的數據安全保證的同時,也提供了與RAID 0近似的存儲性能。
先做RAID 0磁盤組,再2組RAID 0做成RAID 1。假如有八塊盤和四塊數據A,B,C,D;那么八塊盤依次存放的是A,B,C,D;A,B,C,D。
這種情況下,如果第一個A出問題,那么第一組A,B,C,D全都無效了。
可靠性較低。
2、RAID 10(RAID 1+0)
RAID 10和RAID 01基本原理相近,只是組合方式不同。
先兩兩分組,再將各組做成RAID0。還是上面的例子,假如有八塊盤和四塊數據A,B,C,D;那么八塊盤依次存放的是A,A,B,B,C,C,D,D。
這種情況下,如果第一個A出問題,除了第二個A沒有鏡像外,其他都沒有影響。允許壞多個盤,只要不是一對磁盤壞就可以。
可靠性高,所以RAID 10遠較RAID 01常用。
3、RAID 30
提升RAID 3的並發IO能力,兩組RAID 3再組建成RAID 0。兼容RAID 0並發IO和RAID 3安全的優點。
4、RAID 50
由兩組RAID 5磁盤組成(每組最少3個),每一組都使用了分布式奇偶位,而兩組硬盤再組建成RAID 0,實現跨磁盤抽取數據。
RAID 50最少需要6塊磁盤,它最適合需要高可靠性存儲、高讀取速度、高數據傳輸性能的應用。這些應用包括事務處理和有許多用戶存取小文件的辦公應用程序。
5、RAID 53
從前面的原理我們可以得出 :RAID 5 適合小塊存儲,RAID 3適合大塊存儲;所以從這里看兩者是有沖突的,而從百度百科查到RAID53的定義是:
RAID 53是一種組合RAID 等級,但不要拿RAID 10的觀點套用,認為它是RAID 5和RAID 3的組合,事實上,RAID 53應該稱為RAID 30或RAID 03(也可以說是RAID 0+3),即RAID 3與RAID 0的組合。
也可以理解成RAID53兼容了RAID 3較高的讀寫性能和RAID 5良好的並發能力。
6、RAID: LSI MegaRAID、Nytro和Syncro
MegaRAID、Nytro和Syncro都是LSI 針對RAID而推出的解決方案,並且一直在創造更新。LSI通過MegaRAID提供基本的可靠性保障;通過Nytro實現加速;通過Syncro突破容量瓶頸,讓價格低廉的存儲解決方案可以大規模擴展,並且進一步提高可靠性。
注【1】:關於RAID 6第二種校驗查過很多資料, 大都含糊其辭,或者說法各不相同。很多的只是說整塊磁盤的奇偶校驗,這個明顯說不過去。有一些說的是多項式,有一些說的矩陣。待考究。
參考資料:《大話存儲II》和百度百科。