PUB:20141009 How to set up RAID 10 for high performance and fault tolerant disk I or O on Linux

@KayGuoWhu
This commit is contained in:
wxy 2014-12-14 19:24:23 +08:00
parent 50ea541534
commit 5f03ba9eaa

View File

@ -1,6 +1,7 @@
在Linux上组成RAID 10阵列以实现高性能和高容错性的磁盘I/O
如何在Linux上构建 RAID 10阵列
================================================================================
RAID 10阵列 (又名RAID 1+0 或先镜像后分区)通过结合RAID 0 (读写操作并行在多个磁盘上同时执行)和RAID 1 (数据被完全相同地写入到两个或更多的磁盘)两者的特点实现高性能和高容错性的磁盘I/O。
RAID 10阵列又名RAID 1+0 或先镜像后分区通过结合RAID 0 读写操作在多个磁盘上同时并行执行和RAID 1数据被完全相同地写入到两个或更多的磁盘两者的特点实现高性能和高容错性的磁盘I/O。
这篇文章会指导你如何使用五块相同的8GB磁盘来组成一个软件RAID 10阵列。因为组成一个RAID 10阵列至少需要4块磁盘比如两个镜像各有一对分区组合而且需要添加一块额外的备用磁盘以防某块主要的磁盘出错。本文也会分享一些工具在稍后用来分析RAID阵列的性能。
@ -12,15 +13,15 @@ RAID 10阵列 (又名RAID 1+0 或先镜像后分区)通过结合RAID 0 (读写
![](https://farm4.staticflickr.com/3844/15179003008_e48806b3ef_o.png)
上图中的文件由A、B、C、D、E和F六种块组成每一个RAID 1镜像对如镜像1和2在两个磁盘上复制相同的块。因为需要这样配置写操作性能会因为每个块需要写入两次而下降每个磁盘各一次而读操作与从单块磁盘中读取相比并未发生改变。不过这种配置的好处是除非一个镜像中有超过一块的磁盘故障否则都能保持冗余以维持正常的磁盘I/O操作。
上图中的文件由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
有两种建立RAID 10阵列的可行方案复杂法一步完成和嵌套法先创建两个或更多的RAID 1阵列然后使用它们组成RAID 0。本文会讲述复杂法创建RAID 10阵列的过程因为这种方法能够使用偶数或奇数个磁盘去创建阵列而且能以单个RAID设备的形式被管理而嵌套法则恰恰相反只允许偶数个磁盘必须以嵌套设备的形式被管理即分开管理RAID 1和RAID 0
假设你的机器已经安装mdadm并运行着相应的守护进程细节参见[这篇文章][1]。也假设每个磁盘上已经划分出一个主分区sd[bcdef]1。使用命令
假设你的机器已经安装mdadm并运行着相应的守护进程细节参见[这篇文章][1]。也假设每个磁盘上已经划分出一个主分区sd[bcdef]1 LCTT 译注共计五块磁盘这里是从sdb - sdf。使用命令
ls -l /dev | grep sd[bcdef]
@ -28,7 +29,7 @@ RAID 0的分区通过将数据划分到不同的块然后执行同时将块A
![](https://farm3.staticflickr.com/2944/15365276992_db79cac82a.jpg)
然后使用下面的命令创建一个RAID 10阵列
然后使用下面的命令创建一个RAID 10阵列LCTT 译注:使用了四块磁盘 bcde 创建)
# mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sd[bcde]1 --spare-devices=1 /dev/sdf1
@ -46,29 +47,29 @@ RAID 0的分区通过将数据划分到不同的块然后执行同时将块A
1. **Used Dev Space**表示阵列所使用的每一块磁盘的容量。
2. **Array Size**表示阵列的整体大小。RAID 10阵列的大小通过(N*C)/M计算其中N是活跃磁盘的数目C是活跃磁盘的容量M是每一个镜像中磁盘的数目。在本文的情形下这个值等于4*8GiB/2 = 16GiB。
2. **Array Size**表示阵列的整体大小。RAID 10阵列的大小通过(N\*C)/M计算其中N是活跃磁盘的数目C是每个活跃磁盘的容量M是每一个镜像中磁盘的数目。在本文的情形下这个值等于4*8GiB/2 = 16GiB。
3. **Layout**是整个数据布局的详细信息。可能的布局数值如下所示。
----------
- **n**(默认选项)代表就近拷贝。一个数据块的多个拷贝在不同磁盘里有相同的偏移量。这种布局提供和RAID 0阵列相似的读写性能。
- **n**(默认选项):代表就近near拷贝。一个数据块的多个拷贝在不同磁盘里有相同的偏移量。这种布局提供和RAID 0阵列相似的读写性能。
![](https://farm3.staticflickr.com/2941/15365413092_0aa41505c2_o.png)
- **o**代表偏移量拷贝。不是复制一个分区里的块,所有的分区都被复制,但会被循环打乱所以同一个分区中复制的块会出现在不同的磁盘。因此一个块的后续拷贝会出现在下一个磁盘中一个块接着一个块。为了在RAID 10阵列中使用这种布局在创建阵列的命令中添加--layout=o2选项。
- **o**代表偏移量offset拷贝。块并不是在条带里面复制的而是整个条带一起复制但是循环会打乱所以同一个分区中复制的块会出现在不同的磁盘。因此一个块的后续拷贝会出现在下一个磁盘中一个块接着一个块。为了在RAID 10阵列中使用这种布局在创建阵列的命令中添加--layout=o2选项。
![](https://farm3.staticflickr.com/2944/15178897580_6ef923a1cb_o.png)
- **f**代表远端拷贝多个拷贝在不同的磁盘中具有不同的偏移量。这种布局提供更好的读性能但带来更差的写性能。因此对于读远远多于写的系统来说是最好的选择。为了在RAID 10阵列中使用这种布局在创建阵列的命令中添加--layout=f2。
- **f**代表远端far拷贝多个拷贝在不同的磁盘中具有不同的偏移量。这种布局提供更好的读性能但带来更差的写性能。因此对于读远远多于写的系统来说是最好的选择。为了在RAID 10阵列中使用这种布局在创建阵列的命令中添加--layout=f2。
![](https://farm3.staticflickr.com/2948/15179140458_4a803bb194_o.png)
跟在布局选项**n**、**f**和**o**后面的数字代表所需的每一个数据块的副本数目。默认值是2但可以是2到阵列中磁盘数目之间的某个值。提供足够的副本数目可以最小化单个磁盘上的I/O影响。
4. **Chunk Size**以[Linux RAID wiki][2]为准,是写入磁盘的最小数据单元。最佳的chunk大小取决于I/O操作的速率和相关的文件大小。对于大量的写操作通过设置相对较大的chunks可以得到更低的开销但对于主要存储小文件的阵列来说更小的chunk性能更好。为了给RAID 10指定一个chunk大小在创建阵列的命令中添加**--chunk=desired_chunk_size**。
4. **Chunk Size**参考[Linux RAID wiki][2]的说明,是写入磁盘的最小数据单元。最佳的chunk大小取决于I/O操作的速率和相关的文件大小。对于大量的写操作通过设置相对较大的chunk可以得到更低的开销但对于主要存储小文件的阵列来说更小的chunk性能更好。为了给RAID 10指定一个chunk大小在创建阵列的命令中添加**--chunk=desired_chunk_size**。
不幸的是,并没有设置一个大小就能适合全局的策略来提高性能,但可以参考下面的一些方案。
不幸的是,并没有设置一个大小就能适合全局的策略来提高性能,但可以参考下面的一些方案。
- 文件系统:就整体而言,[XFS][3]据说是最好的当然EXT4也是不错的选择。
- 最佳布局:远端布局能提高读性能,但会降低写性能。
@ -127,7 +128,7 @@ via: http://xmodulo.com/setup-raid10-linux.html
作者:[Gabriel Cánepa][a]
译者:[KayGuoWhu](https://github.com/KayGuoWhu)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出