RAID 10(又叫RAID 1+0或鏡像條帶)陣列結合了RAID 0和RAID 1二者的功能特性,從而提供了高性能、容錯的磁盤輸入/輸出操做。在RAID 0中,讀取/寫入操做跨多個驅動器並路執行;在RAID 1中,如出一轍的數據寫入到兩個或多個驅動器上。html
在本教程中,我將介紹如何使用5只相同的8 GiB磁盤,構建一個軟件RAID 10陣列。雖然用來構建RAID 10陣列的最大磁盤數量是4只(好比一組條帶化的兩個鏡像),但咱們將增添一隻額外的備用驅動器,以防其中一個主驅動器出現故障。咱們還將介紹一些工具,你之後能夠用來分析RAID陣列的性能。linux
請注意:全面深刻地介紹RAID 10及其餘分區方案(以及不一樣尺寸的驅動器和文件系統)的全部優缺點不在本文的探討範圍以內。數據庫
RAID 10陣列是如何工做的?緩存
若是你須要實施一種支持輸入/輸出密集型操做(好比數據庫、電子郵件和網站服務器)的存儲解決方案,RAID 10是正確的選擇。下面會介紹其中原委。不妨先看一看下圖。服務器
鏡像1和鏡像2的條帶併發
設想一下某個文件由上圖中的數據塊A、B、C、D和E組成。每一個RAID 1鏡像集(好比鏡像1或鏡像2)將數據塊複製到兩個設備中的每個。因爲這種配置,寫入性能有所降低,由於每一個數據塊都要寫入兩次,每隻磁盤各寫入一次,而相比從單隻讀盤讀取數據,讀取性能依然沒有變化。優勢在於,這種方案提供了冗餘性,由於除非每一個鏡像中的多隻磁盤出現故障,不然能夠維持正常的磁盤輸入/輸出操做。工具
RAID 0條帶的工做原理是,把數據劃分紅多個數據塊,並將數據塊A寫入到鏡像1,同時將數據塊B寫入到鏡像2,依次類推,於是提升了整體的讀取和寫入性能。另外一方面,沒有一個鏡像含有向主集提交的任何一部分數據的完整信息。這意味着,若是其中一個鏡像出現故障,整個RAID 0組件(以及於是RAID 10集)就沒法操做,數據出現沒法恢復的丟失。佈局
構建RAID 10陣列性能
RAID 10陣列有兩種可能的構建方案:複雜方案(只要一步就能構建),或嵌套方案(構建方法是,先構建兩個或多個RAID 1陣列,而後把它們用做RAID 0中的組件設備)。在本教程中,咱們將介紹構建複雜的RAID 10陣列,緣由在於這種陣列讓咱們可使用數量爲奇數或偶數的磁盤,而且能夠做爲單一RAID設備來加以管理,而不是介紹嵌套方案(只容許數量爲偶數的驅動器,必須做爲嵌套設備來加以管理, RAID 1和RAID 0分開來處理)。測試
假設你已安裝了mdadm,該後臺程序在你的系統上運行。想了解詳細內容,請參閱這篇教程:http://xmodulo.com/create-software-raid1-array-mdadm-linux.html。另外假設已在每隻磁盤上建立了主分區sd[bcdef]1。於是,ls -l /dev | grep sd[bcdef]的輸出應該是這樣:
接下來使用下面這個命令,構建一個RAID 10陣列:
# mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sd[bcde]1 --spare-devices=1 /dev/sdf1
該陣列構建完畢後(構建過程應該用不了幾分鐘),# mdadm --detail /dev/md0的輸出應該是這樣:
在咱們繼續下一步以前有幾點須要予以說明。
1. Used Dev Space代表了陣列所使用的每一個成員設備的容量。
2. Array Size是指陣列的總大小。就RAID 10陣列而言,這至關於(N*C)/M,其中N是指活動設備的數量,C是指活動設備的容量,M則指每一個鏡像中的設備數量。因此在這裏,(N*C)/M至關於(4*8GiB)/2 = 16GiB。
3. Layout指數據佈局的具體細節。可能的佈局值以下所示。
•n(默認選項):意味着 near拷貝。一個數據塊的多個拷貝在不一樣的設備中處於類似的偏移(offset)。這種佈局提供的讀取和寫入性能與RAID 0陣列的性能類似。
•o代表offset拷貝。不是數據段在條帶裏面複製,而是整個條帶被複制,但由一個設備輪轉,那樣重複數據塊分佈在不一樣的設備上。於是,隨後的數據塊拷貝在下一個驅動器中,下移一個數據段。想讓你的RAID 10陣列使用這種佈局,將--layout=o2添加到用來構建陣列的命令。
•f 代表far拷貝(偏移全然不一樣的多個拷貝)。這種佈局提供了較好的讀取性能,卻提供了較差的寫入性能。於是,這種方案最適合須要支持的讀取操做比寫入操做多得多的系統。想讓你的RAID 10陣列使用這種佈局,將--layout=f2添加到用來構建陣列的命令。
--layout選項中n、f和o後面所跟的數字代表了所需的每一個數據塊的副本數量。默認值是2,但它能夠是磁盤中設備數量的2倍數。經過提供數量足夠的副本,你就能儘可能減小單個驅動器的輸入/輸出影響。
4. Chunk Size,按照Linux RAID維基,數據段大小(chunk size)指寫入到設備的最小單位的數據。最優化的數據段大小取決於輸入/輸出操做的速度以及相關文件的大小。若是寫入大文件,只要確保數據段至關大,有望看到較低的開銷,而主要存儲小文件的陣列有望更加得益於較小的數據段。想爲你的RAID 10陣列指定某個數據段大小,將--chunk=desired_chunk_size添加到用來構建陣列的命令。
遺憾的是,沒有包羅萬象的方法能夠提高性能。下面是值得考慮的幾個指導準則。
•文件系統:總的來講,XFS聽說是最好的文件系統,而EXT4仍然是個不錯的選擇。
•最佳化佈局:far佈局提高了讀取性能,但下降了寫入性能。
•副本數量:更多的副本儘可能減少了輸入/輸出影響,但須要更多的磁盤時也增長了成本。
•硬件:固態硬盤比傳統的旋轉磁盤更有可能顯示性能提高的優勢(在同一環境下)。
使用DD測試RAID性能
下列基準測試能夠用來覈查咱們的RAID 10陣列(/dev/md0)的性能。
1. 寫入操做
256MB大小的單個文件被寫入到設備上:
# dd if=/dev/zero of=/dev/md0 bs=256M count=1 oflag=dsync
512字節被寫入1000次:
# dd if=/dev/zero of=/dev/md0 bs=512 count=1000 oflag=dsync
因爲dsync標記,dd繞過系統文件緩存,執行同步寫入到RAID陣列的操做。這個選項用來消除RAID性能測試期間的緩存效應。
2. 讀取操做
256KiB*15000(3.9 GB)從陣列拷貝到/dev/null:
# dd if=/dev/md0 of=/dev/null bs=256K count=15000
使用Iozone測試RAID性能
Iozone(http://www.iozone.org)是一種文件系統基準測試工具,讓咱們能夠測量的衆多磁盤輸入/輸出操做,包括隨機讀取/寫入、順序讀取/寫入和從新讀取/從新寫入。它能夠將結果導出到微軟Excel或LibreOffice Calc文件。
將Iozone安裝到CentOS/RHEL 7上
啓用Repoforge軟件庫,而後執行下列命令:
# yum install iozone
將Iozone安裝到Debian 7上
# aptitude install iozone3
下面這個iozone命令將在RAID-10陣列中執行全部測試:
# iozone -Ra /dev/md0 -b /tmp/md0.xls
•-R:生成與Excel兼容的報告,併發送到標準輸出設備。
•-a:在全自動模式下運行iozone,涵蓋全部測試和可能的記錄/文件大小。記錄大小:4k至16M,文件大小:64k至512M。
•-b /tmp/md0.xls:將測試結果存儲在某個指定的文件。
希望本文有所幫助。若是您對於提高RAID 10的性能方面有何想法或高招,歡迎交流。