RAID 磁盘阵列配置与故障恢复

一、RAID 级别选择指南

1.1 常见 RAID 级别对比

RAID 级别 最少磁盘数 可用容量 容错能力 读性能 写性能 适用场景
RAID 0 2 100% 最优 最优 临时数据、缓存
RAID 1 2 50% 1 块磁盘 系统盘、关键数据
RAID 5 3 (N-1)/N 1 块磁盘 通用文件服务器
RAID 6 4 (N-2)/N 2 块磁盘 较差 大容量存储、归档
RAID 10 4 50% 每组 1 块 最优 数据库、高 IOPS 场景

1.2 选型建议

  • 数据库服务器:优先 RAID 10,兼顾性能与冗余
  • 文件服务器:RAID 5 或 RAID 6,平衡容量与成本
  • 系统启动盘:RAID 1,简单可靠
  • 备份存储:RAID 6,允许同时损坏 2 块磁盘

二、软件 RAID 配置(mdadm)

2.1 安装 mdadm

1
2
3
4
5
# CentOS/RHEL
yum install -y mdadm

# Ubuntu/Debian
apt-get install -y mdadm

2.2 创建 RAID 1 阵列

1
2
3
4
5
6
7
8
9
10
11
12
# 查看可用磁盘
lsblk

# 创建 RAID 1(镜像)
mdadm --create --verbose /dev/md0 \
--level=1 \
--raid-devices=2 \
/dev/sdb /dev/sdc

# 查看创建进度
cat /proc/mdstat
mdadm --detail /dev/md0

2.3 创建 RAID 5 阵列

1
2
3
4
5
6
7
8
# 创建 RAID 5(至少 3 块磁盘)
mdadm --create --verbose /dev/md0 \
--level=5 \
--raid-devices=3 \
/dev/sdb /dev/sdc /dev/sdd

# 监控重建进度
watch cat /proc/mdstat

2.4 创建文件系统并挂载

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

# 创建挂载点
mkdir -p /data/raid

# 获取 UUID
blkid /dev/md0

# 写入 fstab(使用 UUID)
echo "UUID=<your-uuid> /data/raid ext4 defaults,noatime 0 0" >> /etc/fstab

# 挂载
mount -a
df -h /data/raid

2.5 保存 RAID 配置

1
2
3
4
5
6
7
8
9
# 备份当前配置
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

# 或手动编辑
mdadm --detail --scan > /etc/mdadm.conf

# 更新 initramfs(确保启动时可识别)
update-initramfs -u # Ubuntu/Debian
dracut -f # CentOS/RHEL

三、硬件 RAID 配置

3.1 进入 RAID 配置界面

  • 开机自检时:根据 RAID 卡提示按键(常见:Ctrl+R、Ctrl+H、F10)
  • IPMI/BMC:通过 Web 界面远程配置
  • 操作系统工具MegaClistorcli(LSI/Broadcom)

3.2 使用 storcli 管理 LSI RAID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装 storcli
yum install -y storcli

# 查看 RAID 卡信息
storcli /c0 show

# 查看虚拟磁盘状态
storcli /c0/vall show

# 查看物理磁盘状态
storcli /c0/eall/sall show

# 创建 RAID 1
storcli /c0 add vd r1 drives=eall:s0,eall:s1

# 创建 RAID 5
storcli /c0 add vd r5 drives=eall:s0,eall:s1,eall:s2

# 查看重建进度
storcli /c0/vall show rebuild

四、RAID 故障处理

4.1 磁盘故障识别

1
2
3
4
5
6
7
8
9
10
11
# 查看 RAID 状态
cat /proc/mdstat

# 正常状态示例
Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[0]
488244664 blocks super 1.2 [2/2] [UU]

# 故障状态示例([U_] 表示一块磁盘失效)
md0 : active raid1 sdc1[1] sdb1[0](F)
488244664 blocks super 1.2 [2/1] [U_]

4.2 标记磁盘失效并移除

1
2
3
4
5
# 标记磁盘为失效
mdadm /dev/md0 --fail /dev/sdb1

# 从阵列中移除
mdadm /dev/md0 --remove /dev/sdb1

4.3 更换磁盘并重建

1
2
3
4
5
6
7
8
# 物理更换磁盘后,将新磁盘加入阵列
mdadm /dev/md0 --add /dev/sdb1

# 监控重建进度
watch cat /proc/mdstat

# 重建完成后验证
mdadm --detail /dev/md0

4.4 常见故障代码

状态标识 含义 处理措施
[UU] 健康 无需操作
[U_] 一块磁盘失效 尽快更换
[_U] 一块磁盘失效 尽快更换
[__] 阵列崩溃 尝试数据恢复
degraded 降级运行 避免重启,立即更换

五、日常维护与监控

5.1 配置邮件告警

1
2
3
4
5
6
7
8
9
# 编辑 mdadm 配置
vim /etc/mdadm/mdadm.conf

# 添加邮件通知
MAILADDR admin@example.com
MAILFROM raid-monitor@example.com

# 重启 mdadm 监控服务
systemctl restart mdmonitor

5.2 定期检查脚本

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# /usr/local/bin/raid-check.sh

MD_STATUS=$(cat /proc/mdstat | grep -E "md[0-9]+" | grep -v "unused")
if echo "$MD_STATUS" | grep -q "_\|degraded"; then
echo "RAID 阵列异常!"
echo "$MD_STATUS"
exit 1
fi

echo "RAID 阵列状态正常"
exit 0

5.3 添加 cron 定时检查

1
2
# 每天上午 9 点检查
0 9 * * * /usr/local/bin/raid-check.sh

六、最佳实践总结

  1. 定期巡检:每周检查 RAID 状态,关注 SMART 信息
  2. 备件储备:保持 1-2 块同型号磁盘作为备件
  3. 监控告警:配置邮件/短信告警,故障第一时间通知
  4. 数据备份:RAID 不是备份,重要数据仍需异地备份
  5. 重建优先:故障磁盘尽快更换,避免第二块磁盘故障导致数据丢失
  6. 文档记录:记录 RAID 配置、磁盘序列号、更换历史

七、参考资料