RAID 磁盘阵列完全指南:从原理到实操,不再傻傻分不清 RAID 0/1/5/6/10

RAID 是服务器和 NAS 的基石,但 RAID 0、1、5、6、10、50、60 究竟怎么选?本文从条带、镜像、校验三大基本原理讲起,深入浅出讲解各种 RAID 级别的读写性能、冗余能力、磁盘利用率、典型适用场景,并结合 mdadm 软件 RAID 与硬件 RAID 卡实战配置,让你彻底弄懂 RAID。

RAID 磁盘阵列完全指南:从原理到实操,不再傻傻分清 RAID 0/1/5/6/10

前言

每个接触服务器、NAS、工作站的人都会遇到一个问题:

1
2
3
4
5
6
"我应该用哪种 RAID?"
"RAID 5 还是 RAID 10?"
"4 块盘怎么组?6 块盘怎么组?"
"是不是 RAID 等级越高越安全?"
"硬盘坏了为什么 RAID 5 第二次坏就全完?"
"硬件 RAID 和软件 RAID 怎么选?"

更让人抓狂的是:RAID 0、RAID 1、RAID 5、RAID 6、RAID 10、RAID 50、RAID 60、JBOD……五个等级、八种组合,看一眼就晕。

这篇文章,我帮你从最底层原理讲清楚 RAID,让你彻底搞清楚:

  • RAID 0/1/5/6 的核心原理(条带 / 镜像 / 校验)
  • 它们各自的优缺点和适用场景
  • RAID 10 / 50 / 60 的嵌套组合怎么选
  • 磁盘数量、性能、冗余、安全之间的权衡
  • 实战用 mdadm 配软件 RAID
  • 硬件 RAID 卡选购和配置
  • 哪些"RAID 谣言"是错的,哪些是对的

读完你就能对着硬盘表格说出"用 X 块盘,组 RAID Y"。


一、为什么需要 RAID

1.1 硬盘会坏

这是磁盘的根本矛盾:硬盘是机械(或者固态)的,物理设备必然损坏

1
2
3
消费级硬盘年化故障率:1% ~ 2%
企业级硬盘年化故障率:0.5% ~ 1%
数据中心大规模下:1000 块盘 1 年坏 5~10 块 = 必然

Google 2017 年发布过一份大规模硬盘故障研究(涉及数百万块硬盘),结果显示:

  • 硬盘故障不是"会不会"的问题,而是"什么时候"的问题
  • 故障不是均匀分布,新盘(< 3 个月)和旧盘(> 3 年)故障率更高
  • 大量看似完好的硬盘,已经存在潜在损坏(Silent Bit Rot)

所以任何严肃的存储方案都必须考虑冗余RAID 就是最主流的冗余方案。

1.2 提升性能

除了冗余,RAID 还通过并行 I/O 提升性能:

1
2
3
单块硬盘:找到文件 → 读写 → 返回
2 块 RAID 0:文件 A 一半在盘 1,一半在盘 2,**同时读写**
           → 读写速度翻倍

1.3 RAID 不能替代备份

这是必须记住的第一原则

1
2
3
4
5
6
7
8
9
RAID ≠ 备份
  ✓ RAID 防:单盘物理故障
  ✗ RAID 不防:误删文件、病毒、文件系统损坏、机房火灾、地震
  ✗ RAID 不防:同一文件的所有副本都损坏(Bit Rot)

3-2-1 备份原则仍然必须:
  3 份数据副本
  2 种不同存储介质
  1 份异地备份

二、RAID 三大底层原理

理解任何 RAID 等级,只需要掌握三个基本概念

2.1 条带(Striping)

条带 = 把数据切成块,平均分到多块盘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
4 块盘组 RAID 0,条带大小 64KB:

文件 "ABCD"(200KB):
  ┌──────────────────────────────────────────────┐
  │  A1 (64KB)  →  盘 1                          │
  │  A2 (64KB)  →  盘 2                          │
  │  A3 (64KB)  →  盘 3                          │
  │  A4 (8KB)   →  盘 4                          │
  └──────────────────────────────────────────────┘

读 A1 时,4 块盘独立读取自己的部分 → 总吞吐量翻 4 倍

条带优点

  • 读写性能随盘数线性增长(理论 N 倍)
  • 磁盘利用率 100%

条带缺点

  • 没有冗余:任何一块盘坏,全部数据丢失
  • 4 块盘 RAID 0 的"非冗余"年化风险:4 × 1% = 4%

2.2 镜像(Mirroring)

镜像 = 同一份数据存多份

1
2
3
4
5
6
7
2 块盘组 RAID 1:

文件 "ABCD":
  盘 1: A B C D
  盘 2: A B C D (完全一样的副本)

任意一块盘坏,另一块盘仍有完整数据 → 不丢失

镜像优点

  • 冗余能力最强:N 块盘可容忍 N-1 块盘故障
  • 读性能提升(多盘并行读)
  • 写性能一般(要写多份)

镜像缺点

  • 磁盘利用率低:N 块盘只能当 N-1 块用
  • 容量 50% 浪费(N 块盘只剩 1 块盘容量)

2.3 校验(Parity)

校验 = 用一种数学方法(N 块数据 → 1 块校验),任一盘坏都能用剩余盘 + 校验盘算出丢失数据

最常用的是 XOR(异或)校验

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
XOR 原理:
  A XOR B XOR C = D
  → 已知任意 3 个值,可以算出第 4 个

应用到 RAID 5(3 块数据盘 + 1 块校验盘):
  盘 1: A1 A2 A3 P4
  盘 2: B1 B2 P3 B4
  盘 3: C1 P2 C3 C4
  盘 4: P1 B3 C4 D4  ← 校验块轮流分布到不同盘

  盘 4 坏了:
  → 用 盘 1 + 盘 2 + 盘 3 的对应块 XOR 算出来

校验优点

  • 折中:性能比单盘好,冗余比 RAID 0 强
  • 磁盘利用率:(N-1)/N

校验缺点

  • 写性能差(每次写要计算校验)
  • 阵列重建(Rebuild)时性能崩坏
  • RAID 5 双盘故障 = 数据全毁

三、RAID 级别详解

3.1 速查表

RAID 级别 最小盘数 冗余能力 利用率 读性能 写性能 典型场景
RAID 0 2 0 块坏 100% 临时数据、缓存
RAID 1 2 N-1 块 50% 系统盘、关键数据
RAID 5 3 1 块 (N-1)/N 中等冗余、生产
RAID 6 4 2 块 (N-2)/N 大容量、高安全
RAID 10 4 至少 1 块 50% 数据库、高性能
RAID 50 6 每组 1 块 较高 大容量 + 性能
RAID 60 8 每组 2 块 较高 极高高安全
JBOD 1 0 块 100% 简单扩容

3.2 RAID 0:性能怪兽,飞蛾扑火

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
原理:条带(Striping)
  硬盘 1: A1 A3 A5 A7
  硬盘 2: A2 A4 A6 A8

优点:
  ✓ 读写性能 = N 块盘叠加(理论 N 倍)
  ✓ 100% 磁盘利用率
  ✓ 最简单的并行

缺点:
  ✗ 0 冗余
  ✗ 任何一块盘坏 → 数据全毁
  ✗ 4 块盘 RAID 0 故障率 ≈ 4 × 1% = 4%(年化)

适用场景:
  - 临时数据,可随时重新生成
  - 视频编辑的"项目盘"(边做边丢没影响)
  - 数据库的写日志(Write Ahead Log,可用但要明白风险)
  - 大型计算的 SWAP 分区
  - **绝对不要**用于任何重要数据

3.3 RAID 1:镜中镜,安全的代价

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
原理:镜像(Mirroring)
  硬盘 1: A B C D
  硬盘 2: A B C D  ← 完全镜像

优点:
  ✓ 冗余最强:N 块盘可容忍 N-1 块坏
  ✓ 读性能提升:多盘并行读
  ✓ 重建速度快:直接复制
  ✓ 实现简单

缺点:
  ✗ 磁盘利用率 50%(最浪费)
  ✗ 写性能 ≈ 1 倍(要写 N 份)
  ✗ 容量受限

适用场景:
  - 系统盘(最常用)
  - 数据库关键数据
  - 任何不能容忍性能损失但要求容错的小容量数据

3.4 RAID 5:折中之道,重建噩梦

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
原理:条带 + 分布式校验
  盘 1: A1 A2 P3
  盘 2: B1 P2 B3
  盘 3: P1 B2 C3
  A1 ⊕ B1 = P1
  A2 ⊕ B2 = P2
  A3 ⊕ B3 = P3

优点:
  ✓ 冗余 1 块盘故障
  ✓ 磁盘利用率 (N-1)/N(4 块盘 75%)
  ✓ 读性能不错(条带读取)

缺点:
  ✗ 写性能差(每次写需要 4 次 IO:读旧数据、读旧校验、算新校验、写新数据 + 校验)
  ✗ 写惩罚:写 1 块数据 = 4 次 IO(写惩罚 = 4)
  ✗ 重建(Rebuild)性能崩塌:N 块盘坏 1 块后,需要用一个盘全盘扫描重建
  ✗ 重建期间再坏一块盘 → 全毁
  ✗ 重建期间性能下降 50% 以上
  ✗ 大容量硬盘重建时间长(4TB 盘重建 24 小时+)

适用场景:
  - 中小规模服务器
  - 读多写少的工作负载
  - 容量要求高但预算有限
  - **不推荐用于 ≥ 4TB 大容量盘**(重建风险太大)

RAID 5 的"写惩罚"详解

1
2
3
4
5
6
7
8
RAID 5 写 1 块数据,需要 4 次 IO:
  1. 读取旧数据块(用于 XOR 校验)
  2. 读取旧校验块(用于计算新校验)
  3. 写入新数据块
  4. 写入新校验块

所以 RAID 5 写性能 ≈ 单盘的 1/4
要提升需要:BBU(电池保护写缓存)+ Write-Back 写回策略

3.5 RAID 6:双校验,RAID 5 的安全升级

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
原理:条带 + 2 个独立校验(P 和 Q)
  P = A ⊕ B ⊕ C
  Q = 复杂的多项式校验(Reed-Solomon 之类)

优点:
  ✓ 容忍 **2 块** 盘同时坏
  ✓ 适合大容量盘(降低 Rebuild 期间二次故障的概率)
  ✓ 磁盘利用率 (N-2)/N(8 块盘 75%)

缺点:
  ✗ 写性能比 RAID 5 更差(每写 1 块 = 6 次 IO)
  ✗ 校验计算更复杂
  ✗ 至少 4 块盘起步

适用场景:
  - ≥ 4TB 大容量硬盘阵列
  - NAS / 家庭服务器
  - 任何不容许重建期间故障的场景
  - **现代企业推荐的首选**

3.6 RAID 10:性能与安全的最佳拍档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
原理:先 RAID 1(镜像)再 RAID 0(条带)
  组 1: 盘 1 + 盘 2(镜像)
  组 2: 盘 3 + 盘 4(镜像)
  然后 组 1 和 组 2 做条带

  盘 1: A1 A3 A5 A7
  盘 2: A1 A3 A5 A7  ← 组 1 镜像
  盘 3: A2 A4 A6 A8
  盘 4: A2 A4 A6 A8  ← 组 2 镜像

优点:
  ✓ 性能 = RAID 0(读写都强)
  ✓ 冗余 = RAID 1(每组损坏 1 块仍 OK)
  ✓ 重建快(只需镜像一份)
  ✓ 写性能 ≈ RAID 0(没有写惩罚)

缺点:
  ✗ 磁盘利用率 50%(和 RAID 1 一样)
  ✗ 至少 4 块盘
  ✗ 容量增长翻倍

适用场景:
  - 数据库(MySQL、PostgreSQL、Oracle)
  - 高性能应用
  - **最推荐的生产环境 RAID**

RAID 10 vs RAID 6

1
2
3
4
5
4 块盘情况下:
  RAID 10:可用 2 块盘容量,性能 = 2 块盘叠加
  RAID 6:可用 2 块盘容量,性能 ≈ 1 块盘(写惩罚)

→ 4 块盘选 RAID 10 比 RAID 6 几乎总是更好

3.7 RAID 50 / RAID 60:嵌套组合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
RAID 50:先 RAID 5(每组)+ 条带
  组 1: 盘 1+2+3(RAID 5)
  组 2: 盘 4+5+6(RAID 5)
  组 1 + 组 2 做条带

RAID 60:先 RAID 6(每组)+ 条带
  组 1: 盘 1+2+3+4(RAID 6)
  组 2: 盘 5+6+7+8(RAID 6)
  组 1 + 组 2 做条带

优点:
  ✓ 大容量下兼顾性能
  ✓ RAID 60 容忍能力强

缺点:
  ✗ 至少 6 块盘(RAID 50)/ 8 块盘(RAID 60)
  ✗ 仍然有 RAID 5/6 的写惩罚
  ✗ 比 RAID 10 复杂,重建更长

适用场景:
  - 16 块盘以上的大阵列
  - 数据库集群的存储节点

3.8 JBOD:磁盘直通

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
原理:把多块盘拼接成一个"大硬盘",没有冗余
  盘 1: A B C D
  盘 2: E F G H
  → 整个盘 = 容量叠加

优点:
  ✓ 100% 利用率
  ✓ 简单

缺点:
  ✗ 任何一块盘坏,对应数据丢失
  ✗ 性能 ≈ 单盘

适用场景:
  - 归档存储
  - 偶尔访问的冷数据
  - 与 Btrfs/ZFS 配合(这种文件系统本身有更高级的冗余方案)

四、RAID 级别决策树

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
有 2 块盘?
├─ 是 → RAID 1(系统盘)或 RAID 0(要性能不要数据)
└─ 否
   有 3 块盘?
   ├─ 是 → RAID 5(仅 3 块仅 RAID 5 可选)
   └─ 否
      4 块盘?
      ├─ 是 → 性能优先:RAID 10  / 容量优先:RAID 6
      └─ 否
         6-8 块盘?
         ├─ 是 → RAID 10(绝对首选)/ RAID 6(容量优先)/ RAID 60
         └─ 否
            8+ 块盘?
            ├─ 是 → RAID 10(最稳)/ RAID 60(容量安全性平衡)

容量与冗余对比表(不同盘数下的可用容量):

盘数 RAID 5 RAID 6 RAID 10 RAID 50 RAID 60
4 3 盘 2 盘 2 盘 - -
5 4 盘 3 盘 4 盘 - -
6 5 盘 4 盘 3 盘 4 盘 -
8 7 盘 6 盘 4 盘 6 盘 4 盘
12 11 盘 10 盘 6 盘 8 盘 8 盘
16 15 盘 14 盘 8 盘 12 盘 10 盘
24 23 盘 22 盘 12 盘 16 盘 14 盘

性能与冗余对比表

RAID 级别 写性能 读性能 冗余 重建速度 推荐指数
RAID 0 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ - ⭐(仅缓存)
RAID 1 ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
RAID 5 ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐
RAID 6 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
RAID 10 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
RAID 50 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
RAID 60 ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐

五、硬件 RAID vs 软件 RAID

5.1 对比表

维度 硬件 RAID 软件 RAID (mdadm)
性能 ⭐⭐⭐⭐⭐(专用卡) ⭐⭐⭐⭐(主板占用 CPU)
成本 高(卡 + 电池) 免费(开源)
CPU 占用 不占用 占用 5-15%
跨平台 启动依赖驱动 内核集成
热插拔 支持 支持
企业级特性 完备 较弱
恢复难度 需要同型号卡 直接 Linux 命令
数据迁移 容易
典型应用 大型服务器、关键业务 主流服务器、工作站

5.2 硬件 RAID:BBU 和超级电容

硬件 RAID 卡的"真正优势"在于写缓存

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
硬盘写性能瓶颈:
  HDD 随机写:200 IOPS
  SSD 随机写:50000 IOPS

硬件 RAID 卡的解决方案:
  写入数据先到 SSD 缓存(DRAM)
  → 返回"写成功"给应用(实际还在缓存里)
  → 后台异步刷到磁盘(Write-Back 模式)

问题:突然断电,缓存里的数据就没了!
解决:BBU(电池备份单元)或超级电容
  → 断电后,电池维持几小时到几天
  → 缓存中的数据不会丢失

电池 vs 超级电容

1
2
3
4
5
6
7
BBU(锂电池):
  优点:续航长(72 小时),成熟
  缺点:电池老化(3-5 年),需要更换,重启快充电

超级电容:
  优点:寿命长(10 年+),瞬间高功率
  缺点:续航短(几十秒到几分钟),需要 UPS 兜底

重要警告:取消 BBU/超级电容后,硬件 RAID 会自动降级到 Write-Through(直写),性能断崖式下降。

5.3 软件 RAID:mdadm

mdadm(Multiple Devices Admin)是 Linux 的标准软件 RAID 工具,所有 Linux 发行版都自带

优势

  • 内核集成,零成本
  • 跨平台兼容性(不同服务器之间迁移容易)
  • 性能已经足够好(普通 SATA SSD 阵列下,CPU 占用可忽略)
  • 配置保存在元数据中,比硬件 RAID 更容易恢复

劣势

  • 启动盘需要 /boot 单独处理(需要 initramfs 支持)
  • 没有 BBU,写缓存全靠 OS 页面缓存
  • 内核 BUG 可能影响 RAID(极罕见)

六、实战:mdadm 配置软件 RAID

6.1 准备磁盘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看系统磁盘
lsblk
# NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda      8:0    0   50G  0 disk
# ├─sda1   8:1    0   500M  0 part /boot/efi
# ├─sda2   8:2    0     1G  0 part /boot
# └─sda3   8:3    0  48.5G  0 part /
# sdb      8:16   0     4T  0 disk          ← 待组 RAID
# sdc      8:32   0     4T  0 disk
# sdd      8:48   0     4T  0 disk
# sde      8:64   0     4T  0 disk

# 把 4 块盘分组,给每块盘建立分区
# (建议:整盘用 GPT,1 个分区,类型设为 Linux RAID,fd00)
for disk in sdb sdc sdd sde; do
    parted /dev/$disk mklabel gpt
    parted /dev/$disk mkpart primary 0% 100%
    parted /dev/$disk set 1 raid on
done

# 验证
lsblk

6.2 创建 RAID 5 阵列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 4 块盘组 RAID 5
mdadm --create /dev/md0 \
    --level=5 \
    --raid-devices=4 \
    --chunk=512 \
    /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 输出:
# mdadm: Defaulting to version 1.2 metadata
# mdadm: array /dev/md0 started.

# 关键参数:
# --level=5         RAID 5
# --raid-devices=4  4 块盘
# --chunk=512       条带大小 512KB(一般默认即可)
# --spare-devices=1 添加热备盘(可选)

6.3 创建 RAID 10 阵列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 4 块盘组 RAID 10(推荐布局:near / far / offset)
# far 布局性能最优
mdadm --create /dev/md0 \
    --level=10 \
    --layout=f2 \
    --raid-devices=4 \
    /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# RAID 10 的 layout 参数:
# near(默认):相邻条带写,性能好
# far:远端条带写,顺序读性能最佳
# offset:错位条带写,平衡两者

6.4 监控阵列构建进度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看 RAID 状态
cat /proc/mdstat
# Personalities : [raid1] [raid10] [raid6] [raid5] [raid4]
# md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0]
#       8790402048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
#       [>....................]  resync = 0.1% (5767168/4395201024) finish=...
#       speed=185000K/sec

# 实时监控
watch -n 1 cat /proc/mdstat

# mdadm 详细查询
mdadm --detail /dev/md0

6.5 创建文件系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建 ext4 文件系统
mkfs.ext4 /dev/md0

# 或创建 XFS(推荐,性能更好)
mkfs.xfs /dev/md0

# 挂载
mkdir /mnt/raid
mount /dev/md0 /mnt/raid

# 验证
df -h /mnt/raid

6.6 配置开机自动挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 1. 生成 mdadm 配置
mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
# ARRAY /dev/md0 metadata=1.2 UUID=abc123:def456...

# 2. 更新 initramfs
sudo update-initramfs -u   # Debian/Ubuntu
sudo dracut -f              # RHEL/CentOS

# 3. 获取 UUID
blkid /dev/md0
# /dev/md0: UUID="abc-123" TYPE="ext4"

# 4. 编辑 /etc/fstab
echo 'UUID=abc-123 /mnt/raid ext4 defaults 0 2' | sudo tee -a /etc/fstab

# 5. 验证自动挂载
sudo mount -a

6.7 添加热备盘

1
2
3
4
5
6
# RAID 5 阵列运行时,添加热备盘
mdadm /dev/md0 --add /dev/sdf1

# 标记为热备盘
# 先加 spare 然后重建
mdadm --grow /dev/md0 --raid-devices=5 --add /dev/sdf1

热备盘机制:

1
2
3
4
5
6
7
8
正常状态:盘 1, 2, 3, 4(RAID 5)
热备盘:盘 5(待命)

盘 2 故障:
  → 状态:盘 1, 3, 4(降级)+ 盘 5(自动接管)
  → 重建开始,5 顶替 2 的位置
  → 重建完成后,盘 5 变成正式成员
  → 你需要更换新的硬盘作为新的热备盘

6.8 模拟硬盘故障与恢复

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 模拟盘故障(标记为 failed)
mdadm /dev/md0 --fail /dev/sdb1

# 查看状态
cat /proc/mdstat
# md0 : active raid5 sde1[4] sdb1[2](F) sdd1[1] sdc1[0]
#                                ↑ failed

# 移除故障盘
mdadm /dev/md0 --remove /dev/sdb1

# 加入新盘(假设你换了新硬盘)
mdadm /dev/md0 --add /dev/sdb1

# 重建自动开始
# 监控进度
mdadm --detail /dev/md0 | grep -i "rebuild\|recovery"

6.9 常见运维命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看阵列详情
mdadm --detail /dev/md0

# 查看阵列简要信息
mdadm --query /dev/sdb1

# 停止阵列(先卸载)
umount /mnt/raid
mdadm --stop /dev/md0

# 重组阵列(换主板后)
mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 增长阵列(加盘)
mdadm --grow /dev/md0 --raid-devices=5

# 调整 RAID 5 的 chunk size
mdadm --grow /dev/md0 --chunk=128

# 删除阵列(清空所有数据!)
mdadm --stop /dev/md0
mdadm --remove /dev/md0
mdadm --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

七、实战:硬件 RAID 卡配置

7.1 硬件 RAID 选购

主流品牌

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
入门级:
  - Dell PERC H330 / H730
  - HPE Smart Array E208 / P408
  - LSI MegaRAID 9361

中高端:
  - LSI MegaRAID 9380
  - Broadcom MR 9500 系列
  - Microsemi Adaptec ASR 8805

顶级:
  - Dell PERC H755
  - HPE Smart Array P816i

选购要点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
1. RAID 级别支持
   - 必须支持 RAID 6 / 60(生产环境)
   - RAID 50/60 支持看型号

2. BBU 或超级电容
   - 一定要买带电池/电容的版本
   - 电池型号要能二次购买(停产款 = 灾难)

3. 接口速度
   - 12Gb/s SAS(推荐)
   - 6Gb/s SATA(够用)

4. 缓存大小
   - 1GB 起步(推荐 2GB+)
   - 缓存大 = 性能强

5. 厂商支持
   - 优先选大厂(Dell、HPE、Broadcom)
   - 避免台湾小厂(停产 = 救不回来)

7.2 进入 RAID 卡 BIOS 配置

1
2
3
4
# 开机按对应键进入 RAID 卡配置界面
# 大多数卡:Ctrl + R(LSI MegaRAID)
# 部分 Dell:Ctrl + R 或 Ctrl + C
# HPE:F5 进入 Smart Storage Administrator

典型配置流程(以 LSI MegaRAID 为例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
1. 进入 BIOS 后看到主界面
2. 选择 "Configuration Wizard"
3. 选择 "New Configuration"(清空所有数据)
   或 "Add Configuration"(保留现有)
4. 选择 RAID 级别:RAID 5 / RAID 6 / RAID 10
5. 选择参与 RAID 的磁盘
6. 设置:
   - 条带大小(Strip Size):64KB / 128KB / 256KB
   - 读策略:Read Ahead / No Read Ahead
   - 写策略:Write Through / Write Back / Write Back with BBU
   - 缓存策略:Direct IO / Cached IO
7. 初始化(Initialize)
8. 完成

7.3 在 Linux 中管理硬件 RAID

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 大多数硬件 RAID 卡都需要厂商特定工具管理

# LSI MegaRAID / Broadcom:
yum install StorCLI          # 命令行工具
storcli64 /c0 show           # 查看控制器 0
storcli64 /c0/v0 show all    # 查看虚拟磁盘 0

# HPE Smart Array:
yum install hpacucli
hpacucli ctrl all show config

# Dell PERC:
yum install MegaCli
megacli -LDInfo -Lall -aAll

7.4 硬件 RAID 性能调优

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 关键参数:策略调优
# 1. 读策略:Read Ahead(预读)
storcli64 /c0/v0 set rdcache=RA

# 2. 写策略:Write Back(带 BBU)
storcli64 /c0/v0 set wrcache=WB

# 3. 缓存:直接 IO(避免双缓存)
storcli64 /c0/v0 set cache=Direct

# 4. 磁盘缓存策略
storcli64 /c0/v0 set diskcache=Disabled

性能调优建议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
读多写少(Web 服务器、文件存储):
  rdcache = Read Ahead
  wrcache = Write Back (with BBU)
  cache = Direct IO

写多读少(数据库):
  rdcache = No Read Ahead
  wrcache = Write Back (with BBU)
  cache = Direct IO

关键数据库(金融):
  rdcache = Read Ahead
  wrcache = Write Through (确保数据落到盘)
  cache = Direct IO

八、RAID 重建(Rebuild)详解

8.1 什么是 RAID Rebuild

1
2
3
4
5
6
硬盘故障时:
  1. mdadm / RAID 卡检测到故障盘
  2. 标记为 failed
  3. 用热备盘(或新插入的盘)顶替
  4. 从剩余盘 + 校验块反推数据,写到新盘
  5. 整个过程叫"重建"

8.2 RAID 重建的"危险窗口"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
RAID 5 重建 8TB 盘:
  - 读取剩余 3 盘全盘数据:数小时
  - 写入新盘数小时
  - 合计:12-24 小时

风险:
  重建期间,整个 RAID 处于"降级"状态
  - 性能下降 50%+
  - 此时再坏 1 块盘 → RAID 5 全毁
  - 较大容量的硬盘(4TB+)重建时间超过 24 小时
  - 重建期间硬盘密集 I/O = 触发其他硬盘故障

这就是 RAID 5 大盘的"死亡螺旋":
  1. 坏 1 块盘
  2. 重建开始
  3. 重建期间高负载
  4. 剩余盘过热/震动
  5. 又坏 1 块
  6. RAID 5 全毁

8.3 加快重建速度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# mdadm 调整重建速度限制
# 默认重建速度 = 全部带宽,性能降低
# 可配置:
echo 50000 > /proc/sys/dev/raid/speed_limit_min  # KB/s,最低 50MB/s
echo 2000000 > /proc/sys/dev/raid/speed_limit_max  # KB/s,最高 2GB/s

# 临时加速:(用 nohup / sysctl)
sysctl -w dev.raid.speed_limit_max=2000000

# 注意:太快可能影响业务
# 实务:业务闲时调整到 200MB/s,业务繁忙时降到 50MB/s

8.4 RAID 重建失败的处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 重建失败:可能原因
# 1. 坏道(UCE 错误)
# 2. 硬盘过热
# 3. 数据块损坏(其他盘已有坏块)

# 抢救方法:
# 1. 替换硬盘,重新开始重建
# 2. 如果 RAID 无法恢复,备份(如果有)是最重要的
# 3. 用专业数据恢复公司(费用高)

# 重要:RAID 5 重建失败的硬盘不要轻易"再试"
# 错误操作可能造成不可恢复

九、RAID 监控与告警

9.1 mdadm 监控

1
2
3
4
5
6
7
8
# /etc/mdadm.conf 配置邮件告警
MAILADDR admin@example.com

# mdadm 监控模式
mdadm --monitor --scan --daemonize

# 启用 systemd 监控
sudo systemctl enable --now mdmonitor

9.2 SMART 监控

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 安装 smartmontools
yum install smartmontools

# 启用 SMART(每块盘)
smartctl -s on /dev/sdb

# 查看健康状态
smartctl -H /dev/sdb
# SMART overall-health self-assessment test result: PASSED

# 长期测试(坏块检测)
smartctl -t long /dev/sdb

# 查看错误日志
smartctl -l error /dev/sdb

9.3 完整的 RAID 监控脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
# /usr/local/bin/raid-monitor.sh

MD_DEVICE="/dev/md0"
ADMIN_EMAIL="admin@example.com"

# 检查 RAID 状态
STATUS=$(mdadm --detail $MD_DEVICE | grep "State :" | awk '{print $3, $4, $5}')

# 检查降级
if echo "$STATUS" | grep -q "degraded"; then
    echo "RAID 降级!当前状态: $STATUS" | mail -s "RAID 告警" $ADMIN_EMAIL
    exit 1
fi

# 检查 smart 错误
for disk in /dev/sd{b,c,d,e}; do
    if ! smartctl -H $disk | grep -q "PASSED"; then
        echo "磁盘 $disk SMART 健康检测失败!" | mail -s "硬盘告警" $ADMIN_EMAIL
    fi
done

# 重建监控
if grep -q "resync\|recovery\|rebuild" /proc/mdstat; then
    PERCENT=$(grep -oP '\d+%' /proc/mdstat | head -1)
    echo "RAID 重建中: $PERCENT"
fi
1
2
# 加到 crontab,每小时运行
0 * * * * /usr/local/bin/raid-monitor.sh

十、RAID 的常见误区

10.1 误区一:RAID 等级越高越好

1
2
3
4
5
6
7
❌ "RAID 6 比 RAID 5 好,所以选 RAID 6"
❌ "RAID 10 比 RAID 6 旧,所以选 RAID 6"
❌ "RAID 60 比 RAID 50 高级,所以选 RAID 60"

正确:选择 RAID 是一个权衡(tradeoff)
  容量 vs 性能 vs 冗余
  没有最好的 RAID,只有最适合的 RAID

10.2 误区二:RAID = 备份

1
2
3
4
5
❌ "我做 RAID 5 了,不需要备份"
✓ RAID 是冗余,不是备份
  RAID 防:单盘故障
  RAID 不防:误删、病毒、文件系统损坏、运维误操作
  备份:3-2-1 原则仍然必须

10.3 误区三:RAID 5 大容量盘够用

1
2
3
4
5
6
7
❌ "4TB 盘组 RAID 5 没问题"
✓ RAID 5 致命缺陷:重建失败 = 全毁
  4TB 盘重建 12-24 小时
  8TB 盘重建 24-48 小时
  10TB+ 盘重建 48-72 小时
  → 重建期间任何第二块盘故障 = 全毁
  → 大容量盘必须 RAID 6 或 RAID 10

10.4 误区四:RAID 0 更快所以更好

1
2
3
4
5
❌ "RAID 5 太慢,RAID 0 更快"
✓ RAID 0 没有冗余
  4 块盘 RAID 0:年化故障率 ≈ 4 × 1% = 4%
  4 块盘 RAID 5:年化故障率 ≈ 1%(考虑 Rebuild)
  → RAID 0 仅用于缓存、临时数据,绝对不能存重要数据

10.5 误区五:硬件 RAID 一定比软件 RAID 好

1
2
3
4
5
6
❌ "硬件 RAID 性能一定更好"
✓ 现在的 CPU 强大,软件 RAID 已经接近硬件 RAID
  硬件 RAID 优势:专用 BBU、写缓存、脱离 OS 管理
  硬件 RAID 缺点:卡坏了 = 救不回来(除非买了同型号卡)
  软件 RAID 优势:跨平台兼容、配置灵活
  → 现在的数据中心很多都用软件 RAID + 主机页面缓存

10.6 误区六:单个 RAID 越大越好

1
2
3
4
5
6
7
8
❌ "把所有盘都组一个 RAID 5"
✓ RAID 故障风险随盘数增长
  4 盘 RAID 5:1 块盘坏能恢复
  24 盘 RAID 5:1 块盘坏能恢复,但
  - 24 盘 = 6 倍故障概率
  - 重建 24 盘 RAID 5 = 几天
  - 重建期间再坏 1 块 = 全毁
  → 大盘数建议:多个小 RAID 10,而不是一个大 RAID 5

十一、RAID + Btrfs / ZFS:现代替代方案

11.1 为什么有 Btrfs RAID / ZFS

传统 RAID 的局限:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
1. 不能检测 bit rot(静默数据损坏)
   - 磁盘说"数据正确",实际已经损坏
   - RAID 5 重建时才发现

2. 单文件级别无法恢复
   - 损坏一个文件,整个 RAID 也能启动
   - 但可能文件已损坏

3. 灵活性差
   - 不能在 RAID 内做快照
   - 不能透明压缩

Btrfs 和 ZFS 内置 RAID 解决了这些

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Btrfs RAID 1(2 块盘)
mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc

# Btrfs RAID 10(4 块盘)
mkfs.btrfs -d raid10 -m raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# ZFS RAID-Z1(类似 RAID 5)
zpool create tank raidz1 /dev/sdb /dev/sdc /dev/sdd

# ZFS RAID-Z2(类似 RAID 6)
zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

11.2 Btrfs / ZFS RAID 与传统 RAID 对比

维度 mdadm RAID Btrfs RAID ZFS RAID
数据校验
自动修复
快照
透明压缩
在线扩容
跨平台 ✅(Linux)
成熟度 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
性能 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐

11.3 实战建议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
小容量(< 4 盘):
  → mdadm RAID 10 + ext4 / XFS
  → 简单成熟,工具支持好

中容量(4-8 盘):
  → mdadm RAID 6 + XFS
  → 或 Btrfs RAID 10
  → Btrfs RAID 5/6 仍不够成熟

大容量(8+ 盘):
  → Btrfs RAID 10 / RAID 6
  → 或 ZFS RAID-Z2 / RAID-Z3
  → 比 mdadm 更安全

企业级 / 关键业务:
  → 硬件 RAID + BBU(性能、稳定)
  → + Btrfs / ZFS(数据安全)
  → 双层保护

十二、RAID 选型最终决策树

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
开始
  有多重要?
  ├─ 可以偶尔丢失
  │  └─ RAID 0(性能)/ 单盘裸奔
  ├─ 不能丢失但数据可重建
  │  └─ RAID 1 / RAID 5 / RAID 6
  └─ 绝对不能丢失
     └─ RAID 10 / RAID 6 + 备份 + 异地容灾

+ 考虑
  ├── 盘数多少?
  │   ├── 2 块盘 → RAID 1
  │   ├── 3 块盘 → RAID 5
  │   ├── 4-8 块盘 → RAID 10 / RAID 6
  │   └── 8+ 块盘 → RAID 10 / RAID 60 / 多盘阵
  ├── 性能要求?
  │   ├── 高性能 → RAID 10
  │   └── 一般 → RAID 5 / RAID 6
  └── 容量要求?
      ├── 容量优先 → RAID 6
      └── 性能优先 → RAID 10

十三、运维检查清单

RAID 上线前必查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
□ 检查所有硬盘 SMART 健康状态
  $ smartctl -H /dev/sd{a..z}

□ 做一次完整读写测试
  $ fio --name=randwrite --ioengine=libaio --direct=1 \
        --filename=/dev/md0 --size=10G --bs=4k --rw=randwrite

□ 验证 RAID 重建流程(先模拟故障)
  $ mdadm /dev/md0 --fail /dev/sdb1
  $ mdadm /dev/md0 --remove /dev/sdb1
  $ mdadm /dev/md0 --add /dev/sdb1
  $ cat /proc/mdstat  # 查看重建

□ 检查 mdadm 监控
  $ systemctl status mdmonitor

□ 配置邮件告警
  $ vim /etc/mdadm.conf
  MAILADDR admin@example.com

□ 配置 cron 定期 scrub
  $ echo "0 3 * * 0 /sbin/btrfs scrub start /mnt/raid" >> /var/spool/cron/root

RAID 运行时必查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
□ 每周检查 RAID 状态
  $ cat /proc/mdstat
  $ mdadm --detail /dev/md0

□ 每月全盘 SMART 测试
  $ smartctl -t long /dev/sdb

□ 每年体检
  - 检查 BBU/超级电容健康
  - 检查硬盘温度(应该 < 45°C)
  - 检查机箱散热
  - 备份配置到版本管理

结语

RAID 不是"选个等级就完事",它是一个业务场景驱动的权衡问题

1
2
3
4
你是要性能,还是要容量,还是要安全?
你能容忍重建多久?
你的硬盘多大?
故障期间业务能不能停?

无论选哪种 RAID,都不能替代备份。3-2-1 原则(3 份副本、2 种介质、1 份异地)是 RAID 之外的另一道防线。

更重要的是,监控是 RAID 真正的保障。硬盘坏了 RAID 能救,但你不知道它坏了,它就救不了你。

mdadm --detailsmartctl -Hbtrfs scrub 每天看一次,比任何 RAID 等级都更接近"绝对安全"。

回到开头的场景:

1
2
3
4
5
6
不要再说"组个 RAID 5 就安全了"——
更准确地说是:
"组个 RAID 10 + 装上 mdadm 监控 + 启用 SMART 巡检 +
 做 3-2-1 备份 + 每月测试一次恢复 + 写了runbook 应对故障。"

这才叫专业的存储方案。

相关推荐阅读

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计