top of page

Almacenamiento redundante: configuración de RAID en Linux

jogofus
4 sept
9 min de lectura

Hace años viví una situación que me dejó con ciertos escalofríos.

Tuve que ir a hacer una auditoría a una empresa para comprobar cuales eran sus necesidades y sus debilidades en ese momento. Cuando llego estaba justamente el informático subcontratado que les llevaba el mantenimiento de la infraestructura. Por lo visto había sustituido el servidor viejo por uno nuevo. En mi labor de auditoría le pregunté las características del servidor, así como sus funciones.


-¿Podrías contarme un poco acerca de este hierro?

+Si, claro. Lleva 8Gb de RAM, una tarjeta de red, un disco HDD de 1TB y un Windows Server.

-¿Cuáles van a ser sus funciones?

+Va a hacer de Active Directory, servidor de ficheros, BBDD MS-SQL...


Podéis imaginar mi cara al ver todo lo que iba a hacer ese equipo. Vamos a dejar de lado que era el único servidor que había en la red, que no había separación de roles mediante virtualización o distintos servidores o incluso la incapacidad de 8 simples GB.

Lo que me llamó la atención es que el disco que almacenaba TODA la información de la empresa era un HDD único, sin redundancia y, con suerte, copias cada 15 días a un disco USB externo.

RAID: Redundancia y tolerancia a fallos en almacenamiento

¿Qué es un RAID?

RAID = "Redundant Array of Independent Disks"



Se trata de una tecnología para combinar varios discos físicos en una sola unidad lógica con el objetivo de mejorar rendimiento, redundancia, o según el nivel usado, mejorar ambos.

La idea fundamental es que los datos no tienen por qué almacenarse íntegramente en un único disco. RAID distribuye los datos entre varios discos, llegando a almacenar información redundante que permite reconstruir los datos si uno o varios discos fallan.


RAID introduce una capa de abstracción entre el sistema operativo y los dispositivos físicos, siendo desde el punto de vista del SO un único dispositivo lógico. El sistema operativo realiza operaciones de lectura y escritura sobre el dispositivo RAID, y la capa RAID decide cómo traducir esas operaciones a los discos físicos.


Podemos tener RAID por hardware y RAID por software. La diferencia aquí radica en, como indica su nombre, quién gestiona esa capa de abstracción.Para poder hacer uso de RAID por hardware deberemos disponer de una controladora dedicada, mientras que por software es el propio sistema operativo el encargado.


Algunas otras diferencias significativas son las siguientes:

  • Precio: En RAID por hardware deberemos añadir el precio de la controladora, las cuales suelen ser bastante caras. Si hacemos uso de RAID por software no deberemos hacer más que instalar el paquete necesario.

  • Compatibilidad: Si es por hardware deberemos asegurarnos de que el hardware es compatible entre sí, mientras que por software no corremos ese peligro ya que el sistema operativo solo ve dispositivos de bloque.

  • Vendor lock-in: Con una controladora estamos atados a las actualizaciones del fabricante. Si pasa un tiempo y el fabricante decide descatalogarla perderemos la oportunidad de seguir actualizando.

  • Interoperatibilidad: En RAID por hardware estaremos atados a ese modelo de controladora específico, sin poder migrar los discos a otra controladora o sistema, mientras que por software podremos migrar los discos a cualquier otro sistema sin importar el hardware.


Una cosa que se debe tener en cuenta es que un RAID no es un sistema de backup.

Los tres conceptos fundamentales

Para entender RAID correctamente hay tres mecanismos especialmente importantes.

  1. Stripping. Significa distribuir los datos entre varios discos. Los datos se trocean en bloques que se reparten secuencialmente entre discos. Un archivo de 12MB en un array de 3 discos con stripe de 4MB escribe 4MB en cada disco simultáneamente. Esto multiplica el throughput porque las tres escrituras ocurren en paralelo, pero no da redundancia, es decir, si un disco falla se pierden todos los archivos ya que no se pueden recuperar esos fragmentos.

  2. Mirroring. Los mismos datos se escriben duplicados en dos o más discos. Da redundancia total (cualquier disco puede fallar y los datos siguen íntegros en el otro) pero no gana capacidad.

  3. Paridad: en vez de duplicar todo el dato, se calcula un valor de paridad (típicamente XOR) a partir de los bloques de datos y se almacena aparte, distribuido entre los discos. Si un disco falla, el dato perdido se reconstruye matemáticamente a partir de los datos supervivientes + la paridad. Esto da redundancia con mucho menos overhead de capacidad que el mirroring completo.


Cálculo de paridad XOR (OR exclusivo)

Se trata de una operación lógica bit a bit: el resultado es 1 si los bits son diferentes y 0 si son iguales.

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Ejemplo con bytes reales

Disco A: 1 1 0 0 1 0 1 1
Disco B: 0 1 1 0 0 1 1 0
Disco C: 1 0 0 1 1 1 0 0
Posición 1: 1 XOR 0 XOR 1 = 0
Posición 2: 1 XOR 1 XOR 0 = 0
Posición 3: 0 XOR 1 XOR 0 = 1
Posición 4: 0 XOR 0 XOR 1 = 1
Posición 5: 1 XOR 0 XOR 1 = 0
Posición 6: 0 XOR 1 XOR 1 = 0
Posición 7: 1 XOR 1 XOR 0 = 0
Posición 8: 1 XOR 0 XOR 0 = 1

Disco P:  0 0 1 1 0 0 0 1


Niveles de RAID

Los diferentes niveles de RAID que existen son los siguientes:


RAID 0

Es denominado raid de conjunto dividido. En este tipo de RAID no tendremos redundancia, ya que lo que se hará será repartir los datos almacenados entre los distintos discos.Gracias a este tipo de RAID obtendremos buenas velocidades de acceso a los datos, pudiendo acceder a los datos distribuidos al mismo tiempo.


RAID 1

Este tipo de RAID es muy común verlo en los discos de almacenamiento del sistema operativo. Se trata del tipo de RAID en espejo: todos los datos serán replicados exactamente igual en todos los discos. Nos proporciona redundancia y tolerancia a fallos.



RAID 5

Se trata del sistema distribuido con paridad. Éste, junto con el RAID 6 suele ser de los más utilizados en dispositivos NAS.

La información se distribuye en bloques (striping) a nivel de bloque entre los discos que componen el array. Adicionalmente, por cada stripe se calcula un bloque de paridad mediante XOR sobre los bloques de datos correspondientes, lo que permite reconstruir el contenido de un disco si este falla.


Este bloque de paridad no se aloja en una unidad fija, sino que rota entre todos los discos del array de forma distribuida stripe a stripe — es la diferencia estructural entre RAID5 (paridad distribuida) y RAID4 (paridad en disco dedicado, obsoleto en producción por el cuello de botella que genera al concentrar todas las escrituras de paridad en un único disco).


El esquema requiere un mínimo de tres discos (N discos de datos + 1 de paridad, con N≥2) y ofrece una capacidad útil de N-1 discos. La tolerancia a fallos se limita a un único disco simultáneo: con una sola ecuación de paridad (XOR) solo se puede despejar una incógnita; un segundo fallo simultáneo deja el sistema de ecuaciones subdeterminado y los datos del segundo disco son irrecuperables. Esta limitación es la que motiva RAID6, que añade una segunda paridad (Q) calculada sobre un campo de Galois GF(2⁸) para tolerar dos fallos concurrentes.


RAID 6

RAID6 es una extensión de RAID5 en la que se añade una segunda paridad, hasta un total de dos por stripe. Los bloques de datos se distribuyen entre las unidades igual que en RAID5, y de forma equivalente, los dos bloques de paridad (P y Q) también se distribuyen rotando entre discos distintos stripe a stripe, evitando que ninguna unidad concentre toda la carga de paridad.


Esta doble paridad hace al sistema tolerante al fallo simultáneo de hasta dos unidades: mientras que en RAID5 una sola ecuación XOR solo permite despejar una incógnita, en RAID6 se dispone de dos ecuaciones independientes (P calculada por XOR y Q calculada sobre un campo de Galois GF(2⁸) con coeficientes distintos por disco) lo que permite resolver el sistema incluso con dos discos caídos a la vez.


Como consecuencia de reservar capacidad para dos bloques de paridad por stripe, RAID6 requiere un mínimo de cuatro unidades de almacenamiento, con una capacidad útil de N-2 discos.


RAID 0+1

También se conoce como RAID 01 o mirror de stripes. Su arquitectura es jerárquica invertida respecto a RAID 10: el nivel superior es RAID1, encargado de replicar en espejo el contenido íntegro de un primer subnivel sobre un segundo. Cada uno de esos subniveles es a su vez un RAID0, responsable del striping de los datos entre las unidades que lo componen.


Es decir: la función de espejo se aplica a nivel de array completo (dos stripes completos, cada uno espejo del otro), y la función de división de datos ocurre dentro de cada subnivel. Cuando falla un disco, los datos siguen disponibles íntegros en el stripe RAID0 del otro subnivel.


La desventaja principal es de escalabilidad: al añadir un disco a un subnivel para mantener la simetría del striping, es necesario replicar el cambio en el otro subnivel (no se puede ampliar un subnivel de forma independiente sin romper la correspondencia del espejo).


En cuanto a tolerancia a fallos, la limitación estructural es importante: el sistema resiste el fallo de un disco en cada subnivel de forma independiente, o el fallo de hasta dos discos si ambos pertenecen al mismo subnivel (ya que el subnivel completo queda cubierto por el espejo del otro). Pero no resiste ninguna combinación en la que ambos subniveles pierdan un disco simultáneamente sin que uno de ellos quede completo, dado que un subnivel con striping degradado por la pérdida de cualquiera de sus discos pierde el 100% de los datos de ese stripe  (a diferencia de RAID10, donde la redundancia es por pareja espejada individual y no por subnivel completo, lo que le da mayor tolerancia práctica a fallos combinados).

RAID 1+0

También llamado RAID 10 o stripe de mirrors. El nivel principal es RAID0, encargado de distribuir los datos entre los distintos subniveles. Cada subnivel es a su vez un RAID1, responsable de replicar en espejo los datos entre los discos que lo componen.


En este caso la tolerancia a fallos es más granular: dentro de cada subnivel pueden fallar todos los discos menos uno sin pérdida de datos, ya que basta con que sobreviva una copia del espejo. La única condición para no perder información es que quede al menos un disco sano en cada uno de los subniveles (si un subnivel completo pierde todos sus discos, el stripe correspondiente del nivel RAID0 queda incompleto y los datos de ese subnivel son irrecuperables, independientemente del estado de los demás subniveles).


Esta granularidad por pareja espejada (en vez de por subnivel completo, como en RAID01) es lo que le da a RAID10 mayor tolerancia práctica a fallos combinados, y es el motivo por el que suele preferirse sobre RAID01 en implementaciones reales.

Configuración paso a paso de un RAID con mdadm

En Linux tenemos un paquete disponible para crear RAID por software llamado mdadm. Existen otras opciones como ZFS o BTRFS.


En primer lugar instalaremos el paquete correspondiente y verificamos su instalación.

sudo apt install mdadm
sudo mdadm --version

Una vez hecho esto, identificamos los discos que vamos a utilizar para el RAID.

lsblk

Si los discos han sido utilizados previamente en otro RAID deberemos poner a cero los superblocks.

sudo mdadm --zero-superblock /dev/vdb
sudo mdadm --zero-superblock /dev/vdc
sudo mdadm --zero-superblock /dev/vdd
sudo mdadm --zero-superblock /dev/vde

Y limpiamos la tabla de particiones.

sudo wipefs -a /dev/vdb
sudo wipefs -a /dev/vdc
sudo wipefs -a /dev/vdd
sudo wipefs -a /dev/vde

Como dato, con wipefs -a borra todas las firmas/metadata, incluyendo RAID, LVM, LUKS, FS....


Creamos el RAID 5.

mdadm --create --verbose /dev/md0 --level=5 --raid-devices=4 /dev/vdb /dev/vdc /dev/vdd /dev/vde

--create: Crea nuevo RAID

--verbose: Muestra una salida detallada, que nos puede servir para hacer debug en caso de error.

/dev/md0: Nombre que asignamos a nuestro nuevo dispositivo RAID.

--level=5: RAID 5

--raid-devices=4: Número de dispositivos de bloques que participarán en el RAID.


Una vez ejecutado el comando podremos ver el estado de la creación del RAID mediante:

cat /proc/mdstat

Para verlo en tiempo real podemos hacer lo siguiente:

watch -n1 cat /proc/mdstat

Y tendremos una salida como la siguiente:


El siguiente paso es crear el sistema de ficheros en el RAID.

mkfs.ext4 /dev/md0 -L ALMACENAMIENTO-RAID

Creamos el punto de montaje y montamos el RAID.

mkdir /mnt/ALMACENAMIENTO-RAID
mount /dev/md0 /mnt/ALMACENAMIENTO-RAID

Guardamos la configuración del RAID para que el kernel pueda detectarlo.

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

Actualizamos initramfs.

sudo update-initramfs -u

Reconstrucción del RAID

Para este escenario voy a eliminar un disco físicamente, igual que si se tratara de un disco roto, y podremos comprobar como se regenera el RAID automáticamente.


Ahora añadimos otro disco para empezar la reconstrucción. Podríamos haberlo especificado mediante la flag --spare-devices=1.

Ejemplo:

mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/vdb /dev/vdc /dev/vdd /dev/vde

Añadimos el disco nuevo.

mdadm --add /dev/md0 /dev/vdc

Cambio de dispositivo del RAID

Supongamos que el equipo original con RAID se ha deteriorado y no podemos hacer uso de él o hemos mejorado el hardware. 

Podemos disponer del mismo RAID moviéndolo al nuevo, siempre y cuando no se hayan corrompido los superblocks.


Conectamos los discos y ejecutamos:

sudo mdadm --assemble --scan
cat /proc/mdstat
mdadm --detail /dev/md0

En este caso, nada más conectar los discos el sistema operativo ha reconocido el RAID y lo ha montado vía udev.


Comprobamos que está todo como en el anterior sistema.



Si queremos renombrar el raid y ponerlo con md0, hacemos lo siguiente.

mdadm --stop /dev/md127
mdadm --assemble /dev/md0 /dev/vdb /dev/vdc /dev/vdd /dev/vde --update=name

Si no hay inconveniente con la nomenclatura, se puede dejar tal cual.


En el nuevo sistema guardamos la configuración RAID:

mdadm --detail --scan | tee -a /etc/mdadm/mdadm.conf
update-initramfs -u


Y hasta aquí el post de hoy. Espero que te haya resultado útil y que te haya servido para aprender algo nuevo o resolver alguna duda.


Nos vemos en el próximo artículo.

 
 
 

Comentarios


bottom of page