¿Qué es la paridad en una configuración de RAID?

Bueno, mi última entrada había sido explicar qué es un RAID y raíz de eso me han preguntado otra cosa ¿Qué es la paridad?

Bueno, la información de paridad es un tipo de redundancia que nos permite recuperar los datos al vuelo en caso de que falle algún disco. Esto también lo permite una copia en espejo (RAID 1), pero con una diferencia: En el artículo anterior veíaimos que en un RAID 1 tenemos todo un disco ocupado con los datos redundantes, en cambio en un RAID 5 decíamos que solo ocupábamos el equivalente a un disco para almacenar la paridad, si tenemos cuatro discos aprovechamos el espacio de 3 ¿Qué brujería es esta? Pues una brujería matemática.

La información de paridad es una informacion calculada operando con el resto de datos de la misma división. De esta forma si se rompe un disco podemos recuperarlos comparando los datos que tenemos con los de paridad. Por poner un ejemplo simplificado, pensemos en álgebra sencilla. Imagina que calculásemos la paridad sumando los valores de los sectores de una misma división: El valor del sector 1 sería 1, del sector 2 sería 2, del sector 3 sería 3 y la paridad sería su suma ( 1+2+3=6 ). Si se rompiese el disco que conteía el sector 2 tendríamos esto en nuestros discos: 1+X+3=6. Podemos resolver la ecuación para saber que X era 2 antes de tener que cambiar el disco. Aunque el cálculo de paridad es realmente más complejo, esencialmente sería algo así.

Los sistemas de paridad simple más sencillos suelen usar la operación XOR para hacer estos cálculos a nivel de bit. Los sistemas más complejos, por ejemplo la doble paridad del RAID 6, utilizan operaciones más complicadas como un código Reed-Solomon u operaciones sobre un campo de Galois concreto. El requerir operaciones más complejas para calcular la paridad provoca que la velocidad de escritura sea menor, a cambio de conseguir una mayor tolerancia a fallos ya que podrían fallar hasta dos discos sin que perdamos datos.

Tipos de RAID más comunes

Me pregunta un amigo que és un RAID así que ya me ha dado una excusa para escribir una entrada sobre esto: RAID es el acrónimo de Redundant Array of Independent Discs, que en castellano sería Matriz Redundante de Discos Independientes. Y si ahora acabo aquí con razón te quejarías de que el título del post es engañoso. Una vez visto el significado vamos a explicarlo: el RAID es un sistema de almacenamiento que utiliza varios discos duros de forma conjunta para almacenar y replicar la información. Existen distintos tipos de configuraciones según busquemos mejorar la velocidad o la seguridad de nuestros datos, o el balance más equilibrado entre ellas. Vamos a ver cuáles son los tipos más habituales, ilustradas con unos gráficos sacados de la wikipedia:

RAID 0

También llamado Stripped Volume. Es uno de los tipos más básicos de RAID y requiere de solo dos discos. Cuando lo configuramos así ambos discos funcionan como uno solo, sumando sus tamaños, y la información se distribuye de forma equitativa entre ambos discos. Esto duplica la velocidad de escritura y de lectura pero reduce la tolerancia a fallos: si se estropea uno de los discos perderemos todos los datos pues no hay paridad ni respaldo.

RAID 1

También llamado Espejo, o Mirror en inglés. Como el RAID 0 requiere solo de dos discos, ambos del mismo tamaño. Básicamente lo que se hace en esta configuración es escribir los mismos datos en los dos discos, uno sería el “espejo” del otro. El gran problema de este tipo de RAID es que solo podemos usar la mitad del espacio disponible pues la otra mitad estará dedicada a replicación, como ventajas nos da una pequeña mejora en la velocidad de lectura y una gran tolerancia a fallos: si falla uno de los discos tenemos todos los datos en el otro que, además, se volverán a duplicar cuando sustituyamos el disco roto.

RAID 5

El RAID 5, o de paridad distribuida, es uno de los más usados en entornos empresariales por su buena combinación de rendimiento, aprovechamiento de discos y tolerancia a fallos. Aquí ya necesitaremos al menos 3 discos para empezar a trabajar. Con esta configuración cada vez que se escribe un bloque de datos se escribe tambien un bloque de paridad en su misma división. Esto permitirá que en caso de que rompa uno de los discos los datos puedan recuperarse al reconstruir el raid, aunque si rompiesen dos discos ya sí perderíamos toda la información. Respecto al RAID 1 se aprovecha más espacio, pues dispondríamos de un espacio igual al número de discos menos uno: por ejemplo con 4 discos de 2 teras tendríamos 6 teras disponibles. También conseguimos una mejora de la velocidad de lectura en una proporción similar, aunque no así en la escritura. La cantidad de discos que se puden montar en RAID 5 es teóricamente ilimitada, pero hay que tener en cuenta que cuantos más discos tenga la matriz más probabilidades hay de que falle uno.

RAID 6

Similar al RAID 5 pero añadiendo un segundo nivel de paridad. Esto permitiría recuperar los datos en caso de que fallen dos de los discos, aunque en lugar de sacrificar el espacio de un disco para paridad sacrificaríamos el de dos. Para la configuración del ejemplo anterior, 4 discos de 2 teras, tendríamos 4 teras disponibles en lugar de 6. Aunque logra una mejora en la velocidad de lectura algo menor que la del RAID 5 penaliza la escritura al tener que hacer más cálculos de paridad. Puede ser más recomendable que un RAID 5 si se quiere utilizar un número grande de discos al tener una mayor tolerancia a fallos.

RAID 10

El RAID 10, o RAID 1+0, es básicamente una combinación de un RAID 1 y un RAID 0. Es una configuración muy popular a la hora de montar servidores de bases de datos por su buena combinación de velocidad con tolerancia a fallos. Requiere al menos cuatro discos y han de ser siempre un número par. Básicamente se monta primero cada par de discos haciendo un RAID 1, con uno replicando al otro, y después se hace un RAID 0 sobre esos conjuntos de discos. Es bastante robusto pues podrían fallar a la vez un disco de cada par sin perder datos. Existe también una opción similar pero a la inversa que sería el RAID 0+1, pero es poco utilizado por tener una menor tolerancia a fallos. También, con un mayor número de discos, podríamos hablar de un RAID 100: consiste en coger dos matrices de discos en RAID 10 y aplicar sobre ellas un RAID 0 a mayores, o de un RAID 101: lo mismo pero aplicando un RAID 1 a las matrices en RAID 10.

Existen más configuraciones que las aquí citadas, tanto básicas como combinadas (RAID 2, RAID 3, RAID 4, RAID 30, RAID 50…). puedes verlas todas en el artículo de Wikipedia del que saqué las imágenes de ejemplo, donde también tienes explicaciones más detalladas de algunas de las configuraciones aquí explicadas.

Linux: Cómo añadir un nuevo disco a un RAID 0

Ayer me econtraba en la siguiente tesitura: un servidor Ubuntu con dos discos en RAID0 al que hay que añadir un tercer disco pero sin borrar los datos que ya hay en el array. ¿Cómo lo hago? Esto me funcionó para un Ubuntu Server con kernel 4.4 así que en SO bastante nuevos debería funcionar.

Bueno, desde la versión 2.6.35 del kernel es posible hacerlo con mdadm con el siguiente comando. Para el ejemplo supongamos un raid llamado md1 con dos discos y un nuevo disco llamado sdd

mdadm --grow /dev/md1 --level=0 --raid-devices=3 --add /dev/sdd

Básicamente usamos grow sobre el array que ya tenemos, ponemos el número de discos que serán ahora en raid-devices y finalmente ponemos qué disco añadimos con add.

Crear un Raid1 con mdadm en Linux

Si ya vimos como instalar mdadm y cómo hacer un Raid0 para conseguir mayor velocidad, vamos ahora con otro de los arrays de discos más básicos: RAID1 o Mirroring. Lo de mirroring ya te dará una idea sobre cómo funciona la cosa: consiste en tener una copia exacta de los datos en dos discos. Esto implica que lo mejor para este caso es tener dos discos duros del mismo tamaño.

Para este ejemplo vamos a suponer que tenemos dos discos: sda1 y sdb1.

El primer paso es editar el archivo /etc/mdadm.conf y añadir los parámetros DEVICE y ARRAY correspondientes:

DEVICE /dev/sd[ab]1
ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1

Una vez configurado el archivo nos toca ejecutar el comando mdadm para crear el array de discos y que se inicie:

mdadm -C /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1

Tras eso nos pedirá permiso para continuar creando el array, así que basta con contestar yes para terminar.

Recuerda que este tipo de array ralentiza la velocidad de escritura en disco al tener que duplicar el trabajo.

Crear un RAID 0 en Linux mediante mdadm

El otro día hablamos sobre la existencia de mdadm y cómo instalarlo en nuestra distribución Linux. Hoy vamos a ver cómo usarlo para crear un RAID 0.

En fin, os vais a las instrucciones del otro día para instalar mdadm, y cuando lo tengáis instalado comprobáis en /proc/mdstat que no haya ningún array creado (no debería). Para este ejemplo vamos a suponer que tenemos cuatro discos duros: sda1,sdb1,sdc1,sdd1.

El primer paso es editar el archivo /etc/mdadm.conf y añadir los parámetros DEVICE y ARRAY correspondientes:

DEVICE /dev/sd[abcd]1
ARRAY /dev/md0 devices=/dev/sda1,/dev/sdb1,/dev/sdc1,/dev/sdd1

Una vez configurado el archivo nos toca ejecutar el comando mdadm para crear el array de discos y que se inicie:

mdadm -C /dev/md0 --level=raid0 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

Tras eso nos pedirá permiso para continuar creando el array, así que basta con contestar yes para terminar.

Una vez creado el array de discos podemos consultarlo con el comando mdadm –detail /dev/md0 desde el que podremos ver todos los datos del nuestro RAID.