RAID磁盘阵列
RAID = Redundant Array of Independent (or Inexpensive) Disks,即“磁盘冗余阵列”。核心思想是把多块物理磁盘组合成一个逻辑设备,用条带化(striping)、镜像(mirroring)和/或校验(parity)来在性能、容量和可靠性之间做权衡。用途包括提速、增加可用容量、提高容错能力,但RAID 不是备份(请一定保留独立备份)。
常见的关键词解释
条带(stripe):把连续的数据分成块(chunk/stripe unit),分布在不同盘上以并行读写。
条带宽度 / chunk size:每个条带单元的大小(常见 16KB、64KB、256KB 等),影响顺序读写与小 IO 性能。
镜像(mirror):把数据完整复制到另一块盘(RAID1)。
校验(parity):用于恢复数据的冗余信息(RAID5/6),通过异或等运算生成。
写惩罚(write penalty):进行小写(partial/随机写)时需要额外读写校验,导致实际 IOPS 成本高于单盘。
热备盘(hot spare):空闲盘,出故障时自动接替参与重建。
降级(degraded) / 重建(rebuild):当一块盘故障阵列进入降级,替换盘加入后做数据重建(会大量读剩余盘,IO 密集且风险增加)。
URE(Unrecoverable Read Error)风险:在重建大容量盘时发生不可校正读错误可能导致重建失败,RAID5 在大盘上风险较高,RAID6 更安全。
RAID0 — 纯条带化(Striping)
原理
- 把数据切分为固定大小的“块”(chunk/stripe unit),依次分配到不同的磁盘上。
- 例如写入文件
ABCDEF,若条带大小为 2 单位,分布可能是:- 磁盘1:
AB - 磁盘2:
CD - 磁盘3:
EF
- 磁盘1:
- 所有磁盘 并行读写,提高带宽。
**冗余:**无。任何一块盘坏了,整体阵列崩溃。
RAID1 — 镜像(Mirroring)
原理:
- 把数据完整复制到另一块磁盘上。
- 写入
ABCDEF,同时写到磁盘1和磁盘2。 - 读时可以从任意一块盘读取(控制器可做负载均衡,提高读性能)。
冗余:
- 任何一块盘坏了,还有另一块副本。
- 容错依赖镜像副本数量(2盘镜像容忍1盘坏,3盘镜像容忍2盘坏)。
RAID5 — 条带化 + 单校验
原理:
- 数据按条带分布在不同磁盘上。
- 额外计算**奇偶校验(Parity)**存放在不同盘(轮换存放,避免单盘成为瓶颈)。
- 校验常用 XOR(异或) 运算:
- 例如 3 块盘:
- 磁盘1:
D1 - 磁盘2:
D2 - 磁盘3:
P = D1 ⊕ D2
- 磁盘1:
- 例如 3 块盘:
- 如果任意一块盘坏了,可通过剩下的数据和校验恢复:
- 例如磁盘1坏:
D1 = D2 ⊕ P
- 例如磁盘1坏:
冗余:
- 能容忍 1 块盘故障。
RAID 5 写惩罚(Write Penalty)
假设我们要在 RAID 5 中修改一块盘上的某个数据块:
- 读旧数据块(因为要计算新的校验值)。
- 读旧校验块(校验块在别的磁盘上)。
- 写新数据块(把修改的数据写回)。
- 写新校验块(更新过的校验值写回)。
所以总共要 4 次 I/O 操作。
🔹 为什么不能直接写新数据和校验?
因为 RAID 5 的校验是 异或(XOR)计算,要保证一致性,新的校验值必须满足:
新校验=旧数据⊕新数据⊕旧校验
所以必须知道 旧数据 和 旧校验,才能推算出新校验。
这就导致了写入时额外的读操作。
RAID6 — 条带化 + 双校验
原理:
- 与 RAID5 类似,但每个条带组保存 两份不同的校验信息(通常是 XOR + Reed-Solomon 编码)。
- 举例:
- 磁盘1:
D1 - 磁盘2:
D2 - 磁盘3:
P = D1 ⊕ D2 - 磁盘4:
Q = f(D1,D2)(使用更复杂的算法,例如伽罗华域 GF(2^8) 的线性组合)
- 磁盘1:
- 这样即使两块盘同时坏,也能利用剩余数据和两份校验恢复。
冗余:
- 能容忍 2 块盘同时故障。
RAID10(或 1+0)— 镜像 + 条带
原理:
- 先把磁盘配对做 RAID1(镜像),再把这些镜像组做 RAID0(条带)。
- 例如 4 块盘:
- 组1(镜像对):磁盘1和磁盘2存
D1 - 组2(镜像对):磁盘3和磁盘4存
D2 - 然后条带化:写入数据
AB,A → 组1,B → 组2
- 组1(镜像对):磁盘1和磁盘2存
- 读写性能接近 RAID0,但有镜像冗余。
冗余:
- 每对镜像可坏 1 块,只要不是同一对里的所有盘都坏,阵列仍然可用。
RAID50 / RAID60 — 条带化 + RAID5/6 组
原理:
- 把多个 RAID5(或 RAID6)阵列做条带化。
- 例如 6 块盘做 RAID50:
- 先分成两组 RAID5(各3盘,容错1盘)
- 再把两组做 RAID0。
- 性能和冗余能力兼顾,比单一 RAID5/6 更强。
总结对比
| RAID级别 | 原理 | 容错能力 | 容量利用率 | 性能特点 |
|---|---|---|---|---|
| RAID0 | 条带化 | 0 | 100% | 高读写,0 容错 |
| RAID1 | 镜像 | N-1 块 | 50%(2盘镜像情况) | 读快写中等 |
| RAID5 | 条带+单校验 | 1 块 | (N-1)/N | 读快,写有惩罚(4 次 IO) |
| RAID6 | 条带+双校验 | 2 块 | (N-2)/N | 读快,写更慢(6 次 IO) |
| RAID10 | 镜像+条带 | 每对1块 | 50% | 高读写,容错比 RAID1 更灵活 |
| RAID50 | (RAID5)+条带 | 每组1块 | > (N-组数)/N | 比 RAID5 更快更稳 |
| RAID60 | (RAID6)+条带 | 每组2块 | > (N-2组数)/N | 更安全,适合大规模磁盘 |