独立磁盘冗余阵列 (Redundant Array of Independent Disks, RAID) 是一种将多个磁盘驱动器组件(通常是多块硬盘或多个分区)组合为一个逻辑单元的存储技术。根据 RAID 的部署情况,这个逻辑单元可以是单个的文件系统,也可以是一个能在其上建立多个分区的透明中间层。根据所需的冗余量和性能要求,数据按照 #RAID 级别 中的某一种方式分布在驱动器中。所选的 RAID 级别决定了是否可以防止数据丢失(硬盘故障时)、是否提高性能或结合两者优势。

需求背景

由于最近买了3块西数HC550(16TB)来组建个人ALL-IN-ONE设备,那么势必需要对硬盘的可用性进行提升,最后选择了软RAID的方案(不想折腾再去搞靠谱的磁盘阵列卡+电池&芯片了),虽然在数据安全性上可能并未有太大提升(待验证),但是在资源管理上以及性能方面一定是有提升的。

实现方式

RAID 设备可以用不同方式来管理:

软件 RAID

这是最简单的实现方式,因为它不依赖于专用固件或专有软件。这种阵列由操作系统通过以下方式进行管理:

  • 通过抽象层管理(比如 mdadm);

    注意: 这是在本指南下文将要使用的方法。

  • 通过逻辑卷管理器来管理(比如 LVM);

  • 通过文件系统的某个组件来管理(比如 ZFSBtrfs)。

硬件 RAID

这种阵列由安装在计算机上的专用硬件卡直接管理,硬盘直接连接在该计算机上。RAID 的处理逻辑由板载的处理器完成,它独立于 主处理器 (CPU)。尽管这种方案独立于任何操作系统,但却需要驱动程序来使硬件 RAID 控制器正常工作。取决于不同的制造商,硬件 RAID 阵列可以在 option ROM 里设置或者操作系统安装完成后另行安装配套软件来设置。这种设置是独立于 Linux 内核的:内核并不能看到单独的每块硬盘。

FakeRAID

这种类型的 RAID 应当称为 BIOS 或板载 RAID,却常被错误地当做硬件 RAID 来宣传。这种阵列由伪 RAID 控制器来管理,RAID 逻辑由 option ROM 或安装了 EFI Sata 驱动程序的 固件本身(UEFI 情况下)来完成,但并不是实现了 所有 RAID 功能的完整硬件 RAID 控制器。因此,这种 RAID 有时被称为 FakeRAID。来自 官方仓库 的 dmraid 用于处理这种控制器。这里列出一些 FakeRAID 控制器:Intel Rapid Storage,JMicron JMB36x RAID ROM,AMD RAID,ASMedia 106x 和 NVIDIA MediaShield。

踩坑过程

  1. 首先最先尝试的是FakeRAID模式,我的MSI Z97 Gaming 7主板自带了 Intel Rapid Storage Technology,但是在Ubuntu下,系统并不能认出raid后的分区,估计是没有驱动的缘故,且在好大哥的帮助下看到了篇帖子:Intel RAID (FakeRaid) 在ubuntu下的安装与使用初探,文中总结了由于intel对Linux操作系统raid支持不善,所以为了稳定性弃用了此方案。

  2. 随后把主板调回了AHCI模式,开始在软raid层面开始选择部署方案,首先看了文件系统级别的方案,目前主流为两种技术,分别是zfs与btrfs,本文不重点介绍文件系统间的区别。有意思的是,目前nas界两巨头 群晖与威联通分别站队,威联通甚至还专门写了一片为何不要用btrfs文件系统,有兴趣的可以去看一下:QNAP 使用 ext4 文件系统

在深入探究后,发现论坛上很多大佬说ZFS在Linux上不稳定,最好是自己编译zfs进Linux内核,并且zfs非常吃内存,推荐8G ECC内存起。。弃用

btrfs有许多漏洞,并且相对于常用的ext4,性能落后较为明显,以下拿一张块写入性能对比(此测试方法对硬盘是最常用的写入操作,最典型案例)

可以看到性能上差不多,但是效率上(CPU占用率上)来说最好的是xfs接下来依次是EXT4,EXT3,BTRFS

在其他几种测试方法下例如随机寻道、随机读写吞吐量、创建和删除大量文件等用例下,btrfs的效率都是最差的,图就不放了,感兴趣的可以去看一看:EXT3 vs EXT4 vs XFS vs BTRFS linux filesystems benchmark

  1. 接下来开始纠结用lvm的raid模式还是直接通过mdadm直接抽象raid

在查阅了大量帖子后,发现很多人也有这个疑问。。目前还没有可靠的对比分析,但是从设计上来看这两种模式分别对应以下两张图

# mdadm抽象raid模式
| / | /var | /usr | /home  |
 --------------------------
|       RAID Volume        |
 --------------------------
| Disk 1 | Disk 2 | Disk 3 | 
# lvm创建raid模式
| / | /var | /usr | /home  |
 --------------------------
|       LVM Volume 2       |
 --------------------------
|       RAID Volume        |
 --------------------------
|       LVM Volume 1       |
 --------------------------
| Disk 1 | Disk 2 | Disk 3 | 

很明显,层级变多了,且好多大佬都猜测lvm创建raid可能是调用了mdadm而已。。

Creating mdadm arrays on top of an LVM logical volume is nonsense. It technically works, but completely defeats the point of almost everything involved.

However, LVM can create logical volumes that are backed by a software RAID. You still get all the fancy bits of LVM, though. Like the ability to move which physical disk is holding the stripes of your RAID. Afaik, LVM’s software raid is actually just a call to mdadm anyway, so that adds an extra bit of confusion.

– reddit (LVM vs mdadm software raid : linuxadmin)

If you tried to RAID LVM volumes, you would be left with a normal device without any of the LVM volume benefits (e.g. growing filesystems etc.)

I’m guessing LVM is just using the mdam option --assume-clean behind the scene i.e. still no advantage of using LVM-RAID instead of mdadm (at leat not in that regard). If your’re happy with no full resync when create array with mdadm just use that optino yourself. Today, 4 years later, resync the whole SSD disk make no difference in regards to wear-out as the endurance-levels on newer SSD are so high. 

– StackExchange linux - What is better LVM on RAID or RAID on LVM? - Server Fault

所以最终决定,直接通过软件对硬件设备进行抽象raid,最底层的技术一般也是最可靠的。当然若有lvm raid模式性能/可靠性好过mdadm的测试用例,还请告诉我

RAID 级别

那么选定了组建raid的工具后,首先就是要想清楚自己需要的是什么级别的raid。

基本 RAID 级别

有多种不同的 基本 RAID 级别,下面列出了最常用的几种。

RAID 0

将多块硬盘组合为一个带区卷,尽管它 并不提供数据冗余,它仍可以被当做是 RAID,而且它确实提供了 巨幅的速度提升。如果提高速度比数据安全更重要(比如作为 swap 分区),可以选择这种 RAID 级别。在服务器上,RAID 1 和 RAID 5 阵列更加合适。在 RAID 0 阵列中,块设备的大小是最小组成分区的大小乘以组成分区的数量。

RAID 1

这是最直接的 RAID 级别:完全镜像。与其他 RAID 级别一样,它只在分区位于不同物理硬盘上才有效。如果某一块硬盘损坏,由 RAID 阵列提供的块设备将不受影响。可以使用 RAID 1 的情境包括了除 swap 和临时文件外的其他所有情境。请注意,如果使用由软件实现的 RAID,引导分区只能选择 RAID 1,因为读取引导分区的引导器通常无法辨识 RAID,但一个 RAID 1 的组成分区可以像常规分区一样读取。RAID 1 阵列块设备的大小是最小组成分区的大小。

RAID 5

需要至少 3 块物理硬盘,并结合了 RAID 1 的数据冗余和 RAID 0 的速度与可用空间上的优势。RAID 5 使用了类似 RAID 0 的条带化技术,同时也将奇偶校验块分布式地存储在每一块磁盘上。如果遭遇硬盘损坏,这些奇偶校验块就可以用来在替代的新磁盘上重建损坏的数据。RAID 5 仅可弥补一个组成磁盘损坏带来的损失。

注意: RAID 5 是结合了速度与数据冗余优势的常用选择。但值得注意的是,当一块硬盘损坏而没有及时更换,此时若再有硬盘损坏,则所有数据都将丢失。此外,考虑到现代磁盘的超大容量和消费级硬盘无法恢复的读取错误率 (Unrecoverable read error, URE),超过 4TiB 的阵列在重建数据时出现至少一处读取错误 (URE) 的概率几乎在预料之中(概率大于 50%)。因此,存储行业不再推荐使用 RAID 5。

RAID 6

需要至少 4 块物理硬盘,提供了和 RAID 5 一样的优势并且在两块硬盘损坏时仍能保证数据安全。RAID 6 使用了和 RAID 5 类似的条带化技术,但是把两个不同的奇偶校验块 分布式地存储在每一块磁盘上。如果磁盘发生故障,这些奇偶校验块将用于重建替换磁盘上的数据。RAID 6 可以承担两个组成磁盘的损失。在抵御无法恢复的读取错误 (Unrecoverable read error, URE) 时也某种程度上更加可靠,因为磁盘阵列在重建某一块损坏硬盘的数据时仍然有奇偶校验块可以校验数据。但是,总体而言,RAID 6 开销较大,大多数时候 far2 布局的 RAID 10(参见下文)提供了更快的速度和更强的可靠性,因此更倾向于采用 RAID 10。

嵌套 RAID 级别

RAID 1+0

RAID1+0 是一种结合了两种基本 RAID 级别的嵌套级别,它相对基本级别提高了性能且增加了冗余量。它通常被称为 RAID10,但是,Linux MD(内核自带的 RAID 实现)支持的 RAID10 不是简单的两层 RAID 重叠,请看下文。

RAID 10

Linux 下的 RAID10 建立在 RAID1+0 的概念上,但它将其实现为单一的一层,这一层可以有多种不同的布局。可参考 创建软件 RAID 10 设备 | 储存管理指南 | SUSE Linux Enterprise Server 15 SP2

在 Y 块硬盘上的 近 X 布局 在不同硬盘上重复储存每个数据块 X 次,但不需要 Y 可以被 X 整除。数据块放在所镜像的磁盘上几乎相同的位置,这就是 近布局 名字的来源。它可以工作在任意数量的磁盘上,最少是 2 块。在 2 块硬盘上的近 2 布局相当于 RAID1,4 块硬盘上的近 2 布局相当于 RAID1+0。

在 Y 块硬盘上的 远 X 布局 设计用于在镜像阵列中提供与条带化技术一样快的读取速度。它通过把每块硬盘分成前后两部分来实现这一点,写入第一块硬盘前半部分数据也会写入第二块硬盘的后半部分,反之亦然。这样可以达到一个效果,那就是把对连续数据的读取条带化,而这正是 RAID0 和 RAID5 读取性能高的原因。它的缺点在于写入连续数据时有轻微性能损失,因为硬盘磁头要运动到另一片区域来写入镜像。当数据读取性能和可用性/冗余性一样重要时,比起 RAID1+0  RAID5,更应该优先考虑远 2 布局的 RAID10。需注意这种方式仍无法代替备份。详情请阅读维基百科相关页面。

raid级别对比

RAID 级别 数据冗余 物理设备利用率 读取性能 写入性能 最少磁盘数量
0 100% n 倍最优 n 倍最优 2
1 50% 如果有多个进程同时读取,最多 n 倍,否则 1 倍 1 倍 2
5 67% - 94% (n−1) 倍较优 (n−1) 倍较优 3
6 50% - 88% (n−2) 倍 (n−2) 倍 4
10,far2 50% n 倍最优; 与 RAID0 相当但加入了数据冗余 (n/2) 倍 2
10,near2 50% 如果有多个进程同时读取,最多 n 倍,否则 1 倍 (n/2) 倍 2
  • 其中 n 表示用于组成阵列的磁盘数量。
  • 此表中的raid10方案由md工具驱动,硬raid10则至少需要4块盘。

个人推荐

  • 在服务器(商用)的情况下,推荐raid1/raid10

  • 在个人PC的情况下,推荐raid5/raid10

    • raid10比raid5要靠谱,并且读取性能更强,但是在设备空间利用率上要多损耗20%左右,所以我自己用了raid5