Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127099
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 251
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-29 14:18
个人简介

不以物喜,勿以己悲;乐观向上,持之以恒。

文章分类

全部博文(25)

文章存档

2015年(25)

我的朋友

分类: LINUX

2015-07-19 22:06:15


MD目前没有主动探测磁盘状态的机制。

MD成员磁盘如果出现局部坏块,磁盘会进入修复模式,有些磁盘恢复时间会比较长,这么久的时间对于硬RAID是个问题,可能硬RAID会立刻把磁盘踢除,但是对于linux MD来说,因为没有实现超时机制,所以会允许磁盘永久进行恢复,但是不幸的是MD与磁盘之间的IO路径上还有linux SCSI层。

SCSI层IO请求超时(默认是30秒)后,会reset磁盘,而此时磁盘还在恢复着不会响应,reset不成功,然后scsi层会abort所有的请求命令,这些请求命令最终会通过callback传递到MD这一层,MD会立刻将对应的成员磁盘设置为faulty状态。此时MD并没有踢盘,接下来在MD的恢复检查机制中会将有问题的磁盘剔除,从而进入降级状态 或者 更严重的 disable状态。


从以上可以看出,MD可能会因为磁盘的局部坏块较为直接的将磁盘剔除,从而造成MD降级或者更严重情况,导致RAID整体性能下降或者可用性出现问题。针对这个误判问题,MD从linux kernel3.1内核开始引入了badblock list机制。


技术演进


基于磁盘级局部坏块资源管理


MD从linux kernel3.1内核开始引入了badblocklist机制,该机制在磁盘出现局部坏块时,仍然会设置磁盘为faulty状态,但是在接下来的恢复检查中,不会将磁盘剔除,而是进入MD的坏块资源管理机制,将这些坏块标识起来,如果能依赖其他磁盘将数据恢复则在数据恢复后,将应用请求返回,否则告知应用raid的坏块数据,此后系统不能在使用这些坏块数据。

默认标记256个坏块,并且没有结合坏块重新映射技术去更好的优化这块,如果能够支持更多的坏块和实现坏块重映射技术,那么会更高的提高MD的容错能力。


相关的技术链接如下:

第一次支持MD/RAID1的坏块管理

http://kernelnewbies.org/Linux_3.1

到3.5.3内核,已经支持了raid4/5/6.


hot-replace技术


该技术是为了配合badblock管理,将有问题的坏块直接在spare盘上进行在线修复,相关介绍如下:


http://lwn.net/Articles/391208/

其基本原理就是将有问题的磁盘数据在线拷贝到spare盘中,当数据全部拷贝完,就可以把有问题的磁盘踢掉。


踢盘触发点剖析


以centos6使用的linux-2.6.32内核为例。

IO请求处理过程中出现的读写错误


MD层向下层设备发出的 I/O也分两种情况:

1.  上层应用的I/O

2.  重构/初始化时自身产生的I/O

以上两种情况产生的I/O的回调函数都是MD层自己定义的,最终MD下层设备返回的I/O请求都会在MD层处理。

I/O处理过程对应在每个raid会有所不同,下面对raid1、raid10、raid456分别讲解。

RAID1


应用IO请求处理


1.  读IO,大概流程如下:

a)  读IO从底层设备返回到MD设备,MD设备检测到数据并没有读上来,则会首先尝试将这个读请求放到retry链表中,等待再一次处理

b)  当这个读IO请求再次处理时,会再次读一下数据,如果依然读不上来,会从另外几块磁盘上读。

               i.     如果另外几块磁盘都读不上来,直接将当前磁盘踢掉,结束

              ii.     如果另外几块磁盘至少有一个能读上来,继续

c)  将读上来的数据再次写到读不上来数据的磁盘中

               i.     如果写失败,将写失败的磁盘踢掉

              ii.     如果写成功,继续

d)  再次读原来磁盘中的对应数据,如果此时仍读不上来,踢掉此磁盘

2.  写IO,其处理流程比较简单,当发现数据没有写成功,就直接将问题磁盘踢掉。

从上面的读写IO处理可以看到,读失败会尝试修复,修复失败才踢掉磁盘;一旦发生写失败,则直接踢掉。


重构/初始化IO处理


其读和写的处理方式同上。


RAID10


应用IO请求处理


1.  读IO,大概流程如下:

a)  读IO从底层设备返回到MD设备,MD设备检测到数据并没有读上来,则会首先尝试将这个读请求放到retry链表中,等待再一次处理

b)  再次处理读失败的IO时,会尝试从其他磁盘中读取对应数据修复该磁盘数据。如果修复失败,踢掉磁盘,此过程同2.1.1.1

2.  写IO,一旦发生写失败,直接踢盘

重构/初始化IO处理


1.  读IO:处理同上

2.  写IO:一旦发生写失败,直接踢盘


RAID456


Raid456模块上层应用IO和重构/初始化IO处理模式一样,这里不做区分。

1.  读IO:当发生读失败时,会判断当前raid是否降级,如果降级,直接踢盘,如果没有降级,会尝试重读,当重读失败的次数大于一个值时(此值和stripe_cache_size一样),也会踢盘

2.  写IO:一旦发生写失败,直接踢盘


MD元数据IO请求处理出现读写错误


MD的元数据分为两种:

1.  Bitmap相关的元数据,记录bitmap的信息,此部分可以没有,以下内容以有bitmap信息举例说明;

2.  Superblock相关的元数据,记录和raid相关的信息。

下面分别讲解读和写的处理:

1.  MD元数据的读:发生raid创建和bitmap创建时。此时如果发生元数据读失败,直接会导致raid创建和bitmap创建失败,与本文所要调研的MD踢盘机制没有太大的关系。

MD元数据的写:发生在raid重构或者初始化过程中。在这个过程中,需要更新初始化或者重构的位置等信息,这些元数据信息会写到每块组成raid的磁盘中。在写的回调函数中,会判断这些元数据是否成功写到底层磁盘,一旦发生写错误或者数据由于其他原因导致没有成功写到底层磁盘,就会将当前写异常的磁盘设置成Faulty,踢盘操作发生


磁盘因为某种原因掉线


此操作一般在主动拔一块成员盘或者热备盘时发生,raid中有一个工作线程可以检测到是否一块成员盘发生异常,如果发生异常,就执行踢盘操作,其实这个时候只是清除数据结构而已,因为盘已经被拔出了。


软件模拟踢盘


此部分可以通过mdadm –f命令或者通过sys接口手动设置一块盘为Faulty状态实现模拟踢盘操作。

通过这两个命令也可以看到,所谓的踢盘操作就是将一块盘设置成Faulty状态。

阅读(5743) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~