首页/系统与基础设施/存储速查/存储介质错误与介质扫描方法
存储运维与性能60 条

存储介质错误与介质扫描方法

介质错误是已经写在盘上却读不出来的数据,它的最大危害出现在重建期:读错误会让重建中断,冗余为零时直接威胁数据。定期扫描的价值就是在冗余还存在时把坏块找出来,而不是等重建时才发现。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​​​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

介质错误与扫描

介质错误指扇区上的数据无法正确读出,可能经过重试后由 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

错误类型与处置

类型现象处置方向
可纠正错误重试后读出,计数缓慢增长纳入趋势监控,无需立即更换
不可纠正读错误读取失败,需靠冗余重建该块用冗余修复并评估盘健康
待定扇区读取异常待判定复测确认后按不可纠正处理
写错误写入失败或重试写入重点检查链路与盘状态
阵列处于降级状态时不要启动高负载全盘扫描:此时冗余已不足,扫描带来的额外读压力会显著提高二次故障造成数据不可用的概率。扫描应安排在冗余完整、业务低峰的窗口。
扫描发现问题不等于盘必须更换:单次可纠正错误可能多年不再出现,连续的不可纠正错误与重分配扇区增长才是更换信号。判断要看多次扫描结果的对比。

易错点

  • 从不做介质巡检,问题一直留到重建时才暴露,而那时已经没有冗余可依靠
  • 把扫描安排在业务高峰,巡检抢占带宽导致业务抖动,最终被迫中断未完成的扫描
  • 把巡检当成一次性任务,没有留档,无法判断错误是新出现的还是历史遗留
  • 只看盘的状态灯与 SMART 结论,不看实际读校验结果
  • 在降级期间做全量扫描,把可用性风险主动放大

数据来源与参考

  • INCITS T10 SPC-5《SCSI Primary Commands》读写错误恢复
  • badblocks(8) 与 ddrescue 官方文档
  • NetApp 官方文档《Media Scan 与介质错误处理》

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/media-error-scanning.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​​​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​