Recuperar raid5 tras fallar más de un disco

Un raid5 esta formado por un mínimo de tres discos duros, en uno de los cuales se almacenan los datos de paridad y en el resto de discos se distribuyen los datos. Esta estructura proporciona mayor velocidad de lectura/escritura y redundancia, permitiendo un fallo de un disco sin pérdida de datos. ¿Pero que ocurre ante un fallo -no físico- en dos discos de un raid5? En la mayoría de casos supondrá la perdida total de datos, en otros, con suerte, podrá recuperar los datos. En esta entrada se verá como, en determinadas circunstancias, se pueden recuperar los datos de un raid5 -de tres discos- tras un fallo en dos discos.

Tabla de contenidos

1.- El problema
Tras detectar que el raid5 dejó de funcionar, lo primero que hice fue revisar el buffer de mensajes del núcleo mediante dmesg. Y lo que encontré fue lo que ningún usuario de un raid5 quiere encontrar, un fallo en dos de tres discos del raid5:
[45654.643107] md/raid:md0: Disk failure on sdc1, disabling device.
[45654.643108] md/raid:md0: Operation continuing on 2 devices.
[45654.643115] md/raid:md0: Disk failure on sdd1, disabling device.
[45654.643115] md/raid:md0: Operation continuing on 1 devices.
Detuve todos los servicios y reinicie el PC en nivel monousuario. Tal y como temía el raid no levantó.
agd-desktop # mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
     Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Wed Sep 28 02:11:56 2011
          State : clean, FAILED
 Active Devices : 1
Working Devices : 1
 Failed Devices : 2
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : agd-desktop:0  (local to host agd-desktop)
           UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
         Events : 441

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       81        1      active sync   /dev/sdf1
       2       0        0        2      removed

       3       8       33        -      faulty spare   /dev/sdc1
       4       8       49        -      faulty spare   /dev/sdd1
El problema debía ser lógico, ya que los discos duros funcionan bien. Por ello comencé a buscar el origen del problema con la esperanza de recuperar los casi 3TB de datos que había en el raid5. Los logs no habían registrado nada. Pero al analizar la salida de mdadm --examine de las unidades del raid, encontré algo raro:
agd-desktop # mdadm --examine /dev/sd[c,d,f]1
/dev/sdc1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
           Name : agd-desktop:0  (local to host agd-desktop)
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
     Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 29f6b0d9:7a970ca6:3508db7b:f4b1af2b

    Update Time : Tue Sep 27 01:47:16 2011
       Checksum : 16200b11 - correct
         Events : 432

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 2
   Array State : AAA ('A' == active, '.' == missing)
/dev/sdd1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
           Name : agd-desktop:0  (local to host agd-desktop)
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
     Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : f60a260f:2d97a646:746c8b79:77c3bbc7

    Update Time : Tue Sep 27 01:47:16 2011
       Checksum : 85eb9553 - correct
         Events : 432

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AAA ('A' == active, '.' == missing)
/dev/sdf1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
           Name : agd-desktop:0  (local to host agd-desktop)
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 2930061109 (1397.16 GiB 1500.19 GB)
     Array Size : 5860120576 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 2930060288 (1397.16 GiB 1500.19 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 62b27e87:5d8c5c9a:6aa8af8e:30f4e6c2

    Update Time : Wed Sep 28 02:15:01 2011
       Checksum : 6247f6a9 - correct
         Events : 445

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 1
   Array State : .A. ('A' == active, '.' == missing)
Si, exacto, los discos del raid se han desincronizado. De hecho es curioso porque los discos /dev/sdc1 y /dev/sdd1 se han quedado en el pasado y creen que el raid sigue activo (Array State : AAA); mientras que /dev/sdf1 ha avanzado en el tiempo y ha detectado que faltan dos discos (Array State : .A.). Aunque la forma más clara de ver todo esto es mirando las fechas de actualización de cada unidad del raid:
agd-desktop # mdadm --examine /dev/sd[c,d,f]1 | grep "Update Time"
    Update Time : Tue Sep 27 01:47:16 2011
    Update Time : Tue Sep 27 01:47:16 2011
    Update Time : Wed Sep 28 02:15:01 2011

2.- La solución
A partir de aquí es recomendable trabajar sobre copias de los discos originales
El problema radica en una desincronización en las actualizaciones de las unidades del raid. Por ello es lógico suponer que no existen desincronización en los datos. Si este es el caso, se podría forzar el montaje del raid asumiendo que todas las unidades están limpias. En mi caso, y ante la duda de que haría el kernel con las fechas de actualización de cada disco, opte por reensamblar el raid forzando las unidades sdc1 y sdd1 como limpias.
agd-desktop # mdadm --assemble --force /dev/md0 /dev/sdc1 /dev/sdd1
mdadm: /dev/md0 has been started with 2 drives (out of 3).
agd-desktop # mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
     Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
   Raid Devices : 3
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Wed Sep 28 02:45:28 2011
          State : clean, degraded
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : agd-desktop:0  (local to host agd-desktop)
           UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
         Events : 440

    Number   Major   Minor   RaidDevice State
       4       8       49        0      active sync   /dev/sdd1
       1       0        0        1      removed
       3       8       33        2      active sync   /dev/sdc1
agd-desktop # mount /dev/md0 /mnt/
Tras comprobar que ha funcionado, y que hemos recuperado toda la información, tan solo nos quedaría añadir la siguiente unidad al raid y esperar a que se sincronice.
agd-desktop # mdadm --add /dev/md0 /dev/sdf1
mdadm: re-added /dev/sdf1
agd-desktop # mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.2
  Creation Time : Wed Sep 22 17:02:27 2010
     Raid Level : raid5
     Array Size : 2930060288 (2794.32 GiB 3000.38 GB)
  Used Dev Size : 1465030144 (1397.16 GiB 1500.19 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Wed Sep 28 02:47:50 2011
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

 Rebuild Status : 0% complete

           Name : agd-desktop:0  (local to host agd-desktop)
           UUID : 2b33bce9:f30571d8:efe03c61:898a4e57
         Events : 444

    Number   Major   Minor   RaidDevice State
       4       8       49        0      active sync   /dev/sdd1
       1       8       81        1      spare rebuilding   /dev/sdf1
       3       8       33        2      active sync   /dev/sdc1
El proceso de reconstrucción puede ser controlado mediante watch cat /proc/mdstat:
agd-desktop # watch cat /proc/mdstat

Every 2,0s: cat /proc/mdstat                            Wed Sep 28 02:49:25 2011

Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdf1[1] sdd1[4] sdc1[3]
      2930060288 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]
      [>....................]  recovery =  0.5% (8258560/1465030144) finish=275.
5min speed=88116K/sec

unused devices: 

0 comentarios:

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.