如何在Linux上構建 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
的輸出應如下所示:
在更進一步之前需要注意以下事項。
- Used Dev Space表示陣列所使用的每一塊磁碟的容量。
- Array Size表示陣列的整體大小。RAID 10陣列的大小通過(NC)/M計算,其中N是活躍磁碟的數目,C是每個活躍磁碟的容量,M是每一個鏡像中磁碟的數目。在本文的情形下,這個值等於(48GiB)/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影響。
- 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive