闡述
RAID 0+1 和 RAID 1+0有什么區別呢?
RAID 0+1是先讓磁盤組內的成員組成RAID 0條帶化,然后磁盤組之間為RAID 1鏡像關系。
RAID 1+0是先讓磁盤組內的成員組成RAID 1互為鏡像,然后磁盤組之間RAID 0條帶化。
RAID 0+1
RAID 1+0
除了構成先后的差別外,主要的區別還表現在容錯性上。
RAID 0+1 的損壞一塊磁盤之后,所在的RAID 0組即認為損壞,RAID 0+1 實際上已經退化為一個RAID 0 的結構,此時,上面那組RAID 0隨便壞一塊,整個RAID就崩潰了。
RAID 0+1 故障演示
相對來說,RAID 1+0 就不會有這個問題,只要同一個RAID 1組內硬盤不全不損壞,整個RAID就不會有問題,在圖中可以認為,只要右上角的那塊磁盤不壞,整個RAID就不會崩潰。
RAID 1+0 故障演示
所以使用RAID 1+0比RAID 0+1具有更好的容錯性,
RAID10 is "striped mirrors", e.g. (1=2)+(3=4).
RAID0+1 is "mirrored stripes", e.g. (1+2)=(3+4).
磁盤 RAID10 / RAID5 配置下的IOPS對比
磁盤的IOPS對比
假定一個case,業務的iops是10000,讀cache命中率是30%,讀iops為60%,寫iops為40%,磁盤個數為120,那么分別計算在raid5與raid10的情況下,每個磁盤的iops為多少。
raid5:
單塊盤的iops = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
= (4200 + 16000)/120
= 168
這里的10000*(1-0.3)*0.6表示是讀的iops,比例是0.6,除掉cache命中,實際只有4200個iops。
4 * (10000*0.4) 表示寫的iops,因為每一個寫,在raid5中,實際發生了4個io,所以寫的iops為16000個
為了考慮raid5在寫操作的時候,那2個讀操作也可能發生命中,所以更精確的計算為:
單塊盤的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
= (4200 + 5600 + 8000)/120
= 148
計算出來單個盤的iops為148個,基本達到磁盤極限
raid10
單塊盤的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
= (4200 + 8000)/120
= 102
可以看到,因為raid10對於一個寫操作,只發生2次io,所以,同樣的壓力,同樣的磁盤,每個盤的iops只有102個,還遠遠低於磁盤的極限iops。
RAID5與RAID10詳細對比
- 為了方便對比,我這里拿同樣多驅動器的磁盤來做對比,RAID5選擇3D+1P的RAID方案,RAID10選擇2D+2D的RAID方案。
RAID5與RAID10都是當前主流的磁盤陣列方案那么他們有什么不同呢?這里,我就這兩種RAID的內部運行原理來分析一下,我們在什么情況下應當適合選哪一種RAID方式。
為了方便對比,我這里拿同樣多驅動器的磁盤來做對比,RAID5選擇3D+1P的RAID方案,RAID10選擇2D+2D的RAID方案,分別如圖:
RAID5選擇3D+1P的RAID方案,RAID10選擇2D+2D的RAID方案
那么,我們分析如下三個過程:讀,連續寫,隨機寫,但是,在介紹這三個過程之前,我需要介紹一個特別重要的概念:cache。
cache技術最近幾年,在磁盤存儲技術上,發展的非常迅速,作為高端存儲,cache已經是整個存儲的核心所在,就是中低端存儲,也有很大的cache存在,包括最簡單的RAID卡,一般都包含有幾十,甚至幾百兆的RAID cache。
cache的主要作用是什么呢?體現在讀與寫兩個不同的方面,如果作為寫,一般存儲陣列只要求寫到cache就算完成了寫操作,所以,陣列的寫是非常快速的,在寫cache的數據積累到一定程度,陣列才把數據刷到磁盤,可以實現批量的寫入,至於cache數據的保護,一般都依賴於鏡相與電池(或者是UPS)。
cache的讀一樣不可忽視,因為如果讀能在cache中命中的話,將減少磁盤的尋道,因為磁盤從尋道開始到找到數據,一般都在6ms以上,而這個時間,對於那些密集型io的應用可能不是太理想。但是,如果cache能命中,一般響應時間則可以在1ms以內。
不要迷信存儲廠商的iops(每秒的io數)數據,他們可能全部在cache命中的基礎上做到的,但是實際上,你的cache命中率可能只有10%。
介紹完cache,我們就可以解釋RAID5與RAID10在不同的模式下,工作效率問題了,那么我們來分別分析以上三個問題。
1、讀操作
因為RAID5與RAID10的磁盤都可以提供服務,所以,在讀上面他們基本是沒有差別的,除非是讀的數據能影響cache命中率,導致命中率不一樣。
讀操作
2、連續寫
連續寫的過程,一般表示寫入連續的大批量的數據,如媒體數據流,很大的文件等等,這個寫操作過程,如果有寫cache存在,並且算法沒有問題的話,RAID5比RAID10甚至會更好一些(這里要假定存儲有一定大小足夠的寫cache,而且計算校驗的cpu不會出現瓶頸)。因為這個時候的校驗是在cache中完成,如4塊盤的RAID5,可以先在內存中計算好校驗,同時寫入3個數據+1個校驗。而RAID10只能同時寫入2個數據+2個鏡相。
連續寫
如,4塊盤的RAID5可以在同時間寫入1、2、3到cache,並且在cache計算好校驗之后,我這里假定是6(實際的校驗計算並不是這樣的,我這里僅僅是假設),同時把三個數據寫到磁盤。而4塊盤的RAID10不管cache是否存在,寫的時候,都是同時寫2個數據與2個鏡相。
但是,我前面也說過了,寫cache是可以緩存寫操作的,等到一定時期再寫到磁盤,但是,寫操作不比讀操作,這個寫是遲早也要發生的,也就是說,最后落到磁盤上的寫還是避免不了的,不過,如果不是連續性的強連續寫,只要不達到磁盤的寫極限,差別都不是太大。
3、離散寫
這里可能是最難理解,但是,也是最重要的部分,數據庫,如oracle 數據庫大部分操作就是離散寫,如每次寫一個數據塊的數據,如8K;聯機日志雖然看起來是連續寫,但是因為每次寫的量不多,不保證能添滿RAID5的一個條帶(保證每張盤都能寫入),所以很多時候也是離散寫入。
離散寫
我們再接上圖,假定要把一個數字2變成數字4,那么對於RAID5,實際發生了4次io,先讀出2與校驗6,可能發生讀命中然后在cache中計算新的校驗寫入新的數字4與新的校驗8
對於RAID10,我們可以看到,同樣的單個操作,最終RAID10只需要2個io,而RAID5需要4個io。
但是,這里我忽略了RAID5在那兩個讀操作的時候,還可能會發生讀命中操作,也就是說,如果需要讀取的數據已經在cache中,可能是不需要4個io的,也證明了cache對RAID5 的重要性,不僅僅是計算校驗需要,而且對性能的提升由為重要。曾經測試過,在RAID5的陣列中,如果關閉寫cache,RAID5的性能將差很多倍。
這里,並不是說cache對RAID10就不重要了,因為寫緩沖,讀命中等,都是提高速度的關鍵所在,不過的是,RAID10對cache的依賴性沒有RAID5那么明顯而已。
到這里,大家應當也大致明白了RAID5與RAID10的原理與差別了,一般來說,象小io的數據庫類型操作,建議采用RAID10,而大型文件存儲,數據倉庫,則從空間利用的角度,可以采用RAID5。
如果是以大量的事務性的操作,在典型的OLTP 環境里,我們考慮RAID10更好些,因為OLTP 環境,IO 性能上我們考慮的主要方面。對於典型的數據倉庫環境,OLAP 環境,我們選擇RAID5 ,因為從空間上來說,RAID5更合適。
隨着服務器硬件的功能變得越來越強大,而價格一路急劇下跌,許多公司(尤其是小公司)發現如今購買數據庫服務器面臨眾多選擇。這意味着,經驗相對欠缺的數據庫管理員們也被要求設計功能越來越強大的系統。你在為大型系統設計數據庫系統時,能夠買到有許多硬盤和充足內存的大型數據庫服務器。以下是你在設計系統時應當遵守的一些基本原則。
•存儲系統
人們在設計磁盤陣列時最常犯下的錯誤就是,只計算所需的閑置容量。閑置容量只是設計存儲子系統時要考慮的一部分而已;另一個部分就是存儲系統需要支持的輸入/輸出操作次數。
應當遵守的一條基本原則就是,寫操作頻繁的數據庫最好使用RAID 10陣列,而讀操作頻繁的數據庫通常最好使用RAID 5陣列。原因在於,如果把數據寫到RAID 5陣列,性能會受到影響。由於把數據寫到RAID 5陣列上,存儲系統必須在寫數據之前計算出奇偶檢驗位,而算出奇偶檢驗位需要相當長的時間,這意味着寫到RAID 5陣列上的性能會降低。
由於這種性能影響,我們總是建議你應當把事務日志放到RAID 10陣列上。事務日志是寫操作始終很頻繁的文件,不管數據庫是以讀操作為主的數據庫,還是以寫操作為主的數據庫。tempdb數據庫也應當放在RAID 10陣列上,具體來說放在與事務日志文件所在陣列不同的另一個RAID 10陣列上。
對每個磁盤陣列進行分區時,應當確保分區正確對齊。默認情況下,Windows 2003及以下版本沒有正確對齊分區,這會導致磁盤子系統的性能達不到最理想水平。可以通過使用DiskGenius實用程序創建分區來解決這個問題。這樣創建的每個分區其對齊偏移量應為64kb;在默認情況下,創建的每個分區其對齊偏移量為32kb。Windows 2008在默認情況下創建的分區其對齊偏移量為128kb。
•物理數據庫構建
微軟最近開始推薦使用的一項比較新的技術就是,針對兩個至四個CPU核心當中的每個核心,數據庫應當有一個物理數據庫文件。應當為數據庫里面的每個文件組做到這一點。
如果你的服務器有兩個四核CPU,那么共有八個核心。我們假定數據庫有兩個文件組,一個名為Data,另一個名為Indexes。那么每個文件組都應當有兩個至四個物理文件。這項技術讓SQL Server可以對磁盤輸入/輸出進行優化。可能的話,你應當盡量分散文件,以便位於每個存儲陣列上的文件盡可能少。
tempdb數據庫的配置應有點不同。配置tempdb數據庫時,建議針對每個CPU核心,數據庫應當有一個物理文件。這樣系統就可以為tempdb數據庫盡量加快輸入/輸出操作。與用戶數據庫一樣,放在每個磁盤陣列上的文件也應當盡可能少。
你在數據庫里面應當始終至少有兩個文件組。第一個文件組包括表,第二個組包括索引。你需要讓它們位於不同的文件組,那樣查詢索引時,裝入到表的操作不會受到影響,反之亦然