介质错误与扫描
介质错误指扇区上的数据无法正确读出,可能经过重试后由 ECC 纠正,也可能彻底不可纠正。它平时隐藏得很好,因为只有真正去读那个扇区时才会暴露。介质扫描(巡检、scrub、一致性校验)通过定期全量读取并校验冗余,把潜在的坏块提前暴露出来,用仍然存在的冗余把数据修复到其他位置。
基本信息
| 错误分类 | 可纠正错误、不可纠正读错误、写错误、待定扇区 |
|---|---|
| 暴露时机 | 全量读取、备份、重建、扩容迁移等需要读遍数据的动作 |
| 检测手段 | 阵列或文件系统巡检、介质扫描工具、盘长自检、冗余一致性校验 |
| 主要代价 | 全量读占用带宽与介质寿命,业务高峰期影响明显 |
| 频率原则 | 数据越重要、重建窗口越长,巡检越应固定化并留档 |
| 判读输出 | 坏块位置、不可纠正计数、修复是否成功三件事 |
典型使用场景
- 制定定期巡检计划,把全盘校验安排在业务低峰并留出充分窗口时
- 阵列仍未降级、冗余尚在时,把潜在坏块修复到安全位置时
- 备份校验失败,需要定位是备份介质问题还是源数据读错误时
- 重建前评估剩余成员的介质健康,判断重建是否有失败风险时
- 固态盘长期在线后出现读错误,判断是否需要重写刷新或替换时
扫描与校验操作
扫描与校验操作
# 软件阵列:check 只校验不修复,repair 会尝试修复不一致
cat /sys/block/md0/md/mismatch_cnt
echo check > /sys/block/md0/md/sync_action
# 观察巡检进度与速度,必要时限速避免抢占业务带宽
dd if=/sys/block/md0/md/sync_speed_max 2>/dev/null
# 盘级只读坏块扫描,输出坏块列表便于比对
badblocks -sv -o /var/tmp/sdb.bb.log /dev/sdb
# 盘长自检补一层介质验证
smartctl -t long /dev/sdb && smartctl -l selftest /dev/sdb错误类型与处置
| 类型 | 现象 | 处置方向 |
|---|---|---|
| 可纠正错误 | 重试后读出,计数缓慢增长 | 纳入趋势监控,无需立即更换 |
| 不可纠正读错误 | 读取失败,需靠冗余重建该块 | 用冗余修复并评估盘健康 |
| 待定扇区 | 读取异常待判定 | 复测确认后按不可纠正处理 |
| 写错误 | 写入失败或重试写入 | 重点检查链路与盘状态 |
阵列处于降级状态时不要启动高负载全盘扫描:此时冗余已不足,扫描带来的额外读压力会显著提高二次故障造成数据不可用的概率。扫描应安排在冗余完整、业务低峰的窗口。
扫描发现问题不等于盘必须更换:单次可纠正错误可能多年不再出现,连续的不可纠正错误与重分配扇区增长才是更换信号。判断要看多次扫描结果的对比。