Reconstrucción de datos en discos duros. Paridad
Con la paridad, podemos recuperar los datos perdidos por fallo de un disco que tengamos en un «array». Vamos a ver como se crea un disco de paridad y como se distribuye entre varios discos para permitirnos la recuperación de los datos.
Los sistemas RAID «Redundant Array of Independent Disks» en español «matriz de discos independientes redundantes» , son agrupaciones de discos duros que nos ofrecen varias ventajas, como son mayor velocidad de lectura y escritura y redundancia. Es decir, la finalidad de un sistema RAID de discos es la de proteger los datos en caso de que un disco duro falle, y mejorar la velocidad de lectura de varios discos que conforman un único volumen lógico.
Sumario
- Paridad, concepto
- Sistemas RAID
- Creación de un disco de paridad
- Recuperación de datos con disco de paridad
- Recuperación de datos con paridad distribuida entre los discos
Paridad, concepto
En informática podemos definir la paridad como la propiedad de un conjunto de valores binarios utilizado para detectar y corregir errores en la comunicación de datos. La paridad del conjunto puede ser par o impar dependiendo de la paridad del número de valores 1 en el mismo.
En las telecomunicaciones, los códigos de paridad se utilizan para detectar, y en ocasiones corregir, errores en la transmisión. Este procedimiento consiste en añadir en origen un bit extra llamado bit de paridad a los bits que forman el carácter original.
Para establecer el valor del bit de paridad tenemos que considerar que el número total de bits con valor 1 a transmitir sea par (código de paridad par) o impar (código de paridad impar).
Así, para el código de paridad par el número de unos, contando el carácter original y el bit de paridad tiene que ser par. Por lo tanto, el bit de paridad será un 0 si el número total de unos a transmitir es par y un 1 para un número impar de unos.
Por el contrario, para el código de paridad impar el número de unos contando el carácter original y el bit de paridad ha de ser impar. De esta forma, el bit de paridad será un 0 si el número total de unos es impar y un 1 para un número par de unos.
Sistemas RAID
Hay varios sistemas RAID con diferentes prestaciones.
RAID 0
Por ejemplo el RAID 0, solo nos ofrece más velocidad. Consiste en la creación de un solo volumen lógico con dos discos físicos. La información se va escribiendo en dos discos de manera alterna, es decir, un bit en uno, y otro bit en otro, de manera que el ancho de banda es el doble y por eso se mejora de manera significativa el rendimiento. Además, se duplica la capacidad del volumen, es decir, si usamos dos discos duros de 1 TB cada uno, tendríamos un volumen de 2 TB. Pero no nos ofrece redundancia.

RAID 1
El RAID 1, también llamado «mirroring», convierte el segundo disco en un espejo del primero. Así pues no tenemos el aumento de velocidad, pero tenemos redundancia de todos los datos.

RAID 3 y 4
El RAID 3 y 4, tienen un disco que almacena la paridad. Pero son sistemas que apenas se utilizan en la actualidad.

El RAID 5 es el modo más utilizado, puesto que permite tener casi cualquier número de discos duros en el RAID (con un mínimo de tres) y solo perderemos la capacidad de uno para almacenamiento de datos, pero tendremos redundancia ante la pérdida de un disco.

En RAID 5 se incrementa el rendimiento de lectura del volumen, multiplicando éste por tantos discos como conformen el RAID menos uno. Es decir, si tuviéramos 5 discos duros en RAID 5, la velocidad se multiplicaría por 4. Además, tendríamos tolerancia a fallos de un disco. Si nos falla un disco, no perderemos nada, cambiamos el disco y se recuperan los datos.
La tolerancia a fallos nos protege de la pérdida de un solo disco. Si fallaran dos discos a la vez sí que tendríamos pérdida de datos, aunque este caso es improbable. Y podemos monitorear el estado de los discos con smartmontools para prevenir el fallo de cualquier disco del «array».
Tenemos más opciones de RAID, pero su análisis escapa al objetivo del presente artículo.
Vamos a analizar, como se crea un disco de paridad y como se recuperan los datos. Y después como se hace en un sistema de paridad distribuida por los diferentes discos del «array».
Creación de un disco de paridad
Vamos con un ejemplo sencillo que permita comprender como funciona el sistema. Imaginemos que tenemos 5 discos y vamos a utilizar uno para almacenar los bits de paridad. En cada disco vamos a almacenar una letra representada por su valor binario (Un byte). Así pues la información contenida en ellos será la siguiente:
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
I | Z | Q | U | dp |
En binario sería:
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | 01011010 | 01010001 | 01010101 | dp |
Para calcular el disco de paridad tenemos que coger el primer bit de cada disco para averiguar el primer bit del disco de paridad. Tendremos en cuenta los bits con valor 1, si son pares el valor será 0, pero si son impares, el valor será 1. Utilizamos el código de paridad par.
Para el valor del primer bit de cada letra en binario tenemos los valores (0, 0, 0, 0) en los discos del 1 al 4; como ya existe una cantidad par de unos, el primer bit del disco de paridad será cero,
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | 01011010 | 01010001 | 01010101 | 0xxxxxxx |
Continuando con el segundo valor tenemos los valores (1, 1, 1, 1); y por existir una cantidad par de unos, completamos con cero:
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | 01010001 | 01010101 | 01010101 | 00xxxxxx |
Y así calculamos, sucesivamente los 8 valores en cada disco, al final tendremos:
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | 01011010 | 01010001 | 01010101 | 00010111 |
Recuperación de datos con disco de paridad
Siguiendo con el ejemplo anterior, supongamos que falla el disco 2
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | xxxxxxxx | 01010001 | 01010101 | 00010111 |
- Valor bit 1: ( 0, x, 0, 0, 0) → x = 0
- Valor bit 2: ( 1, x, 1, 1, 0) → x = 1
- Valor bit 3: ( 0, x, 0, 0, 0) → x = 0
- Valor bit 4: ( 0, x, 1, 1, 1) → x = 1
- Valor bit 5: ( 1, x, 0, 0, 0) → x = 1
- Valor bit 6: ( 0, x, 0, 1, 1) → x = 0
- Valor bit 7: ( 0, x, 0, 0, 1) → x = 1
- Valor bit 8: ( 1, x, 1, 1, 1) → x = 0
Por tanto el disco 2 es 01011010
Supongamos que es el Disco 3 el que cae:
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
01001001 | 01011010 | xxxxxxxx | 01010101 | 00010111 |
Tendremos que repetir el proceso realizado para calcular el disco 2 para cada uno de los 8 bits. Para el primero se tiene la información (0, 0, X, 0, 0), por lo que para mantener la paridad se necesita un cero. Para el segundo tenemos (1, 1, X, 1, 0), para lo cual debemos agregar un 1 y así mantener la paridad, y así sucesivamente se recupera el byte completo.
- Valor bit 1: ( 0, 0, x, 0, 0) → x = 0
- Valor bit 2: ( 1, 1, x, 1, 0) → x = 1
- Valor bit 3: ( 0, 0, x, 0, 0) → x = 0
- Valor bit 4: ( 0, 1, x, 1, 1) → x = 1
- Valor bit 5: ( 1, 1, x, 0, 0) → x = 0
- Valor bit 6: ( 0, 0, x, 1, 1) → x = 0
- Valor bit 7: ( 0, 1, x, 0, 1) → x = 0
- Valor bit 8: ( 1, 0, x, 1, 1) → x = 1
Por tanto el disco 3 es 01010001
Recuperación de datos con paridad distribuida entre los discos
Si tuviésemos un RAID 5, con paridad distribuida, el procedimiento es el mismo. Sería como sigue :
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
0 | 0 | 0 | 0 | bitp5=0 |
1 | 1 | 1 | bitp4=1 | 0 |
0 | 0 | bitp3=0 | 0 | 0 |
0 | bitp2=1 | 1 | 1 | 1 |
bitp1=1 | 1 | 0 | 0 | 0 |
Como vemos los bits de paridad están distribuidos por los diferentes discos y completan la información de los valores de cada fila. Veamos, en la fila 1 tenemos
0 | 0 | 0 | 0 | bitp5=0 |
Tenemos todos los valores a 0. Por tanto el valor del bit de paridad tiene que ser 0, ya que los valores a 1 son pares.
Si nos fijamos en la fila 2
1 | 1 | 1 | bitp4=1 | 0 |
Encontramos los valores (1, 1, 1, 0). Como los valores 1 son impares el valor del bit de paridad ha de ser 1. De esta manera podemos calcular el valor del bit de paridad en cada caso.
Supongamos que falla el disco 3
Disco 1 | Disco 2 | Disco 3 | Disco 4 | Disco 5 |
0 | 0 | x | 0 | bitp5=0 |
1 | 1 | x | bitp4=1 | 0 |
0 | 0 | x | 0 | 0 |
0 | bitp2=1 | x | 1 | 1 |
bitp1=1 | 1 | x | 0 | 0 |
Para reconstruir los datos procedemos por filas
- Fila 1 Como los valores que tenemos son (0, 0, x, 0, bitp5=0), los bits a 1 son pares, por tanto el valor que buscamos será 0.
- Fila 2 Como los valores que tenemos son (1, 1, x, bitp4=1, 0), los bits a 1 son impares, por tanto el valor que buscamos será 1.
- Fila 3 Como los valores que tenemos son (0, 0, x, 0, 0), los bits a 1 son pares, por tanto el valor que buscamos será 0.
- Fila 4 Como los valores que tenemos son (0, bitp2=1, x, 1, 1), los bits a 1 son impares, por tanto el valor que buscamos será 1.
- Fila 5 Como los valores que tenemos son (bitp1=1,1, x. 0, 0), los bits a 1 son pares, por tanto el valor que buscamos será 0.
Así vemos que los valores contenidos en el disco 3 que ha fallado son 01010
Con estos sencillos ejemplos nos podemos hacer una idea de como funciona el concepto de paridad para la recuperación de datos.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.