字数 6278,阅读大约需 32 分钟
一、 RAID基础入门
1.1 什么是RAID
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理磁盘组合成单一逻辑存储单元的技术。Linux内核通过md(Multiple Devices)驱动实现软件RAID,不需要额外的硬件RAID卡。
软RAID的优势:
1.2 各类RAID级别详解
RAID 0(条带化)
┌─────────┬─────────┐
│ 数据A │ 数据C │ ← 磁盘1
├─────────┼─────────┤
│ 数据B │ 数据D │ ← 磁盘2
└─────────┴─────────┘
写入时交叉分布
工作原理: 将数据分割成块(chunk),并行写入所有磁盘。就像图书馆把一本书的章节分散放到多个书柜,读取时从多个书柜同时取,速度翻倍。
特点:
适用场景: 对性能要求高、对数据安全性要求低的场景,如视频编辑缓存、临时数据处理、非关键数据的快速读写。
典型应用命令:
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
RAID 1(镜像)
┌─────────┐ ┌─────────┐
│ 数据A │ ←─────→ │ 数据A │ ← 磁盘1 与 磁盘2 互为镜像
│ 数据B │ ←─────→ │ 数据B │
└─────────┘ └─────────┘
工作原理: 将相同的数据同时写入两块磁盘,形成"镜像"关系。读取时可从任意一块磁盘取数据,写入时需要同时写两份。
特点:
- • 读写性能:读取性能提升(可并行读),写入性能略下降(需要写两份)
适用场景: 对数据安全性要求高的场景,如系统盘、重要数据库、归档数据。
典型应用命令:
# 创建RAID1,可用容量为较小磁盘的容量
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 创建 degraded RAID1(只有一块盘,后续再添加)
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
RAID 4(专用校验盘)
┌─────────┬─────────┬─────────┬─────────┐
│ 数据A │ 数据B │ 数据C │ 校验P │
└─────────┴─────────┴─────────┴─────────┘
↑ ↑
数据盘1-3 专用校验盘
工作原理: 将数据分散写入前N-1块盘,用第N块盘专门存储奇偶校验信息。任意一块数据盘故障时,可通过校验盘和其他数据盘重建数据。
特点:
- • 读写性能:读取性能好,写入时需要计算并写入校验盘,形成瓶颈
- • 故障影响:校验盘故障不影响数据读取,但失去容错能力
历史地位: RAID4现已较少直接使用,其设计缺陷(校验盘成为瓶颈)被RAID5改进。现在RAID4主要作为RAID5演变过程中的过渡技术了解即可。
RAID 5(分布式校验)
磁盘1: [数据A] [数据D] [校验P] [数据G]
磁盘2: [数据B] [校验P] [数据E] [数据H]
磁盘3: [数据C] [数据F] [数据I] [校验P]
↑ ↑ ↑
分布式校验块(每块磁盘都存数据且都存校验)
工作原理: 数据和校验信息交叉分布在所有磁盘上。校验块P = A ⊕ B ⊕ C,如果任意一块盘故障,可用其余盘重建。
特点:
- • 读写性能:读取性能好,写入性能中等(需要计算校验)
- • 故障影响:一块磁盘故障仍可正常工作,但再故障一块则数据全丢
适用场景: 平衡性能、安全性和成本的场景,如中小型企业的文件存储、Web服务器数据盘。
创建示例:
# 创建3盘RAID5,-n3表示3块活动盘
mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# 查看阵列信息
mdadm --detail /dev/md5
RAID 6(双重分布式校验)
磁盘1: [数据A] [数据E] [校验P] [校验Q] [数据I]
磁盘2: [数据B] [校验P] [数据F] [数据J] [校验Q]
磁盘3: [数据C] [数据G] [校验Q] [校验P] [数据K]
磁盘4: [数据D] [数据H] [数据L] [数据M] [数据N]
↑ ↑
校验P 校验Q(双重校验)
工作原理: RAID6使用两种独立的校验算法(P和Q),相当于双重保险。可同时容忍两块磁盘故障。
特点:
- • 读写性能:读取性能好,写入性能比RAID5略差(需要计算两种校验)
适用场景: 对数据安全性要求极高的场景,如大型数据库、企业级存储、备份服务器。
创建示例:
# 创建4盘RAID6
mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
RAID 10(镜像+条带)
RAID10不是独立的RAID级别,而是"RAID1+RAID0"的组合,也称为"RAID 1+0"。
┌─────────┬─────────┐
│ 数据A │ 数据A │ ← 镜像组1
├─────────┼─────────┤
│ 数据B │ 数据B │ ← 镜像组2
├─────────┼─────────┤
│ 数据C │ 数据C │ ← 镜像组3(跨线缆备份)
└─────────┴─────────┘
↑ ↑
磁盘1 磁盘2(跨控制器)
工作原理: 先将磁盘分成多组镜像对(RAID1),再对这些镜像对进行条带化(RAID0)。
特点:
- • 读写性能:读写性能都很好(兼具条带化的并行读取和镜像的冗余)
布局选项(--layout):
- •
n(near):同一数据块的多个副本在相近位置的不同磁盘上 - •
f(far):同一数据块的副本在不同磁盘的不同位置(读取性能最佳)
# 创建RAID10,使用默认的near布局
mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 指定far布局以获得最佳读取性能
mdadm --create /dev/md10 --layout=f2 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
适用场景: 数据库等既需要高性能又需要高可靠性的应用。
LINEAR(线性合并)
┌────────────────────┐
│ 磁盘1 │ 先填满磁盘1
├────────────────────┤
│ 磁盘2 │ 再填磁盘2
├────────────────────┤
│ 磁盘3 │ 最后填磁盘3
└────────────────────┘
工作原理: 按顺序将磁盘首尾相连,创建一个容量为所有磁盘之和的虚拟磁盘。没有条带化,没有校验,完全是简单合并。
特点:
重要限制: 线性阵列一旦创建,无法再添加新磁盘(这是与RAID0的重要区别)。删除磁盘更是不可能的。
适用场景: 当只有不同容量的磁盘需要合并成一个逻辑卷时使用,或作为临时的简单存储方案。
# 创建LINEAR阵列
mdadm --create /dev/mdlinear --level=linear --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
CONTAINER(容器模式)
┌─────────────────────────────────────────────────────────┐
│ CONTAINER │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│ │ RAID1 │ RAID1 │ RAID5 │ RAID5 │ SPARE │ │
│ │ (整盘) │ (整盘) │ (半盘) │ (半盘) │ (半盘) │ │
│ └─────────┴─────────┴─────────┴─────────┴─────────┘ │
│ ↑ ↑ ↑ ↑ │
│ 元数据区域(描述整个容器的配置) │
└─────────────────────────────────────────────────────────┘
工作原理: CONTAINER是一种特殊的RAID模式,类似于硬件RAID卡上的"磁盘组"。整个容器有统一的元数据区,其中定义了多个子阵列,每个子阵列可以使用容器中磁盘的不同部分。
特点:
- • 灵活性高:可以在容器内创建不同级别、不同大小的阵列
- • 元数据集中:所有子阵列的配置信息存储在容器的统一元数据区
适用场景: 企业级存储,需要在同一组物理磁盘上创建多种RAID级别的阵列。
# 创建IMSM容器
mdadm --create /dev/md/container --level=container --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
# 在容器内创建RAID5
mdadm --create /dev/md/container --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc
# 启动容器内的所有阵列
mdadm --incremental /dev/md/container
1.3 RAID级别对比一览
二、 mdadm工具入门
2.1 mdadm简介
mdadm是Linux下管理软件RAID的核心工具,全称"Multiple Devices Administration"。它的主要功能包括:
- • 创建带超级块(superblock)的RAID阵列
基本语法:
mdadm [模式] <RAID设备> [选项] <组件设备>
2.2 mdadm的工作模式
mdadm有多种工作模式,通过不同的选项切换:
| | |
|---|
| -A, --assemble | |
| -B, --build | |
| -C, --create | |
| -F, --follow, --monitor | |
| -G, --grow | |
| -I, --incremental | |
| | |
| | |
2.3 常用选项汇总
模式选择:
-A, --assemble # 组装阵列
-B, --build # 构建阵列(无superblock)
-C, --create # 创建阵列
-F, --follow # 监控模式
-G, --grow # 动态调整
-I, --incremental # 增量模式
常用参数:
-n, --raid-devices= # 活动设备数量
-x, --spare-devices= # 热备盘数量
-l, --level= # RAID级别(0,1,4,5,6,10,linear,container)
-c, --chunk= # chunk大小(默认512KB)
-z, --size= # 每个磁盘使用的容量
--name= # 阵列名称
--uuid= # 指定阵列UUID
-e, --metadata= # superblock格式(0.90, 1.0, 1.1, 1.2, ddf, imsm)
行为控制:
-v, --verbose # 详细输出
-q, --quiet # 静默模式
-f, --force # 强制执行
--run # 强制启动阵列
三、 阵列的创建与组装
3.1 创建前的准备工作
步骤1:检查磁盘状态
在创建阵列之前,务必确认磁盘是干净的,没有重要的现有数据:
# 查看磁盘分区情况
fdisk -l /dev/sdb
# 检查是否有superblock(是否已属于某个阵列)
mdadm --examine /dev/sdb1
# 查看当前已存在的阵列
cat /proc/mdstat
步骤2:规划磁盘用途
建议使用独立的磁盘或分区来构建RAID,避免与现有系统冲突。常见的做法:
- • 使用磁盘分区:
/dev/sdb1, /dev/sdc1
步骤3:了解磁盘容量差异
如果磁盘容量不同,阵列容量以最小磁盘为准。创建前可以检查:
# 查看各磁盘大小
fdisk -l | grep "Disk /dev/sd"
# 预期输出示例:
# Disk /dev/sdb: 500 GiB, 536870912000 bytes
# Disk /dev/sdc: 480 GiB, 514961920000 bytes
# 容量差异超过1%会收到警告
3.2 创建RAID 0
# 创建RAID0,条带大小默认为512KB
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 指定自定义条带大小
mdadm --create /dev/md0 --level=0 --chunk=64 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 创建后查看状态
mdadm --detail /dev/md0
创建后需要格式化:
# 格式化为ext4
mkfs.ext4 /dev/md0
# 挂载使用
mkdir /mnt/raid0
mount /dev/md0 /mnt/raid0
3.3 创建RAID 1
# 创建标准RAID1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 如果只有一块盘,想先创建后添加第二块,可以这样:
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 missing
# 创建时指定名称
mdadm --create /dev/md1 --level=1 --name=data --raid-devices=2 /dev/sdb1 /dev/sdc1
# 查看详细信息
mdadm --detail /dev/md1
3.4 创建RAID 5
# 创建3盘RAID5
mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# 创建带一块热备盘的RAID5
mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 创建时指定chunk大小和校验布局
mdadm --create /dev/md5 --level=5 --chunk=128 --layout=left-symmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
RAID5的校验布局(--layout):
- •
left-symmetric(默认):校验块依次向左分布 - •
right-symmetric:校验块依次向右分布 - •
left-asymmetric:数据块分布后再放校验块
3.5 创建RAID 6
# 创建4盘RAID6
mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 创建RAID6,指定双重校验布局
mdadm --create /dev/md6 --level=6 --layout=la -raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
3.6 创建RAID 10
# 创建4盘RAID10,使用near2布局(默认)
mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 指定far布局(最佳读取性能)
mdadm --create /dev/md10 --level=10 --layout=f2 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 创建2盘RAID10(最小配置)
mdadm --create /dev/md10 --level=10 --raid-devices=2 /dev/sdb1 /dev/sdc1
RAID10布局格式:[n|f|o][N]
- • 字母:副本排列方式(near/offset/far)
3.7 组装阵列
从配置文件组装:
# 自动组装所有已知阵列
mdadm --assemble --scan
# 组装特定阵列
mdadm --assemble /dev/md0
# 组装时使用配置文件
mdadm --assemble --config=/etc/mdadm/mdadm.conf /dev/md0
手动指定组件组装:
# 指定UUID组装
mdadm --assemble /dev/md0 --uuid=12345678:abcdef00:12345678:abcdef00 /dev/sdb1 /dev/sdc1
# 指定名称组装
mdadm --assemble /dev/md0 --name=data /dev/sdb1 /dev/sdc1
强制组装(当阵列不完整时):
# 强制组装,即使有设备丢失
mdadm --assemble /dev/md1 --force /dev/sdb1
# 以降级模式启动RAID5
mdadm --assemble /dev/md5 --run /dev/sdb1 /dev/sdc1 missing
3.8 保存阵列配置
创建阵列后,建议将配置写入配置文件,以便重启后能自动组装:
# 扫描当前阵列信息
mdadm --detail --scan
# 将配置追加到配置文件
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# 编辑配置文件(可选),设置邮件通知等
vi /etc/mdadm/mdadm.conf
配置文件示例:
DEVICE /dev/sd*[0-9]
ARRAY /dev/md0 metadata=1.2 name=server:raid0 UUID=12345678:abcdef00:12345678:abcdef00
ARRAY /dev/md1 metadata=1.2 name=server:raid1 UUID=87654321:fedcba00:87654321:fedcba00
MAILADDR admin@example.com
四、 阵列的日常维护
4.1 查看阵列状态
查看所有阵列的概要信息:
cat /proc/mdstat
输出示例:
Personalities : [raid1] [raid5] [raid6] [raid10]
md0 : active raid1 sdb1[1] sdc1[0]
488386464 blocks super 1.2 [2/2] [UU]
[=========>...........] resync = 42.5% (208368128/488386464) finish=45.2min speed=103520K/sec
md1 : active raid5 sdd1[3] sdc1[2] sdb1[0]
976568192 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
查看详细阵列信息:
# 查看单个阵列详情
mdadm --detail /dev/md0
# 查看所有阵列的概要信息
mdadm --brief --scan
# 查看某个组件设备的信息
mdadm --examine /dev/sdb1
4.2 管理阵列成员
添加热备盘:
# 添加一块热备盘
mdadm /dev/md0 --add /dev/sdd1
# 查看添加后的状态
mdadm --detail /dev/md0
移除故障盘:
# 先标记为故障(如果还没自动标记)
mdadm /dev/md0 --fail /dev/sdc1
# 再移除
mdadm /dev/md0 --remove /dev/sdc1
替换故障盘:
# 将新盘标记为备用并开始重建
mdadm /dev/md0 --replace /dev/sdc1
# 如果有多个候选备用盘,可以指定优先使用哪个
mdadm /dev/md0 --replace /dev/sdc1 --with /dev/sdd1
重新添加已移除的盘:
# 尝试重新加入阵列
mdadm /dev/md0 --re-add /dev/sdc1
# 如果是因为元数据问题,可能需要更新设备大小
mdadm /dev/md0 --re-add /dev/sdc1 --update=devicesize
在RAID1/5/6中添加新盘:
# 将RAID5从3盘扩展到4盘
mdadm --grow /dev/md5 --raid-devices=4 --add /dev/sde1
# 将RAID1从2盘扩展到3盘
mdadm --grow /dev/md1 --raid-devices=3 --add /dev/sdd1
4.3 停止和启动阵列
停止阵列:
# 停止之前先卸载
umount /dev/md0
# 停止阵列
mdadm --stop /dev/md0
# 停止所有可停止的阵列
mdadm --stop --scan
启动阵列:
# 组装并启动
mdadm --assemble /dev/md0
# 或者
mdadm --run /dev/md0
# 扫描并启动所有阵列
mdadm --assemble --scan
4.4 擦除超级块
如果想将磁盘从阵列中完全移除并另作他用:
# 普通擦除(只在确认有有效superblock时)
mdadm --zero-superblock /dev/sdc1
# 强制擦除(即使superblock看起来无效)
mdadm --zero-superblock --force /dev/sdc1
注意: 擦除前务必确认磁盘已从阵列中移除,否则可能导致阵列降级或数据丢失。
4.5 动态调整阵列
调整RAID5的chunk大小:
# 需要backup文件
mdadm --grow /dev/md5 --chunk=256 --backup-file=/root/raid5_backup
# 查看变更后的chunk大小
mdadm --detail /dev/md5 | grep chunk
改变RAID级别:
# 将RAID5转换为RAID6(需要至少4块盘)
mdadm --grow /dev/md5 --level=6 --backup-file=/root/raid5_backup
# 将RAID5转换为RAID0(收缩操作要小心!)
mdadm --grow /dev/md5 --level=0
调整一致性策略:
# 启用写意图位图
mdadm --grow /dev/md5 --bitmap=internal
# 禁用位图
mdadm --grow /dev/md5 --bitmap=none
# 改变一致性策略
mdadm --grow /dev/md5 --consistency-policy=resync
4.6 检查和修复阵列
手动触发一致性检查:
# 设置检查动作
mdadm --action=check /dev/md5
# 或者在/proc/mdstat中查看进度
cat /proc/mdstat
手动触发修复:
# 设置修复动作
mdadm --action=repair /dev/md5
检查并自动修复:
# 对所有阵列执行检查
mdadm --wait /dev/md5
# 或者设置每日cron任务自动检查
echo "MAILADDR root" >> /etc/mdadm/mdadm.conf
五、 阵列监控
5.1 mdadm监控模式简介
mdadm的监控模式(Monitor mode)可以实时监控阵列状态,并在发生故障时:
监控事件类型:
- •
DeviceDisappeared - 阵列消失
5.2 启动监控
基本监控命令:
# 监控所有阵列,每60秒检查一次
mdadm --monitor --scan
# 指定邮件地址
mdadm --monitor --scan --mail=admin@example.com
# 指定报警程序
mdadm --monitor --scan --program=/usr/local/bin/raid-alert
# 后台运行并写入PID文件
mdadm --monitor --scan --daemonise --pid-file=/var/run/mdadm.pid
完整监控示例:
# 后台运行,发送邮件和syslog
mdadm --monitor \
--scan \
--mail=admin@example.com \
--program=/usr/local/bin/raid-alert.sh \
--syslog \
--daemonise \
--pid-file=/var/run/mdadm/mdadm.pid
5.3 单次检查(oneshot模式)
适合用cron定期执行:
# 每小时检查一次
0 * * * * /usr/bin/mdadm --monitor --scan --oneshot
# 每天检查一次
0 3 * * * /usr/bin/mdadm --monitor --scan --oneshot --test
5.4 监控脚本示例
#!/bin/bash
# /usr/local/bin/raid-alert.sh
EVENT=$1
DEVICE=$2
DETAIL=$3
LOGFILE="/var/log/raid-alert.log"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOGFILE
}
case $EVENT in
Fail)
log "CRITICAL: Device $DETAIL failed in $DEVICE"
# 这里可以添加更多告警逻辑,如发送短信
;;
FailSpare)
log "CRITICAL: Spare $DETAIL failed during rebuild on $DEVICE"
;;
DegradedArray)
log "WARNING: Array $DEVICE is degraded"
;;
RebuildStarted)
log "INFO: Rebuild started on $DEVICE"
;;
RebuildFinished)
log "INFO: Rebuild finished on $DEVICE"
;;
SpareActive)
log "INFO: Spare $DETAIL activated on $DEVICE"
;;
*)
log "INFO: Event $EVENT on $DEVICE (detail: $DETAIL)"
;;
esac
5.5 系统日志监控
mdadm的监控事件也会记录到syslog,配置文件示例:
# /etc/rsyslog.d/raid.conf
kern.warn;kern.info;kern.debug;mail.*;syslog.*;local6.* /var/log/raid-messages
重启日志服务:
systemctl restart rsyslog
5.6 设置开机自启动监控
使用systemd:
# 创建服务文件
cat > /etc/systemd/system/mdadm-monitor.service << 'EOF'
[Unit]
Description=MDADM RAID Monitor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/mdadm --monitor --scan --daemonise --pid-file=/var/run/mdadm.pid
PIDFile=/var/run/mdadm.pid
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 启用服务
systemctl enable mdadm-monitor
systemctl start mdadm-monitor
六、 故障排除
6.1 常见故障与处理
阵列无法启动:
# 查看详细错误信息
mdadm --assemble /dev/md0 --verbose
# 强制组装
mdadm --assemble /dev/md0 --force
# 检查组件设备
mdadm --examine /dev/sdb1 /dev/sdc1
磁盘标记为"removed":
# 查看当前状态
cat /proc/mdstat
# 尝试重新添加
mdadm --manage /dev/md0 --re-add /dev/sdc1
# 如果不行,先移除再添加
mdadm --manage /dev/md0 --remove /dev/sdc1
mdadm --manage /dev/md0 --add /dev/sdc1
重建卡住:
# 查看重建状态
cat /proc/mdstat
# 如果需要,取消并重新触发
mdadm --manage /dev/md0 --action=idle
mdadm --manage /dev/md0 --action=resync
6.2 从故障中恢复
单盘故障的RAID5恢复:
# 1. 确认故障
cat /proc/mdstat
# 2. 标记故障盘并移除
mdadm /dev/md5 --fail /dev/sdc1
mdadm /dev/md5 --remove /dev/sdc1
# 3. 插入新盘
mdadm /dev/md5 --add /dev/sdd1
# 4. 观察重建过程
watch cat /proc/mdstat
整个阵列数据恢复(最后手段):
# 如果有backup文件,可以恢复
mdadm --assemble /dev/md5 --backup-file=/root/backup.dat /dev/sdb1 /dev/sdc1 /dev/sdd1
6.3 常见错误信息
| | |
|---|
| | |
| | |
| "mdadm: cannot open ...: No such file or directory" | | |
| | |
| | |
6.4 数据备份建议
无论使用何种RAID级别,都应记住:
RAID不是备份!
建议的备份策略:
# 使用rsync定期备份到另一存储
rsync -av /mnt/raid5/ /backup/raid5/
# 或者使用快照
lvcreate -L 10G -s -n raid5-snap /dev/vg0/raid5
# 云备份(定期上传关键数据)
rclone sync /mnt/raid5/ remote:backup-raid5/
七、 性能调优
7.1 chunk大小选择
chunk大小影响IO合并效率:
- • 大chunk(256KB-512KB):适合大文件顺序读写,如视频流、大型数据库
- • 小chunk(4KB-64KB):适合小文件随机读写,如文件服务器、Web应用
# 创建时指定
mdadm --create /dev/md0 --level=5 --chunk=256 --raid-devices=4 /dev/sd[b-e]1
7.2 校验布局选择
对于RAID5/6:
- • left-symmetric(默认):通用性好
- • right-symmetric:某些工作负载性能更好
7.3 位图优化
对于经常断电的环境:
# 启用内部位图
mdadm --grow /dev/md5 --bitmap=internal
# 设置位图chunk大小
mdadm --grow /dev/md5 --bitmap-chunk=64M
7.4 读取策略
对于RAID1/10:
# 查看当前策略
cat /sys/block/md0/md/rmech_percent
# RAID1可以设置读盘策略,但mdadm不直接支持
# 需要在sysfs中调整
八、 实战案例
案例1:构建家用NAS存储
需求:
方案选择:
- • RAID6:可容忍2盘故障,可用容量12TB(4-2=2块盘的容量)
实施:
# 创建RAID6
mdadm --create /dev/md0 --level=6 --name=nas --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 格式化为XFS(支持大文件)
mkfs.xfs -f /dev/md0
# 添加到fstab
echo "/dev/md0 /mnt/nas xfs defaults,noatime 0 2" >> /etc/fstab
# 挂载
mount -a
# 配置监控
mdadm --monitor --scan --mail=your@email.com --daemonise --pid-file=/var/run/mdadm-nas.pid
案例2:数据库服务器高可用存储
需求:
方案选择: RAID10
实施:
# 创建4盘RAID10,far布局
mdadm --create /dev/md1 --level=10 --layout=f2 --name=db --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 使用XFS并优化参数
mkfs.xfs -f -d su=64k,sw=4 /dev/md1
# 挂载
mount -o noatime,nodiratime,logbufs=8 /dev/md1 /var/lib/mysql
# 添加到fstab
echo "/dev/md1 /var/lib/mysql xfs defaults,noatime,nodiratime 0 2" >> /etc/fstab
案例3:临时工作站高速存储
需求:
方案选择: RAID0
实施:
# 创建RAID0
mdadm --create /dev/md0 --level=0 --name=work --chunk=256 --raid-devices=2 /dev/sdb /dev/sdc
# 格式化为ext4
mkfs.ext4 -E stride=64 -E stripe-width=128 /dev/md0
# 挂载
mount /dev/md0 /mnt/work
常用命令速查表
创建命令
# RAID0
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
# RAID1
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# RAID5
mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# RAID6
mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# RAID10
mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
查询命令
mdadm --detail /dev/md0 # 详细状态
mdadm --examine /dev/sdb1 # 组件设备信息
mdadm --brief --scan # 概要扫描
cat /proc/mdstat # 系统状态
管理命令
mdadm --stop /dev/md0 # 停止阵列
mdadm --assemble /dev/md0 # 组装阵列
mdadm --add /dev/md0 /dev/sdd1 # 添加设备
mdadm --remove /dev/md0 /dev/sdc1 # 移除设备
mdadm --fail /dev/md0 /dev/sdc1 # 标记故障
mdadm --re-add /dev/md0 /dev/sdc1 # 重新加入
监控命令
mdadm --monitor --scan # 开始监控
mdadm --monitor --scan --mail=x # 监控并邮件通知
mdadm --monitor --scan --oneshot # 单次检查
参考资源:
- • Linux RAID维基:https://raid.wiki.kernel.org/
- • 官方源码:https://www.kernel.org/pub/linux/utils/raid/mdadm/