RAID是“Redundant Array of Independent Disk”的縮寫,翻譯過來叫做獨立磁盤的冗余陣列,其實就是磁盤的存儲、訪問、備份技術。在談RAID之前,先簡單學習一下存儲器的一些基礎知識。
1、存儲器基礎
說到存儲器,顧名思義,就是用來存儲數據的,市場上存儲器的種類也很多,但也可以大致分為兩類:易失性存儲器和非易失性存儲器,前者掉電數據即會丟失,後者掉電數據仍然還在,這是由存儲器的介質決定的;一般來說,易失性存儲器的存取速度會明顯高於非易失性存儲器,當然價格也高。我們先了解一下計算機系統中存儲器的層次結構,下圖是任何一本講計算機系統的書中都會給出的一幅存儲器層次圖,越上層(金字塔的頂層)的存儲器速度越快,當然每字節的成本也越高;越下層(金字塔底層)的存儲器速度越慢,每字節的成本越便宜。
速度最快的莫過於位於CPU中的寄存器了,因為昂貴,所以只有幾十個字節。
位於L1,L2,L3層的是高速緩存,高速緩存的速度也很快,它是由SRAM(靜態隨機存儲器)實現的,CPU訪問高速緩存只需要幾ns,由於價格相對較貴,所有只有幾M~幾十M的存儲空間。
位於L4層的是主存,運行速度雖然沒有緩存快,但是價格也便宜了很多,它是由DRAM(動態存儲器)實現的,所有現代計算機中一般有幾個G的主存大小,CPU訪問主存的速度一般在幾十ns~上百ns之間。
存儲器主要分為兩類:易失性和非易失性存儲器。在計算機系統中,易失性存儲器主要包括高速緩存、主存,易失性一般由隨機存儲器(RAM)來實現。RAM又分為靜態RAM(SRAM)和動態RAM(DRAM),SRAM比DRAM速度快,但是價格也相對較貴。高速緩存用的就是SRAM,而主存用的是DRAM。非易失性存儲器主要包括磁盤、固態硬盤、光盤、磁帶、軟盤等。
位於L5層的是本地磁盤,本地磁盤一般使用的是機械存儲,也就是說,訪問磁盤會產生機械損耗,在磁盤和內存之間傳輸一個字節大概需要10ms。數據庫的數據一般也是存儲在磁盤上,所以為了減少因為數據庫的增刪查改操作帶來的訪問磁盤所需要的時間損耗,我們需要建立一系列的算法和數據結構來維護數據庫。
磁盤是由盤片構成的,每個盤片有兩個面,每個面又被劃成很多同心圓,每個同心圓稱為磁道,每個磁道又被間隙分割成圓的片段,叫做扇區。扇區是磁盤的最小的不可分割的單位。每個盤面都有一個磁頭用來讀寫盤面上的數據,主存需要訪問磁盤上的數據時,由磁盤驅動器來控制,數據是存儲在一個盤面的某個磁道的某個扇區中的,所以,我們得把磁頭移動到對應的磁道上,這叫做尋道,尋道所消耗的時間叫做尋道時間;當把磁頭移動到對應的磁道時,我們還得旋轉到對應的扇區,旋轉到對應扇區所帶來的延遲,稱為旋轉延遲;數據所在扇區和扇區間的空隙經過磁頭所需要的時間叫做傳輸時間。
所以一次訪問磁盤所需的時間為:尋道時間+旋轉時間+傳輸時間。這個其實主要由磁盤旋轉速度、扇區數等來決定,一般7200轉/min,扇區空隙占10%的磁盤平均訪問時間大概是10ms。
因為磁盤的非易失性,成本低等一些優點,所以目前幾乎所有的數據存儲和備份用的都是磁盤。
2、通過冗余來提高可靠性
任何設備都有可能發生故障,存儲器當然也不例外。如何解決可靠性??答案是冗余。實現冗余最簡單的辦法就是復制每一張盤,這就是所謂的鏡像。一張邏輯磁盤由兩張物理磁盤組成,每次寫操作都要在兩張磁盤上執行。如何其中一張磁盤發生了故障,我們就可以從另外一張磁盤讀數據。只有在第一張磁盤發生故障了,並且在它修復之前,第二張磁盤也發生了故障,數據才會真正丟失。我們用平均故障時間(這裡的故障指數據丟失)來評價鏡像技術的性能,平均故障時間主要依賴於每張磁盤的平均故障時間和平均修復時間(替換發生故障的磁盤並恢復磁盤上的數據所用的時間)。
假設兩張磁盤發生故障相互獨立,一張單獨的磁盤的平均故障時間為100 000小時,平均修復時間是10小時,則鏡像磁盤的平均故障時間是100 0002/(2*10)=500*106小時,也就是57000年。當然這只是在理想情況下,還有考慮其他因素。
3、通過並行來提高性能
磁盤成本低,但是訪問速度有限,每次訪問的平均時間是10ms左右,非常影響了系統的性能,如何提高磁盤訪問速度?通過並行訪問,處理讀數據的速度將翻倍,因為讀請求可以發送到任意一張盤中。每個讀操作的傳輸速率和單一磁盤系統中的傳輸速率一樣,只是單位時間內讀操作的數目翻倍了。一般通過在多個磁盤上進行數據拆分來提高傳輸速率。
數據拆分的形式也有很多:將每個字節按比特分開,存儲到多個磁盤上,叫做比特級拆分。將塊拆分到多張磁盤上,叫做塊級拆分。
塊級拆分是最常用的拆分形式。當我們要將8個邏輯塊存存儲到磁盤上時,我們可以把它們分別存儲到編號為0,1,2,3四張磁盤上,第i塊數據存儲在第(i mod 4)張磁盤上,這樣我們每次讀這些數據時,我們可以從4張磁盤平行讀取。
不管什麼形式,並行磁盤系統都是通過一下原理來提高性能的:
(1) 負載平衡多個小的訪問操作,以提高訪問操作的吞吐量
(2) 並行執行大的訪問操作,以減少大訪問操作的響應時間
4、RAID
鏡像雖然具有很高的可靠性,但是每一張邏輯盤都需要兩張物理盤,成本太高;數據拆分雖然提高了速率,但是並沒有保證可靠性。於是又提出了一系列的替換方案,這些方案具有不同的成本和性能之間的權衡,並且把這些方案分為若干個RAID級別。這些方案其實都是基於奇偶校驗和數據拆分的思想。
5、如何選擇RAID級別
具體問題具體分析,一般在應用中主要考慮以下因素:
(1) 所需額外存儲帶來的花費
(2) 在I/O操作數量方面的性能需求
(3) 磁盤故障事的性能
(4) 數據重建過程(故障恢復)中的性能
RAID 0級別只能用於數據安全性要求不高的應用中;
RAID 3級是對RAID 2級的改進,RAID 5級是對RAID 4級的改進,我們只需要考慮RAID 3級和RAID 5級即可。RAID 3級是比特級拆分,RAID是塊級拆分,塊級拆分對於大量數據的傳輸有與RAID 3級同樣好的傳輸速率,對少量數據的傳輸使用更少的磁盤。RAID 6級比RAID 5級有著更高的可靠性,可以用於數據安全十分重要的應用。RAID 1級提供了最好的寫操作性能,RAID 5級比RAID 1級具有更低的存儲負載,但是寫操作需要更高的時間開銷,所以RAID 5級應用與進行讀操作,而寫操作較少的應用上。
如何在Linux上構建 RAID 10陣列 http://www.linuxidc.com/Linux/2014-12/110318.htm
Debian軟RAID安裝筆記 - 使用mdadm安裝RAID1 http://www.linuxidc.com/Linux/2013-06/86487.htm
常用RAID技術介紹以及示例演示(多圖) http://www.linuxidc.com/Linux/2013-03/81481.htm
Linux實現最常用的磁盤陣列-- RAID5 http://www.linuxidc.com/Linux/2013-01/77880.htm
RAID0+1和RAID5的性能測試結果 http://www.linuxidc.com/Linux/2012-07/65567.htm
Linux入門���程:磁盤陣列(RAID) http://www.linuxidc.com/Linux/2014-07/104444.htm