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% |
N× |
N× |
临时数据、缓存 |
| RAID 1 |
2 |
N-1 块 |
50% |
2× |
1× |
系统盘、关键数据 |
| RAID 5 |
3 |
1 块 |
(N-1)/N |
N× |
慢 |
中等冗余、生产 |
| RAID 6 |
4 |
2 块 |
(N-2)/N |
N× |
慢 |
大容量、高安全 |
| RAID 10 |
4 |
至少 1 块 |
50% |
N× |
N× |
数据库、高性能 |
| RAID 50 |
6 |
每组 1 块 |
较高 |
高 |
中 |
大容量 + 性能 |
| RAID 60 |
8 |
每组 2 块 |
较高 |
高 |
中 |
极高高安全 |
| JBOD |
1 |
0 块 |
100% |
1× |
1× |
简单扩容 |
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 --detail、smartctl -H、btrfs scrub 每天看一次,比任何 RAID 等级都更接近"绝对安全"。
回到开头的场景:
1
2
3
4
5
6
|
不要再说"组个 RAID 5 就安全了"——
更准确地说是:
"组个 RAID 10 + 装上 mdadm 监控 + 启用 SMART 巡检 +
做 3-2-1 备份 + 每月测试一次恢复 + 写了runbook 应对故障。"
这才叫专业的存储方案。
|
相关推荐阅读: