ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RAID5双盘故障数据恢复实战:别乱初始化,先镜像再重组

RAID5双盘故障数据恢复实战:别乱初始化,先镜像再重组 凌晨三点收到机房报警短信的时候我就知道这一觉睡不成了。第一块盘红灯还没等我登录阵列卡管理页第二条报警又进来了——第二块盘也掉了。那一刻脑子非常清醒RAID5两块盘故障阵列已经挂了接下来是通宵抢救还是直接面对数据全没的现实就看之前的准备工作和接下来的操作了。这篇文章不科普Raid5的基础概念而是把我处理“Raid5损坏两块盘”这类事故的完整思路写下来先做什么后做什么、哪些操作绝对不能碰、什么情况下能自救、什么情况只能找专业恢复以及事后怎么改造存储结构避免下次再踩同一个坑。不管你是机房里跑业务的服务器管理员还是家里用群晖NAS存照片和资料的玩家只要你现在还在用RAID5这篇文章都值得看完。尤其是那些还没出事的人踩坑的代价真的不低。1. 双盘故障为什么是RAID5的“终局”先搞清楚阵列结构再谈抢救1.1 RAID5不是“备份”它只保证一块盘出故障时业务不断很多人对RAID5的最大误解是把它当成了“数据安全的保险箱”。实际上RAID5的定位非常清楚它用分布式奇偶校验解决的是“一块盘坏掉时阵列还能继续读写”的高可用问题而不是“数据永远不会丢”的备份问题。我把原理用大白话拆开说一下。一个RAID5阵列至少由3块盘组成数据不是完整地放在一块盘上的而是切成一格一格的条带分别写到不同的盘上同时每条条带里还均匀分布着校验数据。我常跟刚入行的同事打比方如果把几块盘看成一个小团队正常每个人各自干活同时轮流有一个人多记一份“全组工作摘要”那么任何一个人临时消失剩下的人靠着其他人的原始数据和摘要也能把缺失的部分推算出来。这就是RAID5单盘容错的数学基础。这个设计让阵列在“最多坏一块盘”的时候可以降级运行也就是坏掉一块盘之后阵列不停止服务只是读性能明显下降写的时候还要额外计算校验值。但这种降级状态是暂时的必须尽快换上新盘并重建数据。很多事故就发生在这个“暂时”的窗口里。1.2 坏两块盘后每个条带组都缺了两个点数学上已经无解当RAID5阵列里两块盘同时故障问题就彻底变性质了。因为每个条带组里一共只有一块校验数据它能帮你推算缺失的一个数据块。可一旦两条盘同时消失任何一个横跨这两块盘的条带组都会出现两个未知数。在只给一个校验方程的情况下你是算不出来缺失内容的。这也是我反复跟生产环境用户强调的一点RAID5坏两块盘从阵列层面看已经是逻辑意义上的数据丢失不是简单换块盘就能自动变好的。系统管理界面里存储池大概率会显示“已崩溃”“无法访问”或者干脆把阵列状态置为failed。此时再纠结“为什么这么多盘只坏了两块就无法读取”已经没有意义应该赶紧切换到“数据恢复”的思考模式。我必须再泼一盆冷水坏两块盘的结局取决于你有没有备份。如果有备份直接重建阵列然后恢复数据损失的最多是时间如果没有备份那这就是一场涉及大量金钱和运气的数据救援行动。而且很多“坏掉”的盘并不是物理报销只是被阵列卡/系统踢下线这种情况有时候还能捞回来一部分。这也是后面章节要展开的重点。1.3 先分清故障顺序是“第一块盘中途被踢”还是“真的两块同步物理损坏”真正在现场处理时我做的第一件事不是急着拆盘而是判断两块盘到底是“同时坏”还是“先后下线”。这个顺序直接决定后面走哪条恢复路线。这里列一个简单分型第一块盘早就已经smart报错、坏道爆炸第二块盘是被降级重建风暴拖累的——这种情况第二块盘往往只是“掉队”物理上没有完全死去还有机会重新识别。两块盘在同一时间段内先后掉线但事件日志显示间隔非常短——这大概率是链路问题、背板故障或电源波动盘本身未必损坏。两块盘都是完全无法识别、通电后异响、SMART完全读取不到——这才是真正的物理物理双盘损坏普通运维阶段能做的非常有限。把故障顺序搞清楚你才知道是马上联系数据恢复公司还是可以自己尝试重新把第二块盘请回阵列。连这个前提都没确认就去换盘基本等于把数据恢复的可能性一点点踢走。2. 看到两块盘亮红灯我建议你这样度过“黄金两小时”2.1 登录管理界面而不是先冲进机房很多人收到报警后的第一反应是跑到机房按下开机键、拔出故障盘看看。这个操作我非常不建议。阵列卡在盘掉线后会把当时的配置、盘序、条带参数记在控制器NVRAM里这是后面尝试恢复阵列的重要“现场证据”。正确顺序是先打开阵列卡管理软件、服务器管理口或者NAS的存储管理界面把报警截图保存下来。硬件卡用户建议登录iDRAC/iLO/阵列卡BIOS看一眼虚拟磁盘状态和物理磁盘状态Linux软阵列用户可以立刻登录系统执行cat /proc/mdstat和mdadm --detail /dev/mdX把输出复制下来群晖用户要打开存储管理器查看存储池和硬盘的健康状态。这些信息都是后续判断和处理的基础绝不能跳过。我在处理一次故障时见过最离谱的操作管理员在阵列报警后直接给“看起来坏掉”的盘做了分区格式化准备换盘重装系统。这种行为等于是把原本还能通过专业恢复救出来的数据直接物理抹掉了。所以请记住报警之后的头两个小时是“黄金两小时”不是让你马上动手而是让你冷静记录、判断、决定。2.2 记录盘位、序列号、事件日志把现场“冻结”下来接下来要在不拔盘的前提下把每一块盘的关键信息登记下来。包括盘位编号、硬盘型号、固件版本、序列号、容量、SMART信息。序列号这东西平时看着没用真到数据恢复的时候是判断盘体身份、确认是否物理调包的关键依据。有些阵列卡管理界面上能直接看到序列号NAS也可以通过SSH执行cat /proc/mdstat配合smartctl -a /dev/sdX来获取。同时要注意查看事件日志里关于每一块盘的错误记录。比如磁盘链路复位次数、超时次数、SMART报错内容。一个容易被忽略的细节是如果第二块盘是被“链路错误”踢出阵列的而市面上同批次盘都在正常工作那很可能不是盘本身坏而是背板接口、SAS线、电源供电或者阵列卡端口的问题。这种情况里把盘插到另一个背板槽位后重新识别就能把双盘故障“降级”成单盘故障从而让阵列重新挂载。2.3 判断第二块盘的真实状态后面才有机会做低成本恢复判断“第二块盘只是被下线”还是“物理损坏”我一般按四个等级来区分这里用一个表格说明第二块盘的表现可能的本质原因恢复优先级阵列卡完全识别不到通电有咔哒声物理损坏磁头卡死/固件损坏只能专业开盘别自己通电操作识别到但SMART属性大量错误读速度极慢盘片坏道严重但固件和电机还能工作可以做整盘镜像优先于一切后续操作识别到但事件记录显示“超时被踢”链路/电源/固件bug导致掉线盘体未必坏有望通过断电重启、换背板槽位找回识别到且SMART基本正常只是阵列逻辑移除元数据冲突或人为误操作成功率较高可以尝试重组阵列我见过很多“两块盘故障”其实是第二种或第三种但因为处理太急把原本可救的盘反复上电、反复初始化反而让数据恢复公司接手时也无从下手。如果没有任何把握最简单稳妥的办法就是先做整盘镜像再尝试恢复操作。镜像的过程我在后面专门讲。3. 服务器阵列无法读取数据时最不能做的三件事和可以自救的路径3.1 系统里看到的是“裸盘”或“无法访问”先别初始化服务器做了RAID5却出现“无法读取数据”的情况时操作系统层面最常见的表现是Windows磁盘管理里显示“未初始化”Linux下fdisk -l找不到原分区群晖里存储池变成“已崩溃”。很多人的第一反应是“分区表丢了重新分区”这是最大的陷阱。要知道阵列卡虚拟磁盘或者NAS存储池在系统里显示为“裸盘”并不代表数据被清空了更不代表必须重新初始化。它只是说操作系统不认得这个盘上的文件系统了而底层的条带数据和校验数据可能还在。在数据恢复语境里没有备份的故障盘每写一次操作都是不可逆的伤害。只能只读访问绝不能写入。如果系统弹窗提示“是否要初始化磁盘”请直接点取消并且断开这台机器对外挂载的操作。Windows的“初始化磁盘”、Linux的mkfs、NAS上的“重新创建存储池”这几个按钮在双盘故障时都是越点越糟糕的选项。3.2 硬件卡阵列和Linux mdadm阵列的自救尝试如果你用的是硬件RAID卡而且登录阵列卡BIOS还能看到虚拟磁盘处于“failed”或“degraded”状态建议先不要删除虚拟磁盘配置也不要把外接盘导入的配置清除。硬件卡的自救空间通常在于控制器里面的foreign config也就是曾经属于阵列但当前状态不一致的盘信息。有些情况下可以通过“Import Foreign Configuration”把一块或几块盘的配置重新加载回来阵列就有机会从failed恢复到degraded。如果用的是Linux服务器、群晖、威联通这类底层基于mdadm的软阵列自救路径要透明得多。可以启动SystemRescue或Ubuntu Live环境执行mdadm --examine /dev/sd[a-z]这条命令会把每块盘上保留的md超级块信息打出来包括阵列UUID、raid level、成员盘序号、事件计数。然后可以尝试把除了确认损坏之外的所有盘重新组起来mdadm --assemble --scan如果扫描不到可以手工指定设备并带上 --force 参数尝试。但这一步必须建立在你已经对每块盘做过镜像的基础上否则强行组装可能让原本还能读的盘产生额外写入。3.3 先给故障盘做整盘镜像再考虑任何“强制激活”我再强调一遍无论后面计划怎么操作请先给两块故障盘做整盘镜像。这一步花的几小时是整场救援中最值得的投资。我用得最多的是Linux下的ddrescue工具它和dd不一样专门为坏道盘设计可以在遇到读取错误时跳过坏区把剩余扇区尽量读出来并且通过日志文件记录哪些扇区已经读完、哪些还需要重试。典型命令ddrescue -n /dev/sdb /mnt/backup/sdb.img /mnt/backup/sdb.log第一次先快速扫描一遍把所有能读的都读取出来之后再针对日志里标记的坏扇区做深度重试不要一开始就猛怼坏道区反而可能把磁头状态搞得更差。做镜像时需要注意目标盘的容量要比源盘大并且镜像文件不要存放在原阵列的其他盘上。我甚至会在那几分钟里把两块故障盘放在稳定供电、无振动的环境下尽量提高读取成功率。数据恢复行业有句话盘还没救出来之前它比黄金还贵一切动作都要降低物理压力和写入风险。3.4 群晖NAS提示“无法更换硬盘”的特殊处理思路最近经常有人反馈“群晖raid5无法更换硬盘”典型场景是存储池已经处于崩溃状状态进入存储管理器准备把故障盘拔下来换新盘系统却灰掉了“更换硬盘”按钮或者点了没反应。这是因为群晖在阵列不健康时为了避免用户误操作故意锁定了部分磁盘操作。越是这种时候越不能通过暴力删除存储池、重新创建RAID来“解锁”。正确方向是SSH登录群晖后台查看底层md设备状态cat /proc/mdstat mdadm --detail /dev/md2如果底层md阵列实际上只坏了一块盘另一块只是元数据或链路问题通过手工方式把第二块盘移除或重新加入往往能让存储池恢复可读。群晖的底层是标准Linux md只要盘没被物理初始化很多情况下可以用外部Linux主机加载镜像后重新组装。实在搞不定记得不要轻易执行群晖“修复”里的重建任务先在专业恢复人员指导下操作。4. 第二块盘为什么总在“第一块坏掉之后”坏重建风暴与同批次风险4.1 重建过程其实就是压垮剩余盘的最后一根稻草我处理过不少“Raid5损坏两块盘”的现场复盘时发现一个规律两块盘的故障往往不是同时发生的而是第一块盘坏掉之后第二块盘在重建过程里被拖垮的。这就是行业内常说的“重建风暴”。第一块盘故障后阵列进入降级模式。管理员处理不及时系统会在插入新盘后自动开始数据重建重建的本质是把所有剩余盘完整读一遍再通过校验数据把新盘填满。在这个过程里阵列的读负载会比正常情况高出几倍每块剩余盘都在满负荷工作。如果这些盘本来就是同一批次生产、同年份服役连健康退化轨迹都差不多那第二块盘大概率会在重建窗口里坚持不住直接从“有坏道”变成“彻底掉线”。更扎心的是许多服务器在重建开始时不会再做剩余盘的健康预检而是直接开干。如果阵列里剩余盘SMART已经亮了黄灯还在硬着头皮重建那就是在用最后一点健康盘寿命去赌。4.2 哪些“看起来还活着”的盘最容易在重建中掉队判断剩余盘能不能扛住重建不要只看阵列卡界面里的“Online”状态。我常用的方式是读取每块盘的SMART关键属性尤其是这么几个Reallocated_Sector_Ct重映射扇区计数Current_Pending_Sector待映射扇区计数UDMA_CRC_Error_Count链路CRC错误计数Raw_Read_Error_Rate原始读错误率其中Pending Sector如果已经开始涨说明盘体已经出现不稳定坏道。重建时碰到这种坏道盘会反复重试进一步增加延迟进而触发控制器的IO超时判定把这块盘从阵列里踢出去。很多阵列卡默认的磁盘超时时间很短只要一块盘因为坏道拖慢了响应就会被“误伤”成故障盘。所以我的经验是当第一块盘故障后先不急着启动重建而是先看剩余盘的SMART。如果已经有大面积坏道或大量待映射扇区宁可先做全盘备份再让阵列重建。这比赌一个快速重建成功要稳妥得多。4.3 控制器设置与盘位布局里容易被忽略的细节除了盘本身的健康度阵列卡控制器、背板、电源也会影响“双盘故障”的风险。一个很常见的问题是重启服务器后阵列卡为了让硬盘快速上线会在每个通道上做较激进的重置如果背板电源不稳或线缆老化就会导致多块盘同时被误报为故障。另外我建议检查阵列卡的磁盘超时和驱动参数。很多卡片默认的disk timeout时间非常短生产环境里一块盘因为固件忙、exception response变慢就会直接触发“Write task abort”并被踢出阵列。这种事我见过太多次了盘本身根本没坏却被阵列卡误杀了。还有一点容易被忽略同一台服务器里尽量不要混插SAS和SATA盘通道拓扑不同SATA盘在RAID重建时对错误的容忍度通常更低。另一个细节是盘位顺序某些老式背板或者直通卡对盘序敏感安装新盘时一定要插回原来的槽位不要让盘位错乱。5. 如果第二块只是“被下线”而不是物理报废怎么把阵列拉回来5.1 让阵列从双盘故障“退化”到单盘故障是最高性价比操作这种场景最有希望救回来两块盘故障但其中一块只是被系统逻辑下线物理上还能稳定读取。此时的核心思路是把阵列状态从“双盘故障”人为退回到“单盘故障”从而让阵列重新挂载。以mdadm软阵列为例子假设有两块盘/dev/sdb和/dev/sdc已掉线其中/dev/sdc在镜像后确认SMART基本正常。可以先把已死亡的盘标记为fail并移除再尝试把剩下的盘和健康盘重新组装mdadm --manage /dev/md0 --fail /dev/sdb mdadm --manage /dev/md0 --remove /dev/sdb mdadm --assemble --run /dev/md0 /dev/sdc /dev/sdd /dev/sde ...如果是因为事件计数不一致导致无法自动组起来可以加--force参数但前提是你已经做了镜像。硬件卡的场景类似有时候把第二块故障盘从虚拟磁盘里Offline让控制器认为它已经不参与阵列再导入剩余盘的foreign config也能让VD状态变成Degraded。这里需要额外提醒不要试图同时把两块故障盘都插回去。双坏时阵列元数据里的成员事件计数可能互相冲突强行一起组装只会让mdadm或阵列卡识别成更多错误。先保一块再保数据才是王道。5.2 阵列重新挂载后的数据搬家顺序如果阵列真的重新挂载成功了我的建议是不要立刻把盘继续用于生产不要立刻对文件系统做修复先把数据整体备份到其他存储设备上。挂载时尽量用只读方式mount -o ro /dev/md0 /mnt/recovery然后立刻使用rsync或者简单粗暴的cp -a把关键数据复制出来。为什么我不建议直接执行fsck因为当阵列经历过降级、掉线、重新组装文件系统元数据已经处于一种脆弱的一致状态fsck可能会“修复”一些错误但这个修复过程会大量写入一旦判断失误原本还能读的文件会被改得彻底丢失。正确顺序是先复制再校验文件完整性最后才考虑文件系统修复。如果你发现挂载后文件系统还是无法识别还可以尝试通过foremost、photorec等工具做文件类型层面的恢复但那是最后一步而且只能按文件类型捞碎片成功率要看文件和文件系统设置。5.3 群晖“存储池已崩溃”后用mdadm手工启动阵列的实战要点群晖用户在存储管理器看到“存储池已崩溃”“无法更换硬盘”时不要急着点“删除”或“修复”。如果你有一定的Linux基础建议用SSH登录群晖后台先把底层状态摸清楚。cat /proc/mdstat mdadm --detail /dev/md2 mdadm --examine /dev/sdb /dev/sdc /dev/sdd /dev/sde群晖的阵列通常由系统分区md0/md1和数据分区md2组成。数据区一般是RAID5或者SHRSHR底层还是mdadm RAID5/RAID6。如果没有硬件故障但md设备被标记为inactive可以尝试mdadm --stop /dev/md2 mdadm --assemble --run /dev/md2 /dev/sdb3 /dev/sdc3 /dev/sdd3注意这里的分区编号sdb3等需要根据mdadm --examine的结果来确定群晖的数据区并不是从整块盘开始的而是建在第三个分区上。如果手工激活成功就能尝试挂载md2上的ext4或btrfs分区把数据复制出来。但如果群晖已经提示“无法更换硬盘”大概率是系统层面锁住了存储池的元数据操作。这个时候不要硬来最快、最稳的办法是把所有硬盘拔下来编号存放找另一台Linux设备对盘做ddrescue镜像再在镜像基础上尝试重组。只要不动原盘主动权就始终在你自己手上。6. 事故之后我不会再教你继续用RAID5扛生产数据6.1 RAID6/热备盘/定时巡检别再让单副本数据裸奔经历一次“Raid5损坏两块盘”之后还固执地继续使用RAID5跑重要数据在我看来是相当头铁的行为。RAID5只有单块冗余盘就算平时稳如老狗遇到重建风暴就是最脆弱的时候。现在硬盘单盘容量动辄十几TB重建时间往往长达几十小时让一块老盘维持几十小时高强度连续读取本身就是一场豪赌。我自己的改造经验是盘位足够时把RAID5迁移到RAID6牺牲一点容量换两块盘同时故障下的数据安全。盘位有限时至少加一块全局热备盘让第一块盘故障后系统立刻自动重建压缩“单盘降级”的运行时间。无论哪种阵列都要开启后台一致性校验/巡检在坏道扩散到不可收拾之前提前发现问题。集群环境里可能还有人说“RAID6性能损失太大”但对大多数普通数据库和文件服务器来说RAID6的写性能损失并没有传说中那么夸张尤其在带缓存和BBU的硬件卡上。真正的高并发写入场景本来就该靠更高冗余的分布式存储来解决而不是把RAID5堆到满盘。6.2 未来选型思路根据盘位数和容量重新算容错给你一个非常简单但实用的评估方法数一数阵列里有多少块盘单盘容量多大重建需要多久就能判断RAID5是否还合适。比如四块8TB盘做RAID5可用容量是24TB重建期间一旦再坏一块全阵列直接“崩盘”换成RAID6可用容量16TB能扛住两块同时损坏重建时阵列依然可以降级读写。多花的8TB空间买的是高风险场景下的最后一道保险。我还建议把“硬盘出厂批次”纳入选型考虑。很多人装盘时贪图便捷直接同一批次买四块一模一样的盘结果它们在工作了几万小时后到达寿命拐点的时间都差不多一个坏了其余几个也快了。这不是玄学是可靠性工程里的统计常识。如果条件允许尽量分不同批次配置至少也要把不同批次的盘分散到不同阵列而不是全部绑在同一个RAID5里。另外一项容易被忽视的是UPS。很多服务器/NAS的双盘故障根源都是市电波动或者电源老化电源在极端负载下输出的电压纹波变大会在同一时刻把几块盘全部打掉。投资一台靠谱的UPS比买好几块“企业级硬盘”更值得。6.3 最后给所有还在用RAID5的人几句实在话我理解很多小型企业或者家庭用户当初选择RAID5是因为盘位不够性能又不想妥协太多。但在经历过两次双盘故障现场后我的态度非常明确如果你的数据丢了会想哭那就别让RAID5成为唯一的防线。备份到另一台设备或者云端哪怕只是每周同步一次也能让你在面对“坏两块盘”时从容很多。最后再分享一个我个人的工作习惯每次巡检除了看SMART我还会在机箱外面贴一张小纸条写上阵列级别、盘序、重要密码位置。这张纸条在一次停电事故后帮了大忙因为当时阵列卡配置丢失需要手工导入配置而三个都不在场的人看着盘位上的标签才把顺序恢复对。这类“土办法”在关键时候比任何高级监控工具都管用。这次事故的最终结果我那台设备靠镜像和第二块盘的强制重组找回了绝大部分数据但花掉的时间足够我写十篇这篇文章。现在我的存储策略已经全部改成“RAID6热备离线冷备”的组合宁可性能打折也不要再在凌晨三点被两条报警短信叫起来玩心跳。希望读到这里的你永远用不上今天这些操作步骤但万一真遇上了请记住这三句话别乱初始化先做整盘镜像再考虑重组阵列。手上有镜像做事才有底气。
返回列表