操作系统通过文件系统对磁盘进行了抽象,使应用程序无需关心物理扇区的读写细节。然而,单块磁盘始终面临两个根本性问题:容量上限与单点故障。一旦磁盘损坏,数据即刻丢失——这在任何生产环境中都是不可接受的。
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)正是在这一背景下诞生的技术。它通过将多块物理磁盘组织为逻辑整体,在性能、可靠性和成本之间寻找平衡点,是现代存储系统的基石。无论是企业级 SAN 还是云厂商的块存储,底层无一例外都依赖 RAID 或其变体思想。
本节的核心问题是:如何用多块廉价磁盘构建出性能更高、更可靠的存储系统?
RAID 的本质是一种存储虚拟化技术。它将 N 块物理磁盘抽象为一块逻辑磁盘,对上层文件系统完全透明。其核心手段有三:
三者并非互斥,不同 RAID 级别是对这三者的不同组合与权衡。
| 术语 | 含义 |
|---|---|
| Stripe | 条带,数据跨磁盘分布的最小单元 |
| Stripe Size | 条带大小,即单块磁盘上连续写入的数据量 |
| Chunk / Extent | 单块磁盘上分配的连续空间单元 |
| Rebuild | 故障磁盘更换后,从冗余信息恢复数据的过程 |
| Degraded | 降级状态,阵列中有磁盘故障但仍可工作 |
| Hot Spare | 热备盘,自动顶替故障磁盘的空闲盘 |
RAID 5 小随机写惩罚:一次 4KB 随机写需要 2 次读(读旧数据 + 读旧校验)+ 2 次写(写新数据 + 写新校验),即 I/O 放大为 4 倍。这是 RAID 5 在 OLTP 场景下的致命缺陷。
| RAID 级别 | 最少磁盘 | 容错能力 | 空间利用率 | 读性能 | 写性能 | 典型场景 |
|---|---|---|---|---|---|---|
| RAID 0 | 2 | 0 | 100% | N 倍 | N 倍 | 临时数据 |
| RAID 1 | 2 | N-1 | 50% | N 倍 | 1 倍 | 系统盘/日志 |
| RAID 5 | 3 | 1 | (N-1)/N | 近 N 倍 | 受限 | 文件服务 |
| RAID 6 | 4 | 2 | (N-2)/N | 近 N 倍 | 受限 | 归档存储 |
| RAID 10 | 4 | 每镜像对1 | 50% | N 倍 | N/2 倍 | 数据库 OLTP |
RAID 设计的核心矛盾可以用一个三角形来表示:
不存在同时满足高性能、高可靠、低成本的 RAID 方案。所有 RAID 级别都是在此三角形上的不同投影:
写惩罚 vs 空间效率:RAID 5/6 以写性能换取空间效率;RAID 10 以空间效率换取写性能。在 SSD 时代,写惩罚的影响进一步放大——SSD 寿命由写入量决定,RAID 5/6 的小写放大直接缩短 SSD 寿命。
Rebuild 时间 vs 数据安全窗口:磁盘容量增长远快于带宽增长。一块 20TB 磁盘的 Rebuild 可能需要数十小时,在此期间阵列处于降级状态。RAID 5 在 Rebuild 期间遇到不可恢复读错误(URE)将导致数据丢失。这是大容量磁盘时代 RAID 5 逐渐被淘汰的根本原因。
一致性 vs 性能:RAID 写入顺序关乎一致性。非易失性缓存(BBU/NVCache)是解决"写空洞"问题的关键——它确保断电后校验与数据的一致性。
硬件 RAID vs 软件 RAID:
以某大型互联网公司为例,其存储架构经历了以下演进:
阶段1: 硬件 RAID 控制器 + RAID 10 → 成本极高
阶段2: 软件 RAID + JBOD + 副本冗余 → 成本下降,灵活度提升
阶段3: 分布式存储(类 RAID 思想的软件定义)→ Erasure Coding + 多副本这体现了从硬件 RAID 到软件定义存储的趋势。现代分布式存储系统(如 Ceph、Google Colossus)本质上是对 RAID 思想的分布式化——将校验、条带化、冗余从单机提升到集群维度。
纠删码(Erasure Coding)可以视为 RAID 6 的泛化:将数据分为 K 个数据块,计算 M 个校验块,任意 K 个块即可恢复数据。这使得空间利用率可达 K/(K+M),远超传统三副本的 33%。
冷数据存储中,Erasure Coding 已成为标配(可参考[38丨文件系统与对象存储]中对象存储的 EC 策略)。
在 10TB+ 磁盘上使用 RAID 5 是一个典型反模式:
正确做法:大容量磁盘场景应使用 RAID 6(双校验)或 RAID 10,或转向分布式 Erasure Coding。
部分运维人员为追求性能关闭 RAID 控制器的 Write Cache 策略,导致文件系统元数据与 RAID 校验不一致。断电后可能出现文件系统损坏——这在数据库场景下尤为致命。
正确做法:确保 RAID 控制器配备 BBU(电池备份单元)或 NVCache,使 Write Cache 在掉电后数据不丢失,兼顾性能与一致性。
延伸阅读:下一节[15丨存储与数据库:B+树]将从存储介质的管理转向存储数据的组织结构,讨论 B+ 树如何为数据库提供高效的索引查询能力。