¿Cómo reemplazar de forma segura un disco que aún no ha fallado en una matriz RAID5 de Linux?

26

Tengo una matriz de software RAID5 (Linux md) en 4 discos.

Me gustaría reemplazar uno de los discos por uno nuevo, sin poner la matriz en un estado degradado y, si es posible, en línea. ¿Cómo sería eso posible?

Es importante porque no quiero:

  • corre el riesgo de estresar los otros discos para que uno pueda bloquearse durante la reconstrucción,
  • corro el riesgo de estar en un "estado de no paridad" para no tener una red de seguridad por algún tiempo.

Supongo que hacerlo en línea es pedir demasiado y debería copiar sin formato ( dd) los datos del disco antiguo al nuevo fuera de línea y luego reemplazarlo, pero creo que es teóricamente posible ...

Algún contexto : todos esos discos han estado girando casi continuamente durante más de 5,5 años. Todavía funcionan perfectamente por el momento y todos pasan la autoprueba SMART (larga). Sin embargo, tengo razones para pensar que uno de esos 4 discos no durará mucho más (supuesto fallo predictivo).

Totor
fuente

Respuestas:

36

Usando mdadm 3.3

Desde mdadm3.3 (lanzado el 3 de septiembre de 2013), si tiene un kernel 3.2+ , puede proceder de la siguiente manera:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md0 --replace /dev/sdd1 --with /dev/sdc1

sdd1es el dispositivo que desea reemplazar, sdc1es el dispositivo preferido para hacerlo y debe declararse como repuesto en su matriz.

La --withopción es opcional, si no se especifica, se utilizará cualquier repuesto disponible.

Versión anterior de mdadm

Nota: Todavía necesita un núcleo 3.2+ .

Primero, agregue una nueva unidad como repuesto (reemplace md0y sdc1con su RAID y dispositivo de disco, respectivamente):

# mdadm /dev/md0 --add /dev/sdc1

Luego, inicie una operación de reemplazo de copia como esta ( sdd1siendo el dispositivo que falla):

# echo want_replacement > /sys/block/md0/md/dev-sdd1/state 

Resultado

El sistema copiará todos los bloques legibles de sdd1a sdc1. Si se trata de un bloque ilegible, lo reconstruirá desde la paridad. Una vez que se completa la operación, el repuesto anterior (aquí:) se sdc1activará y la unidad que falla se marcará como fallida (F) para que pueda eliminarla.

Nota: el crédito va para frostschutz y Ansgar Esztermann, quienes encontraron la solución original (vea la pregunta duplicada ).

Granos viejos

Otras respuestas sugieren:

  • Johnny 's enfoque : convertir matriz para RAID 6, 'reemplazar' el disco, a continuación, volver a RAID 5,
  • Hauke Laging 's enfoque : brevemente quitar el disco de la matriz RAID 5, que sea parte de un RAID 1 (espejo) con el nuevo disco y añadir que volver unidad de espejo a la matriz RAID 5 (teórico) ...
Totor
fuente
2
mdadm --addtodavía se necesita antes de --replaceque funcione. ( mdadm3.3, Ubuntu 15.10). Si hace lo --addsiguiente --replace, la copia comenzará tan pronto como se agregue un repuesto. (El dispositivo permanece marcado como "queriendo reemplazo").
Peter Cordes
3

Esto puede ser posible cumpliendo los requisitos

  1. en línea
  2. no estreses ningún disco excepto el que se va a reemplazar

Pero incluso si lo siguiente puede funcionar, probablemente no encontrará ninguna recomendación de ese tipo "en los libros" ...

Idea:

  1. Saque el disco VIEJO de la matriz (por un breve momento): mdadm --manage /dev/raid5 --fail /dev/OLD
  2. Cree un nuevo dispositivo md (RAID-1) a partir de discos ANTIGUOS y NUEVOS: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Vuelva a colocar el RAID-1 en la matriz (en lugar de / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

Lo que debería :-) suceder:

  1. El RAID-5 obtiene / dev / md42 en sincronización. Esto no debería llevar mucho tiempo.
  2. El RAID-5 normalmente vuelve a estar operativo (pero más lento).
  3. / dev / NEW se sincroniza con / dev / OLD.

Mira el progreso de la sincronización ( cat /proc/mdstato mdadm --monitor). Si la sincronización ha finalizado, saque el RAID-1 del RAID-5, detenga el RAID-1, vuelva a agregar / dev / NEW al RAID-5. Si todo está bien, sobrescriba los superbloques mdraid en / dev / OLD para evitar problemas:mdadm --zero-superblock

Advertencia: la sincronización rápida de RAID-5 puede funcionar solo si usa un mapa de bits. Si no tiene uno, es mejor que primero haga una prueba con un RAID-5 ficticio (sin un mapa de bits). O agrega uno. Al menos debería ser posible agregar uno externo. De lo contrario, puede ser necesario detener el RAID-5 antes de cambiar los dispositivos. Sin embargo, si arranca desde el RAID-5, esto sería un poco complicado.

Hauke ​​Laging
fuente
3

Si no le importa ejecutar RAID-6 (2 discos de paridad en lugar de 1), y si está ejecutando mdadmin 3.1.xo superior, puede convertir su matriz RAID-5 a RAID-6 para agregar un disco de paridad adicional . Sin embargo, esto colocará la matriz bajo tensión durante la reconstrucción. Y tiene algunas implicaciones de rendimiento ya que hay más discos de paridad para actualizar durante las escrituras.

Pero si se completa con éxito, puede mantener su disco defectuoso en su lugar y cuando finalmente falla, todavía tiene protección de paridad para la matriz. Creo que puede convertir la matriz de RAID6 a RAID5 si no espera para mantenerla como RAID6.

No conozco una forma en línea de mantener la matriz como RAID-5 y reemplazar el disco sin poner la matriz en modo degradado, ya que creo que debe marcarlo como fallido para reemplazarlo. Su idea de copia de dd podría ser la forma de hacerlo.

Johnny
fuente
@haukelaging FYI ahora es posible desde el kernel 3.2, vea mi respuesta .
Totor