如何在Linux上構建 RAID 10陣列

Gabriel Cánepa發表於2014-12-10

RAID 10陣列(又名RAID 1+0 或先映象後分割槽)透過結合RAID 0 (讀寫操作在多個磁碟上同時並行執行)和RAID 1(資料被完全相同地寫入到兩個或更多的磁碟)兩者的特點實現高效能和高容錯性的磁碟I/O。

這篇文章會指導你如何使用五塊相同的8GB磁碟來組成一個軟體RAID 10陣列。因為組成一個RAID 10陣列至少需要4塊磁碟(比如,兩個映象各有一對分割槽組合),而且需要新增一塊額外的備用磁碟以防某塊主要的磁碟出錯。本文也會分享一些工具,在稍後用來分析RAID陣列的效能。

注意RAID 10的優缺點和其它分割槽方法(在不同大小的磁碟和檔案系統上)的內容不在本文討論範圍內。

Raid 10 陣列如何工作?

如果你需要實現一種支援I/O密集操作(比如資料庫、電子郵件或web伺服器)的儲存解決方案,RAID 10就是你需要的。來看看為什麼這麼說,請看下圖。

上圖中的檔案由A、B、C、D、E和F六種塊組成,每一個RAID 1映象對(如映象1和2)在兩個磁碟上覆制相同的塊。在這樣的配置下,寫操作效能會因為每個塊需要寫入兩次而下降,每個磁碟各一次;而讀操作與從單塊磁碟中讀取相比並未發生改變。不過這種配置的好處是除非一個映象中有超過一塊的磁碟故障,否則都能保持冗餘以維持正常的磁碟I/O操作。

RAID 0的分割槽透過將資料劃分到不同的塊,然後執行同時將塊A寫入映象1、將塊B寫入映象2(以此類推)的並行操作以提高整體的讀寫效能。在另一方面,沒有任何一個映象包含構成主存的資料片的全部資訊。這就意味著如果其中一個映象故障,那麼整個RAID 0元件將無法正常工作,資料將遭受不可恢復的損失。

建立RAID 10陣列

有兩種建立RAID 10陣列的可行方案:複雜法(一步完成)和巢狀法(先建立兩個或更多的RAID 1陣列,然後使用它們組成RAID 0)。本文會講述複雜法建立RAID 10陣列的過程,因為這種方法能夠使用偶數或奇數個磁碟去建立陣列,而且能以單個RAID裝置的形式被管理,而巢狀法則恰恰相反(只允許偶數個磁碟,必須以巢狀裝置的形式被管理,即分開管理RAID 1和RAID 0)。

假設你的機器已經安裝mdadm,並執行著相應的守護程式,細節參見這篇文章。也假設每個磁碟上已經劃分出一個主分割槽sd[bcdef]1 (LCTT 譯註:共計五塊磁碟,這裡是從sdb - sdf)。使用命令:

ls -l /dev | grep sd[bcdef]

檢視到的輸出應該如下所示:

然後使用下面的命令建立一個RAID 10陣列(LCTT 譯註:使用了四塊磁碟 bcde 建立):

 # 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是每一個映象中磁碟的數目。在本文的情形下,這個值等於(4*8GiB)/2 = 16GiB。

  3. Layout是整個資料佈局的詳細資訊。可能的佈局數值如下所示。


  • n(預設選項):代表就近(near)複製。一個資料塊的多個複製在不同磁碟裡有相同的偏移量。這種佈局提供和RAID 0陣列相似的讀寫效能。

  • o代表偏移量(offset)複製。塊並不是在條帶裡面複製的,而是整個條帶一起復制,但是迴圈會打亂,所以同一個分割槽中複製的塊會出現在不同的磁碟。因此,一個塊的後續複製會出現在下一個磁碟中,一個塊接著一個塊。為了在RAID 10陣列中使用這種佈局,在建立陣列的命令中新增--layout=o2選項。

  • f代表遠端(far)複製(多個複製在不同的磁碟中具有不同的偏移量)。這種佈局提供更好的讀效能但帶來更差的寫效能。因此,對於讀遠遠多於寫的系統來說是最好的選擇。為了在RAID 10陣列中使用這種佈局,在建立陣列的命令中新增--layout=f2。

跟在佈局選項nfo後面的數字代表所需的每一個資料塊的副本數目。預設值是2,但可以是2到陣列中磁碟數目之間的某個值。提供足夠的副本數目可以最小化單個磁碟上的I/O影響。

  1. Chunk Size,參考Linux RAID wiki的說明,是寫入磁碟的最小資料單元。最佳的chunk大小取決於I/O操作的速率和相關的檔案大小。對於大量的寫操作,透過設定相對較大的chunk可以得到更低的開銷,但對於主要儲存小檔案的陣列來說更小的chunk效能更好。為了給RAID 10指定一個chunk大小,在建立陣列的命令中新增--chunk=desiredchunksize

不幸的是,並沒有設定一個大小就能適合全域性的策略來提高效能,但可以參考下面的一些方案。

  • 檔案系統:就整體而言,XFS據說是最好的,當然EXT4也是不錯的選擇。
  • 最佳佈局:遠端佈局能提高讀效能,但會降低寫效能。
  • 副本數目:更多的副本能最小化I/O影響,但更多的磁碟需要更大的花費。
  • 硬體:在相同的環境下,SSD比傳統(機械旋轉)磁碟更能帶來出效能提升

使用DD進行RAID效能測試

下面的基準測試用於檢測RAID 10陣列(/dev/md0)的效能。

1. 寫操作

往磁碟中寫入大小為256MB的單個檔案:

# dd if=/dev/zero of=/dev/md0 bs=256M count=1 oflag=dsync 

寫入1000次512位元組:

# 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是一款檔案系統基準測試工具,用來測試各種磁碟I/O操作,包括隨機讀寫、順序讀寫和重讀重寫。它支援將結果匯出為微軟的Excel或LibreOffice的Calc檔案。

在CentOS/RHEL 7上安裝Iozone

先保證Repoforge可用,然後輸入:

# yum install iozone 

在Debian 7上安裝Iozone

# aptitude install iozone3 

下面的iozone命令會在RAID-10陣列中執行所有測試:

# iozone -Ra /dev/md0 -b /tmp/md0.xls 
  • -R:往標準輸出生成相容Excel的報告
  • -a:以全自動模式執行所有的測試,並測試各種記錄/檔案大小。記錄大小範圍:4K-16M,檔案大小範圍:64K-512M。
  • -b /tmp/md0.xls: 把測試結果儲存到一個指定的檔案中

希望這篇文章對你有所幫助,如果想到任何想法或建議可能會提升RAID 10的效能,請講出來。


via: http://xmodulo.com/setup-raid10-linux.html

作者:Gabriel Cánepa 譯者:KayGuoWhu 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章