linux

Cómo migrar mdadm RAID10 con 4 discos a RAID5

Tengo un RAID10 por software basado en mdadm de Linux bajo Debian Buster.Originalmente encontré que el RAID10 tenía el mejor rendimiento.Pero necesito más espacio y acepto cambiar un poco de rendimiento de escritura por +50% de espacio.

# gato /proc/mdstat
Personalities : [raid10] [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4]
md1 : active raid10 sdd1[5] sda1[4] sdb1[1] sdc1[2]
      3899738112 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 3/30 pages [12KB], 65536KB chunk

unused devices: <none>

Este almacenamiento se sirve a través de NFS e idealmente el RAID podría transformarse sin tiempo de inactividad.Sí,tengo copias de seguridad y un fallo no sería crítico,pero por qué no migrar sin interrupción si funciona.

Encontré un artículo de 2012 que describe el proceso. Los comandos resultaron ser bastante correctos. En aquel entonces, el autor tenía problemas de que la utilidad mdadm (o probablemente el controlador del kernel) colgaba inmediatamente el sistema con el primer comando. Este problema parece haberse solucionado desde entonces.

https://www.tummy.com/blogs/2012/03/29/changing-a-raid-10-into-a-raid-5/

No hay una ruta directa de RAID10→RAID5 en mdadm.En su lugar,primero hay que degradar el RAID0:

# mdadm --grow /dev/md1 --level=0 --raid-dispositivos=2
mdadm: /dev/md1: could not set level to raid0

Esto fue instantáneamente efectivo e hizo que 2 dispositivos fallaran y fueran eliminados de la matriz. Desafortunadamente, el nivel de RAID no se configuró en RAID0. dmesg mostró:

md/raid0:md1: All mirrors must be already degraded!
md: md1: raid0 would not accept array

Descubrí que el problema era que sysfs informó que la matriz no estaba degradada, aunque en realidad lo estaba y mdadm y cat /proc/mdstat se mostraban correctamente:

# cat /sys/block/md1/md/degraded
0

No encontré otra forma de solucionarlo que detener el servidor NFS,desmontar el sistema de archivos,cerrar el dispositivo LUKS,detener la matriz RAID,volver a montar la matriz RAID y reiniciar todos los servicios.Después se reportó correctamente como degradado y se pudo transformar en RAID0.

Entonces podría volver a crecer hasta 4 dispositivos con RAID5:

# mdadm --grow /dev/md1 --level=5 --raid-devices=5 --add /dev/sdb1 /dev/sdd1

Como nunca antes cat /proc/mdstat no mostraba una "reconstrucción" en curso sino una "remodelación". Esto tomó bastante tiempo (alrededor de 10 horas) y el sistema respondió mucho más lento que durante las reconstrucciones de RAID10. Lo dejé solo para el tiempo de reconstrucción.

Desde que se ha completado la remodelación el RAID5 está limpio y la velocidad es buena.Probablemente cometí errores al medir,pero la velocidad de lectura es ahora más rápida que la que registré antes y la velocidad de escritura también es aceptable para mí.

# gato /proc/mdstat
Personalities : [raid10] [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] 
md1 : active raid5 sdd1[5] sdb1[3] sda1[4] sdc1[7]
      5849607168 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>

(descargo de responsabilidad: toda la historia se escribió cuando la migración ya estaba completa. Intenté cuidadosamente describir los comandos reales y los mensajes de error, pero puede haber errores menores. El proceso general funcionó como se describe).




No (todavía) probado (no confíe en los datos importantes de los pasos a continuación), pero aquí hay una idea para cualquier escenario en el que se aumente el espacio utilizable y mdadm --grow dice "El diseño de RAID10 es demasiado complejo para la operación de crecimiento":

  1. Detener el md
  2. Hacer una copia de seguridad de los primeros MiB de cada partición del md (asumiendo que los superbloques RAID están cerca del inicio de cada partición)
  3. Limpiar los superbloques
  4. Cree un RAID5 (u otro RAID) con --assume-clean usando las particiones
  5. Cree instantáneas de cada partición del md, por ejemplo, siga https://gist.github.com/jowagner/b36024636140ddf453c12eaf6e590b5d
  6. Restaurar la copia de seguridad de las particiones del paso 2 en instantáneas de las particiones
  7. Montar el RAID10 a partir de las instantáneas
  8. dd a RAID5. Usar el mínimo común múltiplo de los 2 tamaños de franja es probablemente lo mejor para el rendimiento, pero cualquier tamaño de bloque debería funcionar. Las primeras lecturas no se dañarán por las escrituras porque provienen de datos de copia en escritura escritos en el paso 5. Las lecturas restantes no se dañarán ya que están por delante con una distancia segura de las escrituras en cada partición (por lo tanto, el limitación de esta idea a escenarios donde se aumenta el espacio útil).
  9. Detener el RAID10
  10. Descartar las instantáneas

Esto supone que una instantánea sólo redirige las escrituras en las instantáneas a un dispositivo COW y que las escrituras en el dispositivo de origen no desencadenan una copia de los datos antiguos que se almacenan en el dispositivo COW (de lo contrario,la solución no sería práctica ya que se necesita demasiado espacio extra).

Además,si los superbloques del antiguo RAID están cerca del final de cada partición,estos datos también deben ser respaldados antes del paso 3.Calcula una posición adecuada para buscar y la cantidad de datos.Yo usaría unas cuantas líneas de Python pero probablemente haya una herramienta de línea de comandos que pueda hacerlo.