raid 10陣列(又名raid 1+0 或先鏡像後分區)通過結合raid 0 (讀寫操作在多個磁盤上同時并行執行)和raid 1(資料被完全相同地寫入到兩個或更多的磁盤)兩者的特點實作高性能和高容錯性的磁盤i/o。
這篇文章會指導你如何使用五塊相同的8gb磁盤來組成一個軟體raid 10陣列。因為組成一個raid 10陣列至少需要4塊磁盤(比如,兩個鏡像各有一對分區組合),而且需要添加一塊額外的備用磁盤以防某塊主要的磁盤出錯。本文也會分享一些工具,在稍後用來分析raid陣列的性能。
注意raid 10的優缺點和其它分區方法(在不同大小的磁盤和檔案系統上)的内容不在本文讨論範圍内。

<a target="_blank"></a>
如果你需要實作一種支援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 1陣列,然後使用它們組成raid 0)。本文會講述複雜法建立raid 10陣列的過程,因為這種方法能夠使用偶數或奇數個磁盤去建立陣列,而且能以單個raid裝置的形式被管理,而嵌套法則恰恰相反(隻允許偶數個磁盤,必須以嵌套裝置的形式被管理,即分開管理raid 1和raid 0)。
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
的輸出應如下所示:
在更進一步之前需要注意以下事項。
used dev space表示陣列所使用的每一塊磁盤的容量。
array size表示陣列的整體大小。raid 10陣列的大小通過(n*c)/m計算,其中n是活躍磁盤的數目,c是每個活躍磁盤的容量,m是每一個鏡像中磁盤的數目。在本文的情形下,這個值等于(4*8gib)/2 = 16gib。
layout是整個資料布局的詳細資訊。可能的布局數值如下所示。
n(預設選項):代表就近(near)拷貝。一個資料塊的多個拷貝在不同磁盤裡有相同的偏移量。這種布局提供和raid 0陣列相似的讀寫性能。
o代表偏移量(offset)拷貝。塊并不是在條帶裡面複制的,而是整個條帶一起複制,但是循環會打亂,是以同一個分區中複制的塊會出現在不同的磁盤。是以,一個塊的後續拷貝會出現在下一個磁盤中,一個塊接着一個塊。為了在raid 10陣列中使用這種布局,在建立陣列的指令中添加--layout=o2選項。
f代表遠端(far)拷貝(多個拷貝在不同的磁盤中具有不同的偏移量)。這種布局提供更好的讀性能但帶來更差的寫性能。是以,對于讀遠遠多于寫的系統來說是最好的選擇。為了在raid 10陣列中使用這種布局,在建立陣列的指令中添加--layout=f2。
跟在布局選項n、f和o後面的數字代表所需的每一個資料塊的副本數目。預設值是2,但可以是2到陣列中磁盤數目之間的某個值。提供足夠的副本數目可以最小化單個磁盤上的i/o影響。
不幸的是,并沒有設定一個大小就能适合全局的政策來提高性能,但可以參考下面的一些方案。
最佳布局:遠端布局能提高讀性能,但會降低寫性能。
副本數目:更多的副本能最小化i/o影響,但更多的磁盤需要更大的花費。
硬體:在相同的環境下,ssd比傳統(機械旋轉)磁盤更能帶來出性能提升
下面的基準測試用于檢測raid 10陣列(/dev/md0)的性能。
往磁盤中寫入大小為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性能測試中緩存的影響。
從陣列中拷貝256kib*15000(3.9 gb)大小内容到/dev/null:
# dd if=/dev/md0 of=/dev/null bs=256k count=15000
# yum install 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的性能,請講出來。
原文釋出時間:2014-12-10
本文來自雲栖合作夥伴“linux中國”