首页/系统/服务器硬件与 RAID 速查/RAID 5 写洞(Write Hole)问题
RAID 级别与计算68 条

RAID 5 写洞(Write Hole)问题

断电或崩溃发生在数据与校验分批写入之间时,RAID 5/6 的条带可能处于数据与校验不一致状态,重建后错误会固化。带掉电保护的缓存或事务型文件系统可以缓解。

写洞(Write Hole)问题

RAID 5/6 更新一条带时,数据块与校验块是分批写入的,如果断电、死机或卡故障正好发生在这个窗口内,条带就会处于数据与校验互不一致的状态,这就是所谓的写洞。平时它不会立刻暴露,直到某块盘故障、系统按错误校验去恢复数据时,错误才会被固化进重建结果——表现就是重建完成但数据已经错了。

基本信息

成因同一条带的数据写与校验写未能原子完成(掉电、死机、卡故障)
后果重建时按错误校验恢复,产生静默错误
高风险级别RAID 5 最严重,RAID 6 因有第二组校验相对缓和
缓解手段带电池或电容的写缓存、整条带写、支持校验日志的存储栈(如 ZFS)
防护前提写缓存必须处于受保护状态,且策略为 Write-Back

检查写缓存与保护状态

检查写缓存与保护状态
storcli /c0/v0 show all | grep -i -E "write|policy"   # 当前写策略
storcli /c0/bbu show all | grep -i -E "state|Failed"    # 电池状态
storcli /c0/cv show all                                  # 超级电容状态
storcli /c0 show all | grep -i -E "Cache|Memory"        # 缓存容量
# 定期做一致性检查(CC)也能把不一致提前暴露出来
storcli /c0/v0 start cc

缓解手段对照

手段作用局限
带保护的写缓存掉电时保住缓存数据,争取把条带写完电池老化或策略为 Write-Through 时失效
整条带写一次写覆盖整个条带,减少不一致窗口依赖请求大小与对齐
一致性检查(CC)定期校验数据与校验是否匹配发现时只能记录或修复部分错误
ZFS 校验日志以事务方式提交,避免写洞需要直通盘与专用文件系统

掉电后的正确处置

  • 先确认业务与数据状态,不要直接在阵列上重建
  • 检查卡事件日志与阵列状态,确认是否存在未完成的后台任务
  • 在业务低峰安排一次一致性检查,确认数据与校验是否匹配
  • 有备份的先核对关键数据,再决定后续动作
RAID 5 掉电后先确认一致性检查已做或关键数据已有备份,再决定是否重建;带错误的阵列直接重建会把静默错误固化下来。

易错点

  • 认为 RAID 卡有电池就一定安全:电池老化或策略为 Write-Through 时仍可能出现写洞
  • 掉电后直接强制上线业务、跳过一致性检查:遗留的不一致会在后续重建中被放大
  • 把写洞当成只影响 RAID 5 的问题:RAID 6 概率更低,但同样存在
  • 长期不做一致性检查:不一致状态可能潜伏数月,直到换盘时才爆发
  • 无备份就依赖阵列自愈:写洞导致的静默错误无法靠重建修正,备份才是最后一道防线

数据来源与参考

  • ZFS 文档(write hole 与校验日志)
  • Broadcom MegaRAID 用户指南(写缓存保护)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌