企業級的資料庫應用大多部署在RAID磁碟陣列的伺服器上,這樣能提高磁碟的訪問效能,並能夠實現容錯/容災。
RAID(冗餘磁碟陣列),簡單理解,就是拿一些廉價的硬碟來做成陣列。其目的無非是為了擴充儲存容量,提升讀寫效能,實現資料冗餘(備份容災)。就像很早就有老外拿N台舊PC,做成一個強大的“伺服器叢集”。RAID技術誕生於1987年,由美國加州大學伯克利分校提出。
主流的大概可以分為幾個層級:RAID 0,RAID 1,RAID 5,RAID 10 。配置起來也不是很複雜,有興趣和條件的朋友可以找相關的資料,自己動手實踐。
SQL Server 2005常用的有幾個層級0,1,5,10 下面我來簡單說說這個幾個層級的區別及其應用。
RAID 0 簡稱磁碟條帶化,它可以提供最好的讀寫效能,如果你把兩塊磁碟做成了RAID0,那麼在寫入資料的時候,就可以同時對A磁碟和B磁碟執行寫入操作。這裡我必須說明的是:“可以同時...寫入操作”,並不是意味著將檔案的相同內容“在同一時間內完全寫入”A磁碟和B磁碟中。打個比方:有一個100M的檔案需要寫入磁碟中,假設單個磁碟的寫入速度是10M/S,那麼需要10秒鐘才能完成寫入工作。但如果在具有A、B兩塊磁碟的 RAID 0陣列環境中,(以秒/S為最小單位的)單時間內,可以將10M內容寫入A磁碟中,並同時將緊隨的10M內容寫入B磁碟中,這樣算起來,寫入速度變成了 20M/S,只需要5秒鐘就能搞定了,而且每塊磁碟中只需儲存50M的檔案內容,不會造成硬碟儲存壓力。當然,上訴例子也許不恰當,也只是指的理論環境下,實際環境中會有很多其他因素,效率肯定不能達到。
毋庸置疑的是,這樣肯定是能提高讀寫效能的,但是這樣也帶來了一個問題就是,如果其中的一部分資料丟失了,你的全部資料都不會找回來的,因為RAID0沒有提供冗餘恢複資料的策略。所以RAID0可以用在唯讀資料庫資料表,或者是經過複製過來的資料庫上,如果你對資料丟失不敏感的話,也可以使用RAID 0,總之這個level下是高效能、無冗餘。
RAID 1 磁碟鏡像 它對讀沒有什麼影響,如果有兩塊磁碟它只對寫有影響,因為它採用了一塊磁碟做冗餘備份的方法,這樣如果你有兩塊50G的磁碟,那麼加起來就是100G,但是在RAID 1下,那麼你只能使用50G ,這種方法會影響磁碟的空間使用,降低了I/O 寫的效能。通俗點來講:你將一個100M的檔案寫入RAID 1時,講內容寫入A磁碟的同時,也會將相同的內容寫入B磁碟中。 這樣一來,兩塊磁碟的內容是完全一致的(這就傳說中的”冗餘“,並不是什麼高深的東西)。本來只需要寫入1塊硬碟的,可是現在要寫入到兩塊硬碟去,效率肯 定會變低。至於“讀”操作,RAID 1環境下,讀取時候只使用到了一塊硬碟,所以和普通的環境下沒啥區別(如果兩塊硬碟都能夠同時工作,那麼還可以分攤壓力的)。只是當第一個硬碟資料損毀或 者掛掉了,就啟動第二塊硬碟。當然,兩塊硬碟都掛了,那就真的崩潰了。哈哈。值得一提的是,有些書或者文章上講,RAID 1是在將第一塊硬碟寫入完成後,才將資料完整複製到第二塊磁碟中做為鏡像備份的這種說法有待考證,按我的理解,是同時複製寫入的。
RAID 5 與RAID1 不同之處就是多了同位,所有的同位的資訊會遍布各個磁碟,效能上要比RAID1高些,但是一旦發生磁碟I/O失敗,就會造成效能急劇下降,同時這 種方法也在RAID0 與RAID1間折了中,是比較通用的做法。 用簡單的語言來表示,至少使用3塊硬碟(也可以更多)組建RAID5陣列,當有資料寫入硬碟的時候,按照1塊硬碟的方式就是直接寫入這塊硬碟的,如果是 RAID5的話這次資料寫入會分根據演算法分成3部分,然後寫入這3塊硬碟,寫入的同時還會在這3塊硬碟上寫入校正資訊,當讀取寫入的資料的時候會分別從3 塊硬碟上讀取資料內容,再通過檢驗資訊進行校正。當其中有1塊硬碟出現損壞的時候,就從另外2塊硬碟上儲存的資料可以計算出第3塊硬碟的資料內容。也就是說RAID5這種儲存方式只允許有一塊硬碟出現故障,出現故障時需要儘快更換。當更換故障硬碟後,在故障期間寫入的資料會進行重新校正。 如果在未解決故障又壞1塊,那就是災難性的了。
RAID 10 (也叫RAID 0+1 )就是RAID0 與 RAID1的組合,它提供了高效能,高可用性, 效能上要比RAID5好,特別適合大量寫入的應用程式,但是就是成本比較高無論是多少塊磁碟你都是將損失一半的磁碟儲存。按照我的理解,至少需要4塊硬碟 才能完成,A和B做資料分割,分別儲存一半的資料,C和D分別對應做A和B的鏡像備份。這樣一來,可真是完美了,也是我理想中的最佳狀態。也不需要 RAID 5的同位。很顯然,這樣子成本也會高一些。還有一點很遺憾的就是效能的”短板效應“,這個似乎不那麼容易改善,除非有類似於”負載平衡”裝置的控制器和合理的控制演算法。
當然,這就和我們經常說的“負載平衡、 高可用叢集,橫向擴充,縱向擴充”的目的其實很類似。都是為了實現不間斷的工作,保證資料安全性,而且還要分攤壓力。