raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

一、故障描述
机房突然断电导致整个存储瘫痪,加电后存储依然无法使用。经过用户方工程师诊断后认为是断电导致存储阵列损坏。
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)
整个存储是由12块日立硬盘(3T SAS硬盘)组成的RAID-6磁盘阵列,被分成一个卷,分配给几台Vmware的ESXI主机做共享存储。整个卷中存放了大量的Windows虚拟机,虚拟机基本都是模板创建的,因此系统盘都统一为160G。数据盘大小不确定,并且数据盘都是精简模式。

二、备份数据
将故障存储的所有磁盘和备份sss数据的目标磁盘连入到一台Windows Server 2008的服务器上。故障磁盘都设为脱机(只读)状态,在专业工具WinHex下看到连接状态如下图所示:(图中HD1-HD12为目标备份磁盘,HD13-HD24为源故障磁盘,型号为HUS723030ALS640):
图一:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

使用WinHex 对HD13-HD24以底层方式读取扇区,发现了大量损坏扇区。初步判断可能是这种硬盘的读取机制与常见的硬盘不一样。尝试更换操作主机,更换HBA卡,更换扩展柜,更换为Linux操作系统,均呈现相同故障。与用户方工程师联系,对方回应此控制器对磁盘没有特殊要求。
使用专业工具对硬盘损坏扇区的分布规律进行检测,发现如下规则:
1、损坏扇区分布以256个扇区为单位。
2、除损坏扇区片断的起始位置不固定外,后面的损坏扇区都是以2816个扇区为间隔。
所有磁盘的损坏扇区分布如下表(只列出前3个损坏扇区):
ID号 硬盘序列号 第1个损坏扇区 第2个损坏扇区 第3个损坏扇区
13 YHJ7L3DD 5376 8192 11008
14 YHJ6YW9D 2304 5120 7936
15 YHJ7M77D 2048 4864 7680
16 YHJ4M5AD 1792 4608 7424
17 YHJ4MERD 1536 4352 7168
18 YHJ4MH9D 1280 6912 9728
19 YHJ7JYYD 1024 6656 9472
20 YHJ4MHMD 768 6400 9216
21 YHJ7M4YD 512 6144 8960
22 YHJ632UD 256 5888 8704
23 YHJ6LEUD 5632 8448 11264
24 YHHLDLRA 256 5888 8704
临时写了个小程序,对每个磁盘的损坏扇区做绕过处理。用此程序镜像完所有盘的数据。

三、故障分析
1、分析损坏扇区
仔细分析损坏扇区发现,损坏扇区呈规律性出现。
-每段损坏扇区区域大小总为256。
-损坏扇区分布为固定区域,每跳过11个256扇区遇到一个坏的256扇区。
-损坏扇区的位置一直存在于RAID的P校验或Q校验区域。
-所有硬盘中只有10号盘中有一个自然坏道。

2、分析分区大小
对HD13、HD23、HD24的0-2扇区做分析,可知分区大小为52735352798扇区,此大小按RAID-6的模式计算,除以9,等于5859483644扇区,与物理硬盘大小1049524,和DS800控制器中保留的RAID信息区域大小吻合;同时根据物理硬盘底层表现,分区表大小为512字节,后面无8字节校验,大量的0扇区也无8字节校验。故可知,原存储并未启用存储中常用的DA技术(520字节扇区)。
分区大小如下图(GPT分区表项底层表现,涂色部分表示分区大小,单位512字节扇区,64bit):
图二:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)
四、重组RAID
1、分析RAID结构
存储使用的是标准的RAID-6阵列,接下来只需要分析出RAID 成员数量以及RAID的走向就可以重组RAID。
-分析RAID条带大小
整个存储被分成一个大的卷,分配给几台ESXI做共享存储,因此卷的文件系统肯定是VMFS文件系统。而VMFS卷中又有存放了大量的Windows 虚拟机。Windows虚拟机中大多使用的是NTFS文件系统,因此可以根据NTFS中的MFT的顺序分析出RAID条带的大小以及RAID的走向。
-分析RAID是否存在掉线盘
镜像完所有磁盘。后发现最后一块硬盘中并没有像其他硬盘一样有大量的坏道。其中有大量未损坏扇区,这些未损坏扇区大多是全0扇区。因此可以判断这块硬盘是热备盘。

2、重组RAID
根据分析出来的RAID结构重组RAID,能看到目录结构。但是不确定是否为最新状态,检测几个虚拟机发现有部分虚拟机正常,但也有很多虚拟机数据异常。初步判断RAID中存在掉线的磁盘,依次将RAID中的每一块磁盘踢掉,然后查看刚才数据异常的地方,未果。又仔细分析底层数据发现问题不是出在RAID层面,而是出在VMFS文件系统上。VMFS文件系统如果大于16TB的话会存在一些其他的记录信息,因此在组建RAID的时候需要跳过这些记录信息。再次重组RAID,查看以前数据异常的地方可以对上了。针对其中的一台虚拟机做验证,将所有磁盘加入RIAD中后,这台虚拟机是可以启动的,但缺盘的情况下启动有问题。因此判断整个RAID处在不缺盘的状态为最佳。
五、验证数据
1、验证虚拟机
针对用户较为重要的虚拟机做验证,发现虚拟机大多都可以开机,可以进入登陆界面。有部分虚拟机开机蓝屏或开机检测磁盘,但是光盘修复之后都可以启动。
部分虚拟机现象开机如下:
图三:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)
2、验证数据库
针对重要的虚拟机中的数据库做验证,发现数据库都正常。其中有一个数据库,据用户描述是缺少部分数据,但是经过仔细核对后发现这些数据在数据库中本来就不存在。通过查询 master 数据库中的系统视图,查出原来的所有数据库信息如下:
图四:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)
3、检测整个VMFS卷是否完整
由于虚拟机的数量很多,每台都验证的话,所需的时间会很长,因此我们对整个VMFS卷做检测。在检测VMFS卷的过程中发现有部分虚拟机或虚拟机的文件被破坏。列表如下:
图五:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

六、恢复数据
1、生成数据
北亚工程师跟客户沟通并且描述了目前恢复的情况。用户经过对几台重要的虚拟机验证后,用户反应恢复的数据可以接受,接着北亚工程师立即着手准备恢复所有数据。
先准备目标磁盘,使用一台dell 的MD 1200加上11块3T的硬盘组成一个RAID阵列。接着将重组的RAID数据镜像到目标阵列上。然后利用专业的工具UFS解析整个VMFS文件系统。
2、尝试挂载恢复的VMFS卷
将恢复好的VMFS卷连接到我们的虚拟化环境中的一台ESXI5.5主机上,尝试将其挂载到的ESXI5.5的环境中。但是由于版本(客户的ESXI主机是5.0版本)原因或VMFS本身有损坏,导致其挂载不成功。继续尝试使用ESXI的命令挂载也不成功,于是放弃挂载VMFS卷。

七、移交数据
由于时间紧迫,先安排北亚工程师将MD 1200 阵列上的数据带到用户现场。然后使用专业工具”UFS”依次导出VMFS卷中的虚拟机。
1、将MD 1200阵列上的数据通过HBA卡连接到用户的VCenter服务器上。
2、在VCenter服务器安装“UFS”工具,然后使用“UFS”工具解释VMFS卷。
3、使用“UFS”工具将VMFS卷中的虚拟机导入到VCenter服务器上。
4、使用VCenter的上传功能将虚拟机上传到ESXI的存储中。
5、接着将上传完的虚拟机添加到清单,开机验证即可。
6、如果有虚拟机开机有问题,则尝试使用命令行模式修复。或者重建虚拟机并将恢复的虚拟机磁盘(既VMDK文件)拷贝过去。
7、由于部分虚拟机的数据盘很大,而数据很少。像这种情况就可以直接导出数据,然后新建一个虚拟磁盘,最后将导出的数据拷贝至新建的虚拟磁盘中即可。
统计了一下整个存储中虚拟机的数量,大约有200台虚拟机。目前的情况只能通过上述方式将恢复的虚拟机一台一台的恢复到用户的ESXI中。由于是通过网络传输,因此整个迁移的过程中网络是一个瓶颈。经过不断的调试以及更换主机最终还是无法达到一个理想的状态,由于时间紧张,最终还是决定在当前的环境迁移数据。

八、数据恢复总结
1、故障总结
所有磁盘坏道的规律如下表:
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

经过仔细分析后得出坏道的结论如下:
-除去SN:YHJ6LEUD上的一个自然坏道外,其余坏道均分布于RAID-6的Q校验块中。
-坏道区域多数表现为完整的256个扇区,正好当时创建RAID-6时的一个完整RAID块大小。
-活动区域表现为坏道,非活动区域坏道有可能不出现,如热备盘,上线不足10%,坏道数量就比其他在线盘少(热备盘的镜像4小时完成,其他有坏道盘大概花费40小时)
-其他非Q校验区域完好,无任何故障。
结论:
通常情况,经如上坏道规则表现可推断,坏道为控制器生成Q校验,向硬盘下达IO指令时,可能表现为非标指令,硬盘内部处理异常,导致出现规律性坏道。
2、数据恢复总结
数据恢复过程中由于坏道数量太多,以致备份数据时花费了很长世间。整个存储是由坏道引起的,导致最终恢复的数据有部分破坏,但不影响整体数据,最终的结果也在可接受范围内。
整个恢复过程,用户方要求紧急,我方也安排工程师加班加点,最终在最短的时间内将数据恢复出来。后续的数据迁移过程中由我方工程师和用户方工程师配合完成。

九、项目成员 
raid-6磁盘阵列损坏导致数据丢失的恢复过程(图文教程)

转载于:https://blog.51cto.com/sun510/2079772

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写登录注册

const readline require(readline-sync);let error 3;let user [{username: 001,password: 123}, {username: 002,password: 456}, {uesrname: 003,password: 789}]//登录let denglu function () {while (true) {console.log(请输入您的登录账号:);let username…

android将字符串转化为json,将字符串转换为JSON数组

将字符串转换为JSON数组我从Web服务获得以下字符串的JSON,并尝试将其转换为 JSONarray{"locations": [{"lat": "23.053","long": "72.629","location": "ABC","address": "D…

谈新技术学习方法-如何学习一门新技术新编程语言

学习一门编程语言或者编程技术的方式基本上是这样一个流程: 1,对学习这门语言或者技术的必要性进行评估。比如你是工作需要,或者兴趣所至,甚至是为了把妹。这个必要性关系到你要学多深入,需要学习多长时间。 比如我想…

信息隐藏和局部化

信息隐藏原理:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。 局部化是指把一些关系密切的软件元素物理地放得彼此靠近。 如果在测试期间和以后的软件维护期间需要修改软件&#…

图像识别自动化android,Android自动化测试

写在开头:Android UI 自动化测试推荐网易的Airtest,也是谷歌推荐的,操作简单,而且基于图像识别根据用户操作界面自动生成Python测试代码JUnit单元测试testImplementation junit:junit:4.12image.pngimage.png使用gradle命令进行单…

如何重构“箭头型”代码

本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得很多…

Django博客--4.开发博客文章详情页

文章目录0.思路引导1.设计文章详情页的 URL2.获取文章的URL3.编写 detail 视图函数4.编写详情页模板5.更改主页中跳转详情页的地址链接6.模板继承--抽取base.html7.模板继承--修改 index.html使其继承base.html8.模板继承--修改detail.html使其继承base.html9.结果展示0.思路引…

10、并发容器,ConcurrentHashMap

Java 提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供的包装方法,来获取一个同步的包…

程序员的本质

Computers are useless. They can only give you answers. – Picasso计算机没有什么作用。他们只能告诉你答案。——毕加索很多人(包括我岳母)认为计算机变得如此智能,所以在不久的未来将不再需要程序员。另外一些人认为程序员是天才&#x…

模式-视图-控制器模式2.0

1 MVC的实现   1.1 分析应用问题,对系统进行分离   分析应用问题,分离出系统的内核功能、对功能的控制输入、系统的输出行为三大部分。设计模型部件使其封装内核数据和计算功能,提供访问显示数据的操作,提供控制内部行为的操作…

总体设计的原理

1 模块化 2 抽象 3 逐步求精 4 信息隐藏和局部化 5 模块独立

android 手动回收对象,Android Studio Studio回收列表中的JSON对象

我想在recyclerview中显示一些JSON对象,并且希望它们在日期之后排序,我该如何实现?下面是下载从JSON URL的数据的方法:Android Studio Studio回收列表中的JSON对象public void downloadFromSkistar(){try{URL url new URL("…

剖析管理所有大数据组件的可视化利器:Hue

欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 日常的大数据使用都是在服务器命令行中…

Django博客--5.让博客支持 Markdown 语法和代码高亮

文章目录0.前言1.安装 Python Markdown2.在 detail 视图中解析 Markdown3.safe 标签4.代码高亮5.效果展示0.前言 Markdown 是一种 HTML 文本标记语言,只要遵循它约定的语法格式,Markdown 的解析工具就能够把 Markdown 文档转换为标准的 HTML 文档&#…

耦合

模块的独立性很重要,因为有效的模块化(即具有独立的模块)的软件比较容易开发出来。 独立的模块比较容易测试和维护。 模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚和耦合。 耦合 耦合是对一个软件结构内不同模块之间互连程度的度量。…

成为更优秀的开发人员:第二步-知道你的核心竞争力

编者按:原文作者罗布沃林(Rob Walling)从事Web应用开发10年之久,担任过业内顾问、自由开发人员和全球最大的信用卡预付公司City of Pasadena的开发经理。现居住于加州中部城市弗雷斯诺(Fresno)。关注并指导…

android 字体间间隔,TextView设置行间距、字体间距

一、设置行间距1、设置行间距:android:lineSpacingExtra,取值范围:正数、负数和0,正数表示增加相应的大小,负数表示减少相应的大小,0表示无变化2、设置行间距的倍数:android:lineSpacingMultipl…

破解mysql数据库的密码

发现的1小问题 语句打错以后应该退出本语句,再继续打新语句.也可以打\c,退出本语句. 如何破解数据库的密码: 1:通过任务管理器或者服务管理,关掉mysqld(服务进程) 2:通过命令行特殊参数开启mysqld Mysqld --skip-grant-tables 3:此时,mysqld服务进程已经打开,并且,不需要权限检…

Diango博客--6.Markdown 文章自动生成目录

文章目录0.思路引导1.在文中插入目录2.在页面的任何地方插入目录3.美化标题的锚点 URL0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构,本文内容将从以下几个方面展开: 1)在文中插入目录; 2)在…

Java中对象和引用的理解

2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆。12一、对…