背景

服务器硬盘是数据中心最脆弱的组件之一。据行业统计,硬盘的年故障率约为 2%–8%,而一旦 RAID 阵列中的硬盘出现故障未能及时处理,可能导致数据丢失甚至整个卷不可恢复。传统的被动式维护(坏了再换)已无法满足生产环境的高可用需求。本文介绍一套基于 SMART 数据监控与 RAID 状态的硬盘健康预测与智能维护方案,涵盖数据采集、告警阈值设计、故障替换流程等实战内容。

一、SMART 监控体系搭建

1.1 安装 smartmontools

1
2
3
4
5
# Debian/Ubuntu
sudo apt install smartmontools -y

# RHEL/CentOS
sudo yum install smartmontools -y

1.2 启用 SMART 并查看硬盘信息

1
2
3
4
5
6
7
8
# 启用硬盘 SMART
sudo smartctl -s on /dev/sda

# 查看硬盘完整 SMART 信息
sudo smartctl -a /dev/sda

# 简明健康报告
sudo smartctl -H /dev/sda

SMART 健康检查返回 PASSED 表示正常,FAILED 表示该硬盘即将或已经故障,需要立即处理。

1.3 关键 SMART 属性解读

生产环境中,以下属性需要重点监控:

属性 ID 属性名 说明 告警阈值
5 Reallocated_Sector_Ct 重分配扇区数 > 0
10 Spin_Retry_Count 启动重试次数 > 10
187 Reported_Uncorrect 无法纠正的错误数 > 0
188 Command_Timeout 命令超时次数 > 100
197 Current_Pending_Sector 待处理扇区数 > 10
198 Offline_Uncorrectable 离线不可纠正扇区 > 0
199 UDMA_CRC_Error_Count UDMA CRC 错误计数 > 100

实战经验:属性 5(重分配扇区数)一旦出现增长,即使数值很小(1-5),也强烈建议在 1–2 周内更换硬盘,不要等到其他属性恶化。

1.4 自动巡检脚本

将以下脚本加入 crontab,实现每日自动巡检:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# disk_health_check.sh — 每日硬盘健康巡检
LOG_FILE="/var/log/disk_health_check.log"
ALERT_EMAIL="ops@example.com"

for disk in /dev/sd[a-z]; do
[ -b "$disk" ] || continue
result=$(sudo smartctl -H "$disk" 2>/dev/null)
echo "$(date '+%Y-%m-%d %H:%M:%S') $disk: $result" >> "$LOG_FILE"

if echo "$result" | grep -q "FAILED"; then
echo "WARNING: $disk health check FAILED on $(hostname)" | \
mail -s "[ALERT] Disk Failure: $disk" "$ALERT_EMAIL"
fi
done

添加定时任务:

1
2
3
# 每天凌晨 2 点执行巡检
sudo crontab -e
# 0 2 * * * /opt/scripts/disk_health_check.sh

二、RAID 阵列状态监控

2.1 查看 RAID 阵列状态

对于 Linux 软件 RAID(mdadm):

1
2
3
4
5
# 查看所有 RAID 设备状态
cat /proc/mdstat

# 详细查看某个 RAID 阵列
sudo mdadm --detail /dev/md0

输出中需关注 State 字段:clean 表示正常,degraded 表示降级(有硬盘掉线),resyncing 表示正在重建。

2.2 监控 RAID 降级事件

RAID 降级(degraded)是故障的前兆。编写如下监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
# raid_monitor.sh
DEGRADED=$(cat /proc/mdstat | grep -c "_" || true)
RESYNCING=$(cat /proc/mdstat | grep -c "resync" || true)

if [ "$DEGRADED" -gt 0 ]; then
echo "RAID degraded: $DEGRADED array(s) affected"
# 触发告警
fi

if [ "$RESYNCING" -gt 0 ]; then
echo "RAID resyncing in progress"
fi

2.3 热备盘(Hot Spare)机制

生产环境务必配置热备盘。当 RAID 降级时,阵列自动用热备盘替换故障盘并开始重建:

1
2
3
4
5
# 将 /dev/sdb1 添加为 /dev/md0 的热备盘
sudo mdadm --add /dev/md0 --hot-add /dev/sdb1

# 查看热备盘状态
sudo mdadm --detail /dev/md0 | grep -i "hot"

注意:热备盘容量必须不小于 RAID 成员盘中最小盘的容量。

三、故障硬盘替换标准流程

当发现硬盘故障时,按以下步骤处理:

第一步:确认故障盘

1
2
# 确认故障盘 WWN/序列号
sudo smartctl -a /dev/sda | grep -E "Serial Number|WWN"

第二步:标记为故障并移除

1
2
3
4
5
# 标记指定盘为故障
sudo mdadm --manage /dev/md0 --fail /dev/sda1

# 从阵列移除故障盘
sudo mdadm --manage /dev/md0 --remove /dev/sda1

第三步:物理替换硬盘

在服务器运行状态下(支持热插拔的情况下)拔出故障盘,插入新盘。新盘容量不能小于原盘。

第四步:添加新盘到 RAID

1
2
3
4
5
6
7
8
# 分区(与原盘一致)
sudo fdisk /dev/sdb

# 添加到 RAID 阵列
sudo mdadm --manage /dev/md0 --add /dev/sdb1

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

RAID 重建期间系统性能会有所下降,属于正常现象。重建完成后,阵列自动恢复到 clean 状态。

四、硬盘健康趋势分析与预防性更换

仅监控当前状态不足以预测故障。通过 Prometheus + node_exporter 收集 SMART 原始数据,配合 Grafana 可绘制健康趋势图:

1
2
3
4
5
# prometheus.yml 添加 node_exporter 采集
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']

推荐采集的关键 SMART 指标包括 Reallocated_Sector_Ct、Current_Pending_Sector 和 UDMA_CRC_Error_Count。当这些指标出现递增趋势时,即使尚未触发告警阈值,也应纳入关注名单,安排预防性更换。

总结

硬盘故障虽然不可完全预测,但通过 SMART 监控、RAID 阵列状态巡检、热备盘机制与趋势分析四位一体的方案,可以实现从事后救火到事前预防的转变。建议将本文方案固化为每日自动化巡检流程,并定期(每季度)Review 告警阈值与硬盘使用时长(Age),在硬盘进入厂商质保后期前主动更换,将数据丢失风险降到最低。