1. 内容整体设计与思路拆解
1.1 为什么偏偏要聊 RAID
如果你管过几台像样的服务器,或者折腾过 NAS,那 RAID 大概率是你绕不开的一个词。我最早接触 RAID 的时候还是一头雾水,总觉得这玩意儿是玄学:明明是好几块硬盘,怎么系统里看到的只有一个盘?后来踩了不少坑,才慢慢把这块硬骨头啃下来。今天这篇学习日志,我就把 RAID 磁盘阵列从原理到实操,彻彻底底捋一遍。
先明确一个概念:RAID(Redundant Arrays of Independent Disks)不是某种单一的硬盘技术,而是一整套“把多块物理硬盘组合起来,对外呈现为一个逻辑存储单元”的方案。它解决的痛点非常朴素——单块硬盘要么容量不够,要么速度不够,要么坏了数据全没。RAID 的价值就在于,它让你可以用几块普通硬盘拼出“大容量”“高性能”或者“高安全”的组合效果,甚至三者兼得一部分。
在做任何 RAID 规划之前,你最该想清楚的其实不是“用几块盘”,而是“我到底在担心什么”。如果只是容量不够,那 RAID 0 很香;如果怕硬盘坏了数据丢,那 RAID 1 或者 RAID 5 更合适;如果既要速度又要冗余,RAID 10 会让你睡得更安稳。很多新手上来就追求“最强 RAID 5”,结果盘坏了重建失败,才意识到自己忽略了热备盘、忽略了重建窗口期、忽略了控制器负载。这玩意儿的选择,本质上是一场权衡。
1.2 方案选型先看需求场景
我在实际规划一个存储方案的时候,一般会把需求拆成三个维度:性能敏感度、数据安全级别、预算上限。这三者互相制约,你不可能什么都想要。
如果是给个人开发机或者测试环境用,两块盘做 RAID 0,换来近乎翻倍的读写速度,成本低、性能爽,但坏一块盘就全完蛋。测试环境嘛,数据丢了再装一遍系统就是了,无所谓。
如果是公司文件服务器或者数据库存储,那至少要考虑 RAID 1 或者 RAID 5。RAID 1 用两块盘互为镜像,写数据的时候两边同时写,读的时候可以两边同时读,性能其实不差;RAID 5 则把数据分布到所有盘上,同时用一块盘的容量存放校验信息,只要坏一块盘,数据仍然完整可用。
如果是高并发的数据库或者虚拟化平台,我更愿意推荐 RAID 10——先两两镜像,再把多组镜像条带化,兼顾了 RAID 0 的性能和 RAID 1 的安全,唯一的问题就是磁盘利用率只有 50%,得有钱。
所以你看,RAID 选型没有绝对答案,先看场景再选级别才是正路。我见过太多人照着网上的“推荐配置”无脑上 RAID 5,结果控制器性能跟不上,整个阵列写入慢得像蜗牛,这种教训说实话挺惨的。
2. 核心级别原理与适用场景
2.1 RAID 0:性能拉满,但没有任何保护
RAID 0 的原理简单粗暴:把数据拆成若干小块,轮流写到不同硬盘上。比如你有两块盘,文件 A 的前半段写盘1、后半段写盘2,读写的时候两块盘并行工作,吞吐量自然就上去了。
我经历过一个非常典型的场景:有一台视频剪辑工作站,素材文件动不动就是几十 GB,单块机械硬盘的读写速度根本扛不住 4K 素材的实时预览。后来给这台机器加了一块同样的硬盘,用主板自带的软 RAID 做了个 RAID 0 卷,实测读取速度从 180 MB/s 提升到了 340 MB/s 左右,剪辑时明显不卡了。代价就是,我对这块机器上的素材做好了两份备份,因为 RAID 0 完全没有任何冗余能力,坏任何一块盘,整个逻辑卷直接报废。
使用 RAID 0 的时候要注意一个细节:组成阵列的硬盘容量最好完全一致,否则阵列总容量会以最小的那块盘为准,多余的容量就浪费了。另外,强烈建议不要用不同型号、不同转速的硬盘组 RAID 0,稳定性完全没法保证。我的习惯是,在 SSD 价格能接受的前提下,直接用同型号的 NVMe 盘组 RAID 0(通过主板芯片组或者软 RAID 实现),性能极佳。
2.2 RAID 1:镜像,最朴素的安全感
RAID 1 是两两成对地工作:数据写在盘 A 上,同时原封不动地写在盘 B 上,形成一份完全一样的镜像。这样即使其中一块盘物理损坏,另一块盘仍然保存着完整的数据,系统不会中断,数据也不会丢。
有人觉得 RAID 1 太浪费,两块盘的容量只当一块盘用。但我想说的是,RAID 1 的价值不在于空间利用率,而在于它极其简单的故障恢复逻辑——拔掉坏盘,插上新盘,重建镜像,完事。整个过程不需要计算校验,不需要担心重建过程中再有盘坏掉导致数据全丢。对于存储重要文档、操作系统启动盘、关键配置文件这类场景,RAID 1 依然是非常靠谱的选择。
RAID 1 的读取性能其实也值得说两句。因为数据有两份,理论上读操作可以由两块盘分担,所以在多线程随机读的场景下,RAID 1 的可观性能表现其实不错,接近两倍单盘读速。但写入性能受限于两块盘同时写入,基本就是单盘的写速水平。我常用 RAID 1 来放虚拟机的系统盘,既保证系统稳定,又让启动速度不至于太拉胯。
2.3 RAID 5:平衡之选,但重建有风险
RAID 5 的设计思路是在 N 块盘上做数据条带化,同时在其中一块盘的容量上存储全局校验信息。校验数据不是固定放在某块盘上的,而是轮流分布在各块盘上。这样任意坏一块盘,其他盘上的数据和校验信息足以还原出完整数据。
对比 RAID 1,RAID 5 的最大优势就是空间利用率高。用三块 1 TB 的硬盘组 RAID 5,实际可用空间是 2 TB,相比 RAID 1 只能用 1 TB,等于白赚了一块盘的容量。这也是为什么中小型服务器和 NAS 上,RAID 5 特别流行。
但是RAID 5 有一个被很多人忽略的坑:重建窗口期的风险。当阵列中某一块盘坏了,你需要换上新盘并做数据重建。在重建过程中,如果再有任意一块盘也坏了,整个阵列就直接挂了,数据基本无法找回。所以组 RAID 5,我的建议是至少配置一块热备盘(Hot Spare),平时不参与读写,一旦有盘损坏,自动顶上去开始重建,这样能把风险降一个量级。另外,大容量盘的 RAID 5 重建时间往往非常漫长,期间控制器负载很高,其他业务的 I/O 都会受到影响,这些都要提前有个心理预期。
2.4 RAID 10:又稳又快的“豪华套餐”
RAID 10 不是简单的一条级别,而是 RAID 1 + RAID 0 的组合:先把硬盘两两镜像,再把多组镜像卷做条带化。它需要偶数块硬盘,至少四块起步。空间利用率同样只有 50%,但换来的是极佳的读性能、还不错的写性能以及很高的容错度。
在数据库等对存储性能要求极高的场景,RAID 10 几乎是我唯一推荐的方案。它不像 RAID 5 那样存在校验计算的开销,也不会因为重建过程过载而拖垮整个存储。曾经有个做电商平台后端的朋友跟我聊过,他们的订单库就放在 RAID 10 上,每天的高峰读写压力都不带喘息的,几年下来虽然坏过几次盘,但每一次都是拔出来换新的,业务压根没感知。
2.5 级别对比与选型速查
为了让大家有个直观的认识,我把常见的几种 RAID 级别整理成了一张表:
| RAID级别 | 最少盘数 | 可用容量 | 容错能力 | 读性能 | 写性能 | 典型场景 |
|---|---|---|---|---|---|---|
| RAID 0 | 2 | N | 无 | 很高 | 很高 | 视频剪辑、游戏盘、缓存分区 |
| RAID 1 | 2 | 1/N | 单盘故障 | 较高 | 一般 | 系统盘、重要数据、启动盘 |
| RAID 5 | 3 | N-1 | 单盘故障 | 较高 | 一般(有校验开销) | 文件服务器、NAS、归档存储 |
| RAID 10 | 4 | N/2 | 每组最多一块盘 | 很高 | 较高 | 数据库、虚拟化、高并发业务 |
| RAID 6 | 4 | N-2 | 双盘故障 | 较高 | 较低(双重校验) | 大容量数据、冷存储,可靠性要求极高 |
这张表看起来很简单,但选型的时候真的要结合实际情况。我的个人偏好是:能上 RAID 10 就别纠结 RAID 5,特别是你的业务对延迟敏感、盘位又不紧张的时候。预算有限那就 RAID 5 加热备盘,也比裸奔强得多。
3. 实操:从虚拟机到物理机模拟组建 RAID
3.1 用虚拟机搭一套软 RAID 练手
硬件 RAID 卡动辄几百上千块,新手想测试,最快、最安全的方式其实是用虚拟机模拟。我用 VMware 或者 VirtualBox 都可以完成这个操作。具体做法是新建一台 Linux 虚拟机(我这次用的是 CentOS 7.9,其他发行版操作类似),然后给虚拟机挂载三块虚拟磁盘,每块 5 GB,不用分区,直接作为裸设备交给系统。
进入系统后,先确认硬盘是否都被识别了,用lsblk或者fdisk -l查看。假设我们识别到了/dev/sdb、/dev/sdc、/dev/sdd三块盘,下面的操作就可以开始了。
创建 RAID 5 之前,需要确保系统安装了 mdadm 工具。CentOS 上一般是预装的,如果没有就执行:
yum install mdadm -y然后创建 RAID 5 阵列,指定三块数据盘:
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd这条命令执行后,系统会问你是否确认创建,输入y回车。接下来可以查看创建进度和阵列状态:
cat /proc/mdstat mdadm --detail /dev/md0等初始同步(resync)完成后,RAID 5 就算正式建好了。这时候你可以把/dev/md0当成一块普通硬盘来格式化、挂载、读写文件。全程没有接触真实硬件,非常安全,最适合新手熟悉命令和概念。
3.2 硬件 RAID 与软 RAID 的抉择
在真实的生产环境里,我们还要面临一个选择:用硬件 RAID 卡还是用操作系统自带的软件 RAID(mdadm)?
硬件 RAID 的优势在于它有独立的处理器和缓存,所有条带化、校验计算都由 RAID 卡上的芯片完成,不占用主机 CPU 资源。而且阵列信息存在 RAID 卡自身,换到同一型号的卡上,阵列直接就能识别。缺点是贵,且如果 RAID 卡坏了,没有同型号备件,会很麻烦。
软件 RAID 不依赖额外硬件,直接在操作系统层面用 md 驱动实现,成本为零,而且灵活性更高——你把整组硬盘插到另一台 Linux 机器上,只要系统识别出所有磁盘,执行mdadm --assemble --scan就能把阵列重新组起来。缺点是会消耗一些 CPU 资源,而且不能利用 RAID 卡自带缓存做写入加速。
我个人的观点是:测试环境、个人 NAS、对成本敏感的团队,软件 RAID 完全够了;生产环境的核心数据库、高并发业务,还是老老实实配一块带电池或者闪存保护的硬件 RAID 卡。硬件 RAID 卡不要买杂牌,主流厂商如 Broadcom(LSI)、Adaptec 的产品最省心,你可以在服务器 BIOS 里用 Option ROM 或者单独的 WebBIOS 工具来配置阵列,也可以用 StorCLI 这样的命令行工具进行管理。
3.3 配置硬件 RAID 的实际操作片段
假设你手头有台戴尔服务器,插了 4 块 SAS 盘,想通过硬件 RAID 卡做成 RAID 10。大致流程是:
开机自检时,根据提示按Ctrl+R进入 RAID 卡的配置界面(不同厂家的卡快捷键不同,有些是Ctrl+H,有些是F2)。进去后,你会看到当前连接的物理磁盘列表。然后使用菜单创建新 Virtual Disk,选择 RAID 10,勾选 4 块盘,设置条带大小(一般用默认的 64 KB 就行,如果对大文件顺序读写要求高,可以改成 128 KB 或 256 KB)。最后初始化虚拟磁盘,退出并重启。
这个过程中,最容易犯的错是没做初始化就开始装系统。虽然新阵列可以直接用,但很多 RAID 卡要求先做快速初始化(Fast Init),否则在系统中看到的阵列可能处于降级或者未初始化状态。另外,如果你配置了全局热备盘(Global Hot Spare),最好确认一下热备盘没有被划入 Virtual Disk 的数据盘里。
用命令行管理硬件 RAID 也是运维必备技能。比如你用 LSI/Broadcom 卡的 StorCLI 工具,查看所有控制器状态:
storcli show查看某个控制器下的所有虚拟磁盘和物理磁盘:
storcli /c0 /vall show把某个物理磁盘设置为热备盘:
storcli /c0 /exx/sxx add hotspare这些命令看起来硬核,但确实是生产服务器上最常用的操作。建议新手先在虚拟机上装好模拟环境,把 StorCLI 的常用子命令都敲一遍,心里有个底。
4. 故障模拟与重建恢复实战
4.1 拔掉一块盘,看看会发生什么
这里的实验还是在虚拟机上做最安全。我已经建好了一个 RAID 5 的/dev/md0,上面挂载到了/mnt/raid5,写了一些测试文件。接下来,我模拟一块盘损坏——其实就是从虚拟机配置里把其中一块虚拟磁盘删掉,或者直接把它从系统中卸载。
先看一眼阵列状态:
mdadm --detail /dev/md0输出中会明确标记出某一块盘的状态变为removed,同时阵列整体状态从active变成degraded(降级)。注意,此时/dev/md0依然可以正常读写,数据不会丢,因为 RAID 5 能通过其他两块盘和校验信息算出缺失的数据。用户在访问时几乎感知不到异常,这就是 RAID 的容错能力所在。
然后我们把这块“坏盘”模拟换掉,往虚拟机里加一块同样大小的新硬盘,假设识别为/dev/sdd,执行:
mdadm /dev/md0 --add /dev/sdd系统就会开始同步重建,通过cat /proc/mdstat能看到同步进度条,重建期间阵列仍可读写,但性能会有明显下降,这是正常的。
4.2 重建过程中的几个关键注意事项
重建绝非小事,我在这里列出几条切身经验:
第一,重建期间千万别重启服务器。虽然现代 md 支持继续重建,但重启过程中阵列状态变化很容易引发意外,搞不好就把整个阵列搞挂了。
第二,重建期间不要进行大规模写入。写入会大大拖慢重建速度,同时增加控制器或 CPU 的负载。
第三,留意硬盘的温升和错误日志。重建是高强度读写操作,如果盘本身有隐患,很容易在重建时就暴露出来。我见过一次重建到一半,另一块盘也报错,直接把 RAID 5 变成了数据无法访问的尴尬局面。
如果有热备盘存在,上面的这些操作其实都是自动的:阵列检测到数据盘故障,热备盘自动上线变成重建盘。你只需要做一件事——把损坏的物理盘拔掉,然后系统会自动把热备盘的状态从spare切换为active并开始同步,这种体验就非常舒服了。
4.3 RAID 6 是更安全的选择吗
如果你对 RAID 5 的重建风险心有余悸,那 RAID 6 值得了解一下。RAID 6 相当于在 RAID 5 的基础上增加了一块盘的校验容量,可以允许任意两块盘同时故障。空间利用率是 N-2,需要至少 4 块盘。
代价是写入性能进一步下降,因为每次写入不仅要计算一份校验,还要算第二份。而且 RAID 6 的重建也一样是个漫长的过程。所以我的判断是:对于超过 8 块大容量盘的大规模存储系统,RAID 6 的可靠性才有真正的价值;在盘数较少的情况下,它的安全增益并不明显,反而白白牺牲了不少容量和性能。
5. 阵列性能测试与调优建议
5.1 用 dd 和 fio 做基本读写验证
阵列建好之后,别急着上线,先做个性能摸底是专业操作。最简单的工具是dd,虽然不够精准,但能测个大概。
比如测试顺序写入:
dd if=/dev/zero of=/mnt/raid5/testfile bs=1M count=2048 conv=fdatasync测试顺序读取:
dd if=/mnt/raid5/testfile of=/dev/null bs=1M count=2048不过你要是想认真测,还是得用fio。它是一个非常强大的 I/O 测试工具,可以模拟随机读写、混合读写、队列深度等场景。我通常会把测试分成几类:4K 随机读(模拟数据库)、64K 顺序读(模拟视频流)、8K 70%读30%写(模拟混合负载)。每个场景跑完后,重点看IOPS(每秒读写次数)和latency(延迟)这两个指标。
不同 RAID 级别在 fio 下的差异非常明显。同一组物理盘,RAID 0 的随机读 IOPS 可能是 RAID 5 的 1.5 倍左右,RAID 10 则介于两者之间,但写入时 RAID 10 往往能甩开 RAID 5 很多,因为 RAID 5 的校验计算和写入放大很影响性能。
5.2 条带大小与文件系统对齐
条带大小(Chunk Size / Stripe Size)是一个经常被忽略但影响很大的参数。它决定了数据在盘间分配时的最小单位。条带太小,小文件读取性能好,但大文件顺序读写时可能需要频繁切换盘;条带太大,大文件顺序读写性能优,但小文件随机读写因为横跨的盘过多,性能反而下降。
对于绝大多数通用业务,64 KB 是一个比较折中的选择。但如果是视频监控类的大文件连续写入场景,256 KB 甚至 512 KB 都值得测试。修改条带大小必须在创建阵列时设定,创建后无法直接修改,只能备份数据后重建阵列,所以前期一定要想清楚。
另外,文件系统层面也建议与条带大小对齐。比如你 RAID 5 的条带是 64 KB,数据块跨 4 块盘,那么整个条带组长度是 256 KB,这时候采用 ext4 或 XFS 格式化时,指定-b size=4096 -E stride=16, stripe-width=64这类参数,可以让文件系统的分配单位与阵列的条带结构匹配,减少读写放大。这个细节对性能的影响,在数据库场景下尤其明显。
6. 日常巡检与兜底方案
6.1 监控阵列健康状态
阵列不是配好就一劳永逸的,日常巡检非常关键。我用得最多的命令是:
cat /proc/mdstat如果某一行的末尾出现了[U_]这样的标记,就说明阵列处于降级状态,下划线的位置就是故障盘。还可以用mdadm --monitor配合系统邮件服务做告警:定期扫描阵列状态,发现异常自动发送邮件。配置好这个,比每天手动敲命令靠谱一百倍。
对于硬件 RAID 卡,也可以用 StorCLI 或者厂商提供的管理工具定期检查。重点关注电池状态、盘片健康度、控制器温度这几个指标。有些阵列卡自带电池或者闪存保护,电池老化会直接导致“写缓存降级”,性能骤降,甚至触发数据保护机制。
6.2 备份永远是最好的兜底
我说句大实话:RAID 不是备份。它解决的是“硬件故障导致业务中断”的问题,对于误删文件、软件 bug 导致的数据损坏、勒索病毒加密文件这些情况,RAID 完全无能为力。我自己见过太多人以为上了 RAID 5 就万事大吉,结果被运维脚本误删了整个目录,哭都来不及。
所以,不管你是用 RAID 1、RAID 5 还是 RAID 10,该做的异地备份、快照、离线归档一样都不能少。重要数据至少要遵循“本地一份、异地一份、离线一份”的 3-2-1 原则。RAID 保障的是可用性,备份保障的是可恢复性,两者是互补关系,缺一个都不行。
6.3 实战中我踩过的坑与心得
最后分享几个自己实操时的细节,算是给各位提个醒。
- 组阵列前先用
smartctl检查每块盘的 SMART 信息,排除带病上阵的盘。我就遇到过新买的一批盘里藏着一块通电时间已经几万小时的问题盘,如果不检查直接做 RAID,后续麻烦无穷。 - 服务器断电恢复后,先确认阵列状态再挂载文件系统。即使是硬件 RAID,长时间断电也可能触发控制器缓存中的数据丢失,导致文件系统异常,这时候贸然挂载写入只会雪上加霜。正确做法是先在只读模式挂载,
fsck检查没问题后再正常使用。 - 扩容阵列时,如果用的是 RAID 5,尽量在业务低峰期进行,并且做完之后做个全量备份。扩容过程中数据重排的负载很高,阵列出了任何异常都别硬扛。
我在实际使用中的一条铁律是:任何一次阵列配置变更(创建、扩容、换盘、重建)之前,先把当前阵列的状态细节存一份档,命令行加上> raiddetail.txt重定向到文件,事后有问题还能回看。别嫌麻烦,这一招不知道帮我省了多少事。
RAID 不是什么高深莫测的黑魔法,它是一套成熟可靠的存储组合逻辑。只要理解了各个级别的原理、权衡清楚了业务需求、做足了日常监控与备份,你完全可以把整套阵列系统管得明明白白。希望这篇学习日志对正在啃 RAID 这块硬骨头的你有帮助。