企業級的數據庫應用大多部署在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的奇偶校驗。很顯然,這樣子成本也會高一些。
mysql
固然,這就和咱們講架構時候常常說的「負載均衡、高可用集羣,橫向擴展,縱向擴展」的目的其實很相似。通俗點來說,都是爲了實現不間斷的工做,保證數據完整性和高可用性,並且最重要的,還要能分攤壓力。忽然讓我想起了上初中物理時候學的「串聯和並聯」,有點像哦。順便講個丟人的笑話,也是個人真實經歷,N年前,某日和某大師在一塊兒抽菸、吹牛、瞎侃,大師瞎侃說」google光是在中國目前有XX臺服務器集羣......「,當時我並不理解什麼叫「集羣」,第一反應就是這麼多臺服務器之間究竟是「串聯「的仍是」並聯」的關係呢?算法
說到最後,可能某些朋友已經不耐煩了。好像本文只是在不停的解釋常見RAID的和其好處,而並沒說起到sqlserver或者windows存儲相關的內容。你們都知道,I/O每每是數據庫性能最大的瓶頸, 有時候其實很簡單,只須要將sqlserver所在的db server上部署合適的RAID,並將數據庫文件分佈到不一樣的磁盤上,就能很大程度的提高數據庫的性能,真可謂是立竿見影。有興趣的朋友,不妨本身實際動手實踐一下,網上這方面的資料也不少。其實RAID成本並不高(和DELL、EMC等等那些高端的存儲比起來真是「廉價」)。sql
甚至本身在家裏PC機上,也能夠經過陣列卡的方式來實現(效果可能不太好)。目前通常的PC服務器,內置都會有RAID支持,在PC服務器領域使用很是普遍。數據庫
本文出自http://blog.csdn.net/dinglang_2009,
windows