ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

服务器RAID崩溃数据恢复实战:从硬RAID到mdadm软RAID迁移

服务器RAID崩溃数据恢复实战:从硬RAID到mdadm软RAID迁移 凌晨4点多手机屏幕一亮机房里那台2014年服役的老服务器突然弹出一条RAID Degraded告警。我原以为是又一轮单盘掉线重启一次、换块盘就完事了直到第二天开机连RAID控制界面都进不去逻辑卷彻底消失我才真正意识到这台服役十年的服务器可能不是某个部件要退休而是整个存储栈要“临终告别”了。这篇东西不是复盘鸡汤而是一次真实得有点狼狈的数据抢救记录从硬RAID视角下的阵列崩盘到拆盘后在Linux软RAIDmdadm/dmraid环境下把数据认出来、导出来再到最终在新平台上用软RAID重建存储。整个过程踩了不少坑也验证了不少以前只敢在文档里看到的结论。如果你手上有老旧服务器、主板板载RAID、或者计划接手一台“捡垃圾”级别的古董机器这篇记录应该能帮你少走一段弯路。1. 报警之后我是如何意识到这次不是普通降级1.1 一台老服务器的日常角色先交代背景。这台机器是一台2014年配的Xeon E5平台服务器4块2TB机械盘做的RAID10安装了CentOS 7跑着公司内部的销售数据库MySQL、一个小型文件共享服务外加几套内部脚本的定时任务。说白了它不是核心交易系统的顶梁柱但离了它日常报价、历史订单查询、部门文件流转都会立刻瘫痪。这类老服务器有个共同特征平时存在感极低没人觉得它重要一旦出问题所有人才开始翻着旧档案问“数据有没有备份”。RAID10的配置本身不差镜像加条带兼顾了读写性能和一定的容错能力坏一块盘理论上还能继续跑坏两块盘只要不同时坏在同一对镜像组里也能撑住。但我后来才意识到理论上的容错永远挡不住“控制器先死”这种灾难。1.2 告警信息与初步排查那天凌晨的告警信息很简短监控面板上只写了“/dev/md127 RAID Degraded”。我远程登录服务器的第一反应是执行cat /proc/mdstat # 看到的输出是 md127 : active raid1 sda[0] sdb[1] 1953513472 blocks super external:/md127/0 [2/1] [U_]这里能看出两个关键信息一是系统里所谓的“硬RAID10”在内核层竟然被识别成了一个md设备而且RAID10卷被拆解成了两个RAID1子设备二是此时已经有一块盘处于掉线状态阵列处于降级模式。我当时的第一判断是某块物理盘挂了计划第二天到机房换盘。但在我准备关闭服务器、打算让它继续“带伤运行”到白天时系统日志里开始出现大量SCSI错误和ATA总线错误dmesg刷屏的速度快到根本看不完[419278.134022] sd 2:0:0:0: [sda] Unhandled error code [419278.134025] sd 2:0:0:0: [sda] Result: hostbyteDID_BAD_TARGET driverbyteDRIVER_OK这种错误往往意味着控制器层面的通信出了问题而不只是某一块硬盘自身的坏道。换句话说坏的可能是RAID控制器或者主板SATA控制器。/proc/mdstat里的RAID10子设备是Intel IMSM元数据格式也就是由板载RAID功能管理的一旦控制器或固件出问题整条链路都会跟着瓦解。1.3 我为什么决定立即断电而不是继续抢救很多人的第一反应是趁系统还能跑赶紧把数据拷出来。这个想法本身没问题但前提是阵列还健康。如果只是单盘降级当然可以先备份再换盘可当时的日志已经清楚地告诉我连控制器都在报错继续读写只会让残留的硬盘在异常I/O中承受更大压力甚至可能把还没出问题的盘也带崩。而且RAID10这种结构最怕一边控制器半死不活、一边系统还在反复重试坏盘。SCSI层的重试机制会不断向物理盘发送命令遇到固件不稳定的盘很容易触发磁盘自身进入保护性离线状态。所以我远程执行了干净关机然后打电话给机房同事请他把这四块盘的物理顺序记下来按顺序拆出来送到我这边另一台可以临时腾出来的测试机上。现在回头看这个“先断电、再拆盘、认真记盘序”的决策是整场抢救里最重要的一步。顺序错了后面软RAID组装大概率对不上号数据恢复难度会翻倍。2. 拆机嗅探硬RAID崩了为什么盘上的卷还能被软RAID认出2.1 盘上的元数据才是“硬通货”拆盘之前我先确认了这台服务器的RAID实现方式。它用的不是独立PCIe RAID卡而是主板集成的PCH RAID功能Intel把这种方案叫作RST/RSTe也有人叫它Fake RAID。它有自己的配置界面和类似硬RAID的管理体验但本质上它是在硬盘上写入一份Intel专用的RAID元数据再靠操作系统内的驱动和内核MD模块来实现RAID逻辑。这块老服务器平时在CentOS里看/proc/mdstat就是一个md设备这就是最直接的线索。真正独立硬RAID卡管理下的逻辑卷操作系统看到的应该是/dev/sda或/dev/sdb这样的虚拟盘不会看到成员的组合过程。只有在Fake RAID和纯软RAID情况下内核MD层才会直接参与管理。所以当板载控制器的配置丢失、BIOS界面进不去时盘上的数据其实没丢丢失的只是“如何把多块盘组合成一个逻辑卷”的映射关系。这个映射关系一份被写在这四块盘的元数据区域里。只要能读出元数据、按元数据里的成员顺序重新组合阵列就能再次活过来。2.2 硬RAID、软RAID和“看起来像硬RAID”的区别这里必须把概念掰开说清楚否则遇到类似场景容易走错路。业内常说的硬RAID一般指独立RAID卡自带处理器和缓存所有RAID计算都由卡完成操作系统只看到一块虚拟盘。这种方案优势是性能稳定、有缓存掉电保护BBU缺点是严重依赖硬件本身。如果卡烧了盘上的数据格式是卡厂商私有的拿到普通电脑上很难直接恢复通常只能找同型号卡导入外部配置。而软RAID比如Linux的mdadm没有专用硬件依赖元数据格式是公开的任何一台装有Linux内核的机器都能通过相同的元数据识别并组装阵列。可移植性极强CPU会占用一点但对于大多数中小业务来说完全能接受。主板板载RAID则比较特殊。它比纯软RAID多了一层硬件的“半支持”Intel在主板的南桥/PCH芯片里做了点加速和配置固件但真正跑RAID计算时还是要消耗CPU资源元数据也写成了标准格式Intel IMSM。因此它既可以被厂商的工具识别也有机会被Linux下的dmraid、mdadm识别出来。这次数据能救回来赌的就是这一点。2.3 把盘接到新机器后先别急着乱挂载四块盘拆回来后我按原顺序把它们接到了测试机的原生SATA口上。这里有个非常重要的细节尽量不要用带RAID功能的主板模式而是先进入BIOS把SATA模式设置为AHCI。原因是让Linux直接看到每一块物理盘而不是让新机器再把它们“接管”成另一个阵列。开机进入Linux LiveCD环境后我首先用smartctl快速确认每块盘的SMART状态至少确保没有哪一块盘已经到了“下一秒就可能彻底断气”的地步。我在命令行里逐一执行smartctl -H -a /dev/sda | grep -E SMART overall-health|Reallocated_Sector|Current_Pending_Sector看下来四块盘里三块健康状态尚可一块盘的Current_Pending_Sector数值偏高说明已经存在读取不稳定的扇区但还没彻底物理损坏。这个信息决定了我后续抢救策略优先做只读挂载和文件级备份不要在这个阵列上做任何写操作更不要尝试“重建”或“修复”逻辑卷。3. 抢救实操用dmraid和mdadm把卷从瘫痪阵列里拉出来3.1 先探测元数据找到“组织关系”进入救援环境后第一把钥匙是dmraid。这个工具专门用来识别ATA/SCSI设备上的软RAID元数据包括Intel IMSM、AMD、Promise等常见板载RAID格式。执行dmraid -r输出大致长这样/dev/sda: isw, isw_ccdabbcd, GROUP, ok, 2000398934016, metadata0 /dev/sdb: isw, isw_ccdabbcd, GROUP, ok, 2000398934016, metadata0 /dev/sdc: isw, isw_ccdabbcd, GROUP, ok, 2000398934016, metadata0 /dev/sdd: isw, isw_ccdabbcd, GROUP, ok, 2000398934016, metadata0看到isw就放心了一半。这是Intel Software RAID的标准元数据标识说明四块盘确实组成过一个Intel容器。它们同属一个GROUP也就是同一套阵列卷。更值得庆幸的是四块盘都显示“ok”说明没有哪块盘上的元数据已经损坏。3.2 用dmraid激活阵列并找到可见卷确认元数据格式之后我执行了激活命令dmraid -ay激活的过程就是把元数据里记录的成员关系重新映射给内核MD层让系统重新生成一个虚拟块设备。激活成功后/dev/mapper/下会出现类似/dev/mapper/isw_ccdabbcd的设备节点。我再用ls -l /dev/mapper/ fdisk -l /dev/mapper/isw_ccdabbcd确认这个设备是否能正常读取分区表。这里有个容易踩坑的地方如果原来RAID卷里分了区激活后还需要用kpartx -a或partprobe让内核重新读取分区表否则可能只有整个卷设备却看不到isw_..._p1这类分区节点。我这台老服务器的两个RAID1子卷被合并成了RAID10激活后系统直接识别出了原来的LVM物理卷。看到/dev/mapper/...下出现带分区编号的设备时我整个人松了口气。3.3 只读挂载与文件级备份阵列虽然重新现身了但谁也不能保证它的元数据完整性是百分之百的。所以我采用只读挂载mkdir /mnt/recover mount -o ro /dev/mapper/isw_ccdabbcd /mnt/recover然后按优先级进行文件级复制。我的顺序是先导出MySQL数据目录再复制文件共享目录最后才处理那些历史归档。备份目标是一台临时腾出来的大容量NAS空间通过rsync连续跑了将近11个小时rsync -av /mnt/recover/ /backup/old-server/这一步之所以耗时很长主要是因为机械盘在经历过异常下线后部分扇区读取变得很慢甚至反复超时。rsync在遇到无法读取的文件时会报错但不会中断整个任务。对抢救场景来说这比直接dd整盘镜像更灵活。这里我还是建议有条件的人先做盘级镜像再用镜像文件做二次恢复。我这次没先在四块盘上做全盘镜像是因为临时凑不出四块容量足够大的替换盘也考虑到当时三块盘SMART状态尚可。但如果你遇到的是有明显坏道、大量Pending Sector的盘一定要先用ddrescue逐盘克隆到健康盘上再进行后续操作。不要拿原盘反复开合那是在赌命。3.4 如果dmraid失效mdadm还能怎么补一手dmraid在这次抢救里立功了但它不是万能的。有些发行版的内核或工具版本对IMSM元数据的兼容性并不好会出现dmraid -r能看到设备但激活后没有反应的情况。此时可以改用mdadm直接读取mdadm -E /dev/sdamdadm会输出设备上的超级块信息包括阵列级别、成员UUID、设备角色。然后尝试mdadm --assemble --scan让它按扫描到的元数据自动组装。如果系统提示找不到超级块可能是发行版默认没有加载对应的container模块也可以用modprobe raid0 raid1 raid10先把内核模块补全。不过坦白说同为“软RAID”救援dmraid对老一代Intel IMSM的兼容性通常更好。我的经验是先dmraid不行再mdadm两个都不行再考虑手动解析元数据或用专用的商业恢复工具。4. 重建选型新机器上我为什么坚决不碰“伪硬RAID”4.1 数据回来了但平台还得接续数据备份完成之后摆在面前的是两个问题一是要不要继续修那台老机器二是新平台用什么方式承载存储。老机器的主板控制器已经处于半残状态就算这次能用同型号主板替换我也没信心它能再稳定跑一年。于是我决定换一台普通的主板平台把原来四块老盘中的两块健康盘继续用起来另外补两块新盘重新组建一套RAID10。但这次我选择了Linux系统原生的mdadm软RAID而不是任何板载RAID功能。原因不复杂。mdadm没有厂商锁定未来这台机器就算主板烧了把盘拔下来插到任何一台Linux机器上执行mdadm --assemble --scan就能重新识别阵列。这次救援能成功很大程度就是得益于盘上的Intel元数据还能被标准工具解析。如果当时用的是真正独立的硬RAID卡四块盘拿出来可能就是四块“废铁”普通人根本没法在脱离原卡的情况下恢复卷结构。4.2 mdadm RAID10构建流程新平台的硬盘顺序经过确认后我使用mdadm创建RAID10mdadm --create /dev/md0 --level10 --raid-devices4 /dev/sdb /dev/sdc /dev/sdd /dev/sde创建后可以用cat /proc/mdstat mdadm --detail /dev/md0看到初始化同步正在进行。RAID10的同步速度受限于机械盘本身的性能两块盘同时读写时资源消耗比较明显。在这个阶段我调整了同步参数避免它白天占用太多磁盘I/Oecho 20000 /proc/sys/dev/raid/speed_limit_min echo 50000 /proc/sys/dev/raid/speed_limit_max初始化同步完成之后才在md设备上建立分区和文件系统。我用的是GPT分区表加XFS文件系统parted /dev/md0 mklabel gpt parted /dev/md0 mkpart primary xfs 0% 100% mkfs.xfs /dev/md0p1然后手动挂载、导回数据。4.3 写入配置让它重启后能自动识别软RAID有个日常使用的关键一步把阵列信息写进配置文件否则重启后系统可能找不到阵列。我执行mdadm --detail --scan /etc/mdadm/mdadm.conf update-initramfs -u并将挂载信息写入/etc/fstab同时用nofail选项避免开机时万一设备还没准备好导致系统进入救援模式。这一步做完后我又专门重启了一次确认系统能在没有人工干预的情况下自动组装阵列并完成挂载。4.4 软RAID与独立硬RAID卡的对比思考这次经历之后我对服务器存储选型有了更务实的判断。独立硬RAID卡在性能、掉电保护、缓存策略上确实更强适合高IOPS数据库等场景。但它带来的“黑盒”风险也不容忽视卡出问题时数据恢复通道很窄很多时候必须找同型号、同固件版本的卡甚至要找专门的恢复服务商。而mdadm这类纯软RAID性能不如带缓存的硬卡但它透明、可移植、可维护。对中小型业务、文件服务、备份存储这类场景它足够可靠。尤其是当机器本身是老旧平台未来随时可能整体淘汰时软RAID能让“拆盘搬家”变得异常简单。对比项独立硬RAID卡Linux mdadm软RAID性能高有缓存与掉电保护中依赖CPU但够日常使用可移植性差依赖同型号控制器极强任意Linux环境可激活运维透明度低状态依赖厂商工具高/proc/mdstat一目了然故障恢复成本高卡损坏时恢复困难低元数据公开工具链完善硬件依赖需要专用卡仅需主板SATA/AHCI如果你只是搭一台内部文件服务器或备份机完全没必要追求“必须硬RAID”的执念。用linux自带的mdadm再配一套可靠的备份策略绝大多数情况下都能睡个好觉。5. 这台老服务器留给我最后的“遗言”5.1 RAID状态监控比买贵硬件更重要这次事故让我最脸红的是在我过去几年对这台服务器的“维护”里从没有认真对待过RAID降级告警。之前它也出现过两次单盘预警我都因为还能跑就忽略了甚至没有把告警转发到手机上。这次如果不是监控系统突然起效报警只会被埋在邮件垃圾箱里。现在我用软RAID重建之后设置了两层监控。第一层是mdadm自带的监控模式它可以监听阵列事件并通过邮件或系统日志通知mdadm --monitor --scan -m opsexample.com第二层是smartd守护进程定期读取每块盘的SMART健康数据一旦出现Reallocated_Sector或Current_Pending_Sector的异常增长就立刻报警。这两者都不是什么高端技术但关键时刻能提前半天到一天争取换盘窗口。5.2 数据安全的顺序备份永远排第一如果把这次抢救的经验浓缩成一句话那就是RAID解决的是硬件故障的可用性问题备份解决的才是数据删除、勒索软件、误操作等真正意义上的数据安全问题。我在这次事件里成功把数据救了出来有运气成分也有元数据格式可被解析的侥幸。如果当时盘上有坏道或者Intel元数据被覆盖结果可能完全不同。所以无论你用的是硬RAID、软RAID还是单盘服务器请确保有一套定期验证的备份机制。备份不是简单复制一份到移动硬盘就结束而是要定期做恢复演练。真实场景中平时不校验的备份恢复时大概率让你“血压拉满”。5.3 老设备退役的判断信号经过这次我对“设备退役”有了更明确的标准一是制造厂商已经停止提供固件和BIOS更新二是系统无法升级到主流安装的现代操作系统版本三是控制器或者关键芯片开始出现不明原因的错误日志四是设备平均负载已经远超设计之初的业务需求。满足其中两三条就应该认真规划迁移而不是等一次彻底崩溃后临时抱佛脚。这台服务器在抢救完成之后被我当作测试机继续用了一阵子但它的核心业务没有再迁回去。数据备份并替换到新平台后我给它断过电、拆过盘、插拔过内存它都还能在BIOS里正常显示基本信息甚至还能通过LiveCD启动一个精简系统。老服务器确实还有一口气但它已经不适合承载任何“不容有失”的任务了。老机器教会我的最后一件事是运维里最朴素也最容易忽视的道理任何硬件都有寿命任何“稳定运行十年”都不是靠运气撑出来的而是靠随时能接住的备用方案和愿意在灾难发生前多做一步的习惯。数据贵重在平时从来不会显现只有等到它差点消失的时候你才会发现那些看似无聊的备份脚本和监控告警才是真正替你兜底的“遗言”。
返回列表