linux踢出硬盘,Linux MD/RAID 踢盘机制

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的坏块管理

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

hot-replace技术

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

其基本原理就是将有问题的磁盘数据在线拷贝到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状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值