如何在 Linux 上设置 RAID 10 以实现高性能和容错磁盘 I/O
RAID 10(又名 RAID 1+0 或镜像条带)阵列通过结合 RAID 0(跨多个驱动器并行执行读/写操作)和 RAID 1(数据以相同方式写入两个或多个驱动器)的功能,提供高性能和容错磁盘 I/O 操作。
在本教程中,我将向您展示如何使用五个相同的 8 GiB 磁盘设置软件 RAID 10 阵列。虽然设置 RAID 10 阵列的最小磁盘数量为四个(例如,两个镜像的条带集),但如果其中一个主驱动器出现故障,我们将添加一个额外的备用驱动器。我们还将分享一些您稍后可以用来分析 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 10 阵列有两种可能的设置:复杂(一步构建)或嵌套(通过创建两个或更多 RAID 1 阵列构建,然后将它们用作 RAID 0 中的组件设备)。在本教程中,我们将介绍复杂 RAID 10 阵列的创建,因为它允许我们使用偶数或奇数数量的磁盘创建阵列,并且可以作为单个 RAID 设备进行管理,而不是嵌套设置(只允许偶数数量的驱动器,并且必须作为嵌套设备进行管理,分别处理 RAID 1 和 RAID 0)。
假设您已安装 mdadm
,并且守护程序在您的系统上运行。有关详细信息,请参阅本教程。还假设每个磁盘上都创建了主分区 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
(默认选项):表示n
耳副本。一个数据块的多个副本在不同设备中的偏移量相似。此布局可产生与 RAID 0 阵列相似的读写性能。

o
表示o偏移副本。整个条带不是在条带内复制块,而是复制整个条带,但由一台设备旋转,因此重复的块位于不同的设备上。因此,块的后续副本位于下一个驱动器中,再往下一个块。要将此布局用于 RAID 10 阵列,请将 --layout=o2
添加到用于创建阵列的命令中。

f
表示 far 副本(具有不同偏移量的多个副本)。这种布局提供了更好的读取性能,但写入性能较差。因此,对于需要支持比写入多得多的读取的系统来说,它是最佳选择。要将此布局用于 RAID 10 阵列,请将 --layout=f2
添加到用于创建阵列的命令中。

--layout
选项中的n
、f
、o
后面的数字表示每个数据块需要的副本数量。默认值为 2,但可以为 2 至阵列中的设备数量。通过提供足够数量的副本,您可以最大限度地减少对各个驱动器的 I/O 影响。
4. 根据 Linux RAID wiki,块大小是可以写入设备的最小数据单位。最佳块大小取决于 I/O 操作的速率和所涉及的文件的大小。对于大型写入,您可能会通过使用相当大的块来看到较低的开销,而主要保存小文件的数组可能会从较小的块大小中受益更多。要为 RAID 10 阵列指定特定块大小,请将 --chunk=desired_chunk_size
添加到用于创建阵列的命令中。
不幸的是,没有一种万能的公式可以提高性能。以下是一些需要考虑的准则。
文件系统:总体而言,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
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 性能测试
在 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
:以全自动模式运行iozone
,包含所有测试和可能的记录/文件大小。记录大小:4k-16M,文件大小:64k-512M。-b /tmp/md0.xls
:将测试结果存储在指定文件中。
希望这可以帮助。请随意添加您的想法或添加有关如何提高 RAID 10 性能的提示。