Linux服务器RAID阵列配置与软硬RAID数据重建实战

Linux服务器RAID阵列配置是存储可靠性的基础保障。RAID通过数据冗余和条带化技术,在磁盘故障时保证数据完整性,同时提升读写性能。生产环境中RAID阵列的创建、监控和故障重建是服务器运维的核心技能。mdadm是Linux软件RAID管理的事实标准工具,配合硬件RAID控制器的CLI工具,覆盖从阵列创建到故障恢复的完整生命周期管理。

RAID级别选择与适用场景分析

RAID级别的选择取决于数据安全性、读写性能和存储利用率的权衡。RAID 0提供最高读写性能但无冗余,适用于临时数据和缓存场景。RAID 1提供完全镜像,适用于操作系统盘和小容量高可靠性数据。RAID 5在存储利用率和冗余之间取得平衡,最少3块盘,允许1块盘故障。RAID 6提供双重冗余,最少4块盘,允许2块盘同时故障,适用于大容量存储阵列。RAID 10是RAID 1+0的嵌套组合,兼顾性能和冗余,适用于数据库存储。

# 查看系统磁盘信息
lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL

# 查看是否有硬件RAID控制器
lspci | grep -i raid

# 查看现有RAID阵列状态
cat /proc/mdstat
mdadm --detail /dev/md0

# 查看硬件RAID控制器信息(以MegaRAID为例)
megacli -LDInfo -Lall -aAll
megacli -PDList -aAll

软件RAID阵列创建与配置

使用mdadm创建软件RAID阵列,需要先对磁盘进行分区并设置RAID分区类型标志。创建阵列后配置/etc/mdadm/mdadm.conf文件确保系统重启后阵列自动组装。

# 对4块新磁盘进行分区
for disk in /dev/sdb /dev/sdc /dev/sdd /dev/sde; do
    parted -s "$disk" mklabel gpt
    parted -s "$disk" mkpart primary 1MiB 100%
    parted -s "$disk" set 1 raid on
done

# 创建RAID 10阵列(4块盘)
mdadm --create /dev/md0 --level=10 --raid-devices=4 \
    /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 创建RAID 6阵列(4块盘,允许2块故障)
mdadm --create /dev/md1 --level=6 --raid-devices=4 \
    /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1

# 查看阵列构建进度和状态
watch -n 5 'cat /proc/mdstat'

# 查看阵列详细信息
mdadm --detail /dev/md0

# 生成mdadm.conf配置
mdadm --detail --scan --verbose > /etc/mdadm/mdadm.conf

# 更新initramfs以确保启动时加载RAID
update-initramfs -u

RAID阵列文件系统创建与挂载

RAID阵列创建完成后,需要在阵列设备上创建文件系统并配置自动挂载。对于大容量阵列推荐使用XFS文件系统,其在大文件处理和并发IO方面表现优于ext4。

# 在RAID阵列上创建XFS文件系统
mkfs.xfs -f /dev/md0

# 创建挂载点
mkdir -p /mnt/raid10

# 挂载阵列
mount /dev/md0 /mnt/raid10

# 获取RAID设备的UUID
blkid /dev/md0

# 配置/etc/fstab自动挂载(使用UUID更可靠)
# /dev/md0: UUID="a1b2c3d4-..."
echo 'UUID=a1b2c3d4-... /mnt/raid10 xfs defaults,noatime,nodiratime 0 0' >> /etc/fstab

# 验证挂载配置
mount -a
df -h /mnt/raid10

# XFS文件系统性能优化挂载参数
mount -o noatime,nodiratime,allocsize=1g,inode64 /dev/md0 /mnt/raid10

RAID阵列监控与告警配置

RAID阵列的主动监控是预防数据丢失的关键。mdadm支持邮件告警,当阵列状态变化(磁盘故障、重建开始等)时自动发送通知。配合syslog和自定义监控脚本实现多层级告警。

# 配置mdadm邮件告警
# 编辑/etc/mdadm/mdadm.conf
# MAILADDR admin@example.com
# MAILFROM mdadm@example.com

# 测试邮件告警
mdadm --monitor --scan --test --oneshot

# 启动mdadm监控守护进程
systemctl enable mdadm-monitor
systemctl start mdadm-monitor

# 自定义RAID监控脚本
cat > /usr/local/bin/raid_monitor.sh << 'EOF'
#!/bin/bash
ALERT_EMAIL="ops@example.com"
HOSTNAME=$(hostname)

check_raid() {
    local raid_status=$(cat /proc/mdstat)
    local degraded=$(echo "$raid_status" | grep -c "_")
    local failed=$(echo "$raid_status" | grep -c "F")
    local rebuilding=$(echo "$raid_status" | grep -c "recovery")
    
    if [ "$degraded" -gt 0 ] || [ "$failed" -gt 0 ]; then
        send_alert "RAID CRITICAL" "RAID阵列降级或磁盘故障!\n\n$raid_status"
    elif [ "$rebuilding" -gt 0 ]; then
        send_alert "RAID WARNING" "RAID阵列正在重建\n\n$raid_status"
    fi
    
    for dev in $(ls /dev/sd[a-z] | grep -v "[0-9]"); do
        smart_health=$(smartctl -H "$dev" 2>/dev/null | grep -i "result" | awk -F: '{print $2}' | xargs)
        if [ "$smart_health" != "PASSED" ] && [ -n "$smart_health" ]; then
            send_alert "SMART WARNING" "磁盘 $dev SMART状态异常: $smart_health"
        fi
    done
}

send_alert() {
    local subject="$1: $HOSTNAME RAID Alert"
    local body="$2"
    echo "$body" | mail -s "$subject" "$ALERT_EMAIL"
    logger -t raid_monitor "$subject: $body"
}

check_raid
EOF

chmod +x /usr/local/bin/raid_monitor.sh
echo "*/10 * * * * root /usr/local/bin/raid_monitor.sh" >> /etc/crontab

磁盘故障更换与RAID数据重建

当RAID阵列中磁盘发生故障时,需要及时更换故障磁盘并触发数据重建。重建过程会消耗大量IO资源,建议在业务低峰期执行。重建期间阵列处于降级状态,数据冗余性降低,应避免额外的磁盘负载。

# 标记故障磁盘为fail并移除
mdadm /dev/md0 --fail /dev/sdc1
mdadm /dev/md0 --remove /dev/sdc1

# 物理更换磁盘后,对新磁盘进行分区
parted -s /dev/sdc mklabel gpt
parted -s /dev/sdc mkpart primary 1MiB 100%
parted -s /dev/sdc set 1 raid on

# 将新磁盘添加到RAID阵列,触发重建
mdadm /dev/md0 --add /dev/sdc1

# 监控重建进度
watch -n 10 'cat /proc/mdstat'

# 查看重建详细信息和预计完成时间
mdadm --detail /dev/md0 | grep -E "State|Rebuild|Resync"

# 调整重建速度限制(默认较保守,低峰期可提高)
cat /proc/sys/dev/raid/speed_limit_min
cat /proc/sys/dev/raid/speed_limit_max

# 临时提高重建速度上限
echo 200000 > /proc/sys/dev/raid/speed_limit_max

# 永久配置
echo "dev.raid.speed_limit_max = 200000" >> /etc/sysctl.conf
sysctl -p

RAID阵列扩容与在线容量扩展

业务增长导致存储容量不足时,可以通过更换更大容量磁盘或增加磁盘数量来扩容RAID阵列。RAID 5和RAID 6支持在线容量扩展,但过程耗时较长且存在风险,需要做好数据备份。

# 方法一:逐块更换大容量磁盘并等待重建完成后扩容
for disk in /dev/sdb1 /dev/sdc1 /dev/sdd1; do
    mdadm /dev/md0 --fail "$disk"
    mdadm /dev/md0 --remove "$disk"
    # 物理更换大容量磁盘后重新分区并添加
    # mdadm /dev/md0 --add "$disk"
    while mdadm --detail /dev/md0 | grep -q "resync"; do
        sleep 30
    done
done

# 所有磁盘更换完成后,扩展阵列容量
mdadm --grow /dev/md0 --size=max

# 扩展文件系统(XFS)
xfs_growfs /mnt/raid5

# 方法二:增加磁盘数量扩容(RAID 5添加1块盘)
mdadm --grow /dev/md0 --raid-devices=4 --add /dev/sdf1

# 等待reshape完成
watch -n 30 'cat /proc/mdstat'

# reshape完成后扩展文件系统
xfs_growfs /mnt/raid5

硬件RAID控制器管理命令

硬件RAID通过专用控制器卡实现RAID计算,不占用CPU资源。不同厂商的RAID控制器管理工具不同,常见的是Broadcom MegaRAID系列和Adaptec系列。

# MegaRAID常用命令
megacli -LDInfo -Lall -aAll       # 查看所有逻辑磁盘
megacli -PDList -aAll             # 查看所有物理磁盘
megacli -AdpAllInfo -aAll         # 查看控制器状态

# 创建RAID 5逻辑磁盘(3块盘)
megacli -CfgLdAdd -r5 [0:1,0:2,0:3] WB RA Direct -a0

# 热备盘配置
megacli -PDHSP -Set -EnclAffinity -PhysDrv [0:4] -a0

# 查看重建进度
megacli -PDRbld -ShowProg -PhysDrv [0:1] -a0

# 重建Patrol Read(巡读检测)
megacli -AdpPrp -Info -a0
megacli -AdpPrp -EnblAuto -a0

# 查看控制器事件日志
megacli -AdpEventLog -GetEvents -f events.log -a0

RAID数据恢复与灾难处理

当RAID阵列出现多盘故障导致阵列失效时,不要急于重建阵列,应先对磁盘进行逐块镜像备份。使用dd命令或专业工具将故障磁盘数据镜像到安全存储,然后基于镜像进行虚拟RAID重组。

# 对故障磁盘做完整镜像(只读模式,避免二次损坏)
# 使用ddrescue处理有坏道的磁盘
ddrescue -d -r3 /dev/sda /mnt/backup/sda.img /mnt/backup/sda.log

# 对所有成员盘做镜像后,使用mdadm组装虚拟阵列
losetup /dev/loop0 /mnt/backup/sdb.img
losetup /dev/loop1 /mnt/backup/sdc.img
losetup /dev/loop2 /mnt/backup/sdd.img

# 强制组装RAID阵列
mdadm --assemble --force /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2

# 如果无法正常组装,尝试--run参数启动不完整阵列
mdadm --assemble --run /dev/md0 /dev/loop0 /dev/loop1

# 尝试挂载恢复数据(只读模式)
mount -o ro /dev/md0 /mnt/recovery

# 使用testdisk进行深度文件恢复
testdisk /mnt/backup/sdb.img

RAID阵列运维的核心在于预防而非恢复。定期检查阵列状态、监控磁盘SMART数据、保持热备盘就绪、制定磁盘更换SOP流程,这些措施能将数据丢失风险降到最低。阵列重建操作应在业务低峰期执行,重建期间密切关注IO负载和重建进度,避免重建过程中发生更多磁盘故障导致阵列彻底失效。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-raid-zhen-lie-pei-zhi-yu-ruan-ying-raid-shu/

(0)
小编小编
上一篇 19小时前
下一篇 19小时前

相关推荐