磁盘故障与恢复
1. 故障分类
- 间断性故障:
最普遍,某次读或者写一个扇区不成功,但是经过反复尝试,可以成功读或写。 - 介质损坏:
一个或多个二进制位永久损坏,不管尝试多少 次,都不能正确读。 - 写故障:
写扇区时,既不能正确写,也不能检索先前写入的扇区。如:在写扇区过程中断电了。 - 磁盘崩溃:
最严重,整个磁盘变成永久不可读。
2. 间断性故障
在读磁盘块的时候,磁盘块的正确内容没有被传送到磁盘控制器中,即发生间断性故障。我们期望磁盘控制器能够判断出磁盘块的好坏,在读到坏数据之后,它能够重新发送读请求,直到扇区被正确读取,或者根据某种预设,尝试100次再停止。
在写扇区时,被写入的内容与预期的内容不一致,即间断性故障发生。这时候需要进行检验,检验的方法是读这个扇区,并与打算写的扇区进行比较,判断其状态好坏。对于不正确的写,即坏状态,就需要进行重写。
3. 校验和
每个扇区有若干个附加位,称为校验和(checksum),附加位的设置取决于存储在那个扇区的数据位的值。
在读操作时,如果校验和对数据位不适合,那么读错误。但是如果校验和正确,依然存在读错误的可能,但是通过使用许多校验位,我们可以使未被发现的读错误概率极小。
奇偶校验和:基于扇区内所有位的奇偶性。这里采用偶校验,即,如果二进制集合中有奇数个1,那么数据有奇数奇偶性,并加上值为1的奇偶位,如果二进制集合中有偶数个1,则数据有偶数奇偶性,并加上值为0的奇偶位。因此,在二进制位的集合和他们的奇偶位中,1的个数总是偶数。
例:如果扇区中的二进制序列式01101000,有3个1,即奇数个1,所以校验位为1,序列后面加上校验位是011010001。如果扇区中的二进制序列为11101110,有6个1,即偶数个1,所以校验位是0.序列后加上校验位是111011100.
在读或者写数据位及其奇偶位的过程中,任何一位的错误都可以通过校验和来发现,但是,如果超过一位出错,那么久可能检测不到错误。但是,可以通过增加校验位来提高检错水平。一般来说,用n位独立位作为校验码,漏掉一个错误的几率仅为1/2^n.
4. 稳定存储
虽然校验和基本能正确检测出介质故障和读写故障,但是它不能纠错。另外,可能会有一种很严重的现象:当写覆盖了扇区先前的内容时,新的内容无法读出,即新值和旧值均丢失。为了解决以上问题,出现了稳定存储的策略。
稳定存储的思想:扇区是成对的,每一对代表一个扇区内容X,将代表X的扇区对分别称为左拷贝Xl和右拷贝Xr。假设这两个拷贝有足够多的奇偶校验位,以排除检测不出坏扇区的可能。
稳定存储的写策略:
1、写X值到Xl,检查返回状态是否是好,如果不好,则反复写,如果多次写尝试依然没能成功将X写入Xl,则认为在该扇区中有一个介质故障,所以必须采用一些措施进行补救(如用备用扇区代替Xl)。
2、对Xr重复1操作
稳定存储读策略:
交替尝试读取Xl和Xr,直到返回一个正确的值,如果若干次尝试之后依然没有正确值返回,则认为X真正不可读。
5. 稳定存储的错误处理能力
1、介质故障
在将X存入扇区Xl和Xr后,如果其中一个出现介质故障并永久不可读,我们可以从另一个扇区读取X。但是如果两个扇区都坏了,那么就不能读取X了,这种情况发生的概率很低。
2、写故障
假设在进行写X操作的时候,写Xl写到一半,突然断电了,那么Xl里面的数据是有问题的,也就是不正确的,那么,这时候可以根据Xr里面的旧值对Xl进行恢复。而如果断电的时候Xl已经写好了,Xr的值可能是正确的,也可能是不正确的,那么可以根据Xl里面的值对Xr的值进行修改。这样,就不会出现新值旧值都丢失的情况。
6. 从磁盘崩溃中恢复
磁盘故障最严重的状态是磁盘损坏或者磁头损坏,其中的数据被永久性破坏。如果数据没有备份,那么数据完全没有恢复的可能。
为了减少由磁盘崩溃带来丢失数据的风险,产生了RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列)技术。
7. RAID1
RAID1又称为镜像方式,它至少需要两块硬盘,一个是数据盘,另一个是冗余盘,相同的数据块同时存放在两个磁盘的相同位置上,数据的分布互为镜像。其数据丢失的唯一场景就是:第一个磁盘损坏正在被修复的同时,第二个磁盘也损坏了。
8. RAID4
RAID4仅使用一个冗余盘作为奇偶校验盘而不管有多少个数据盘。
下面以一个简单的例子说明RAID4是如何实现的:
假设有四个磁盘,三个数据盘,称为盘1,盘2和盘3,冗余盘(奇偶校验盘)称为盘4,如果现在数据盘的第一块有如下序列:
盘1:11110000
盘2:10101010
盘3:00111000
那么冗余盘的第一块的奇偶校验位为01100010(盘1,盘2,盘3各个位1的个数为奇数,校验盘该位就是1,否则为0)
当写一个数据盘的一个新块的时候,不仅需要改那个块,而且还要改变冗余盘相应的块。如果使用笨方法,即每次写数据块,都将所有数据盘中的相应块读取出来进行模2和,再重写冗余盘的块,那么磁盘I/O开销太大。通常采用关注正在被重写的数据块上的老版本和新版本,这样磁盘I/O操作较少。
故障恢复:
如果其中某一个磁盘崩溃了,可以根据其他的磁盘相应位置的值进行模2和恢复。
9. RAID5
RAID4存在一个问题:就是冗余盘和数据盘的读写负荷不均衡,因为如果有n个数据盘,那么对每个数据盘的写都会写冗余盘,所以冗余盘的写次数是任何一个数据盘的n倍。
RAID5将奇偶校验信息均匀地分散在各个磁盘上,即,每个磁盘都有某些块做其他磁盘相应块的冗余,这样每个盘的读写负荷是一样的。
10. RAID6
RAID6基于海明码的纠错码原理,在有足够多的冗余盘的条件下,可以允许处理多个磁盘崩溃。RAID6至少需要四个磁盘。
现在假设一共有7个磁盘,磁盘1、2、3、4是数据盘,磁盘5、6、7是冗余盘,其中,盘5的位是盘1,2,3相应位的模2和,盘6的位是盘1,2,4相应位的模2和,盘7是1,3,4相应位的模2和。在这种情况下,可以允许两个磁盘同时崩溃,因为其中一个崩溃的磁盘必定能通过一组磁盘恢复,同时另一组有了恢复的磁盘之后也能恢复。