Reconstrucción de MD RAID1 compatible con SSD / NVME en Linux

Oct 06 2020

Utilizo matrices SSD y NVME RAID1 para almacenar principalmente discos de máquinas virtuales. Más del 75% de los datos son ceros (imágenes preasignadas, espacio libre).

Si un disco falla y se reemplaza, la reconstrucción copia y escribe todos los datos en el disco de reemplazo, lo que causa estrangulamiento térmico en NVME, y supongo que habrá más desgaste en el SSD / NVME. ¿Hay alguna forma de configurar la reconstrucción para comparar los datos de ambos discos primero y escribir en el nuevo disco solo si es necesario?

¿O se supone que los chips SSD / NVME deben verificar si los datos son solo ceros y si los bloques de destino aún no están escritos (dando ceros en la lectura), simplemente descartarían los datos sin desperdiciar ciclos de escritura? ¿O si hay datos de destino, debería simplemente recortar el bloque para producir ceros?

Encontré un viejo hilo en https://www.spinics.net/lists/raid/msg57529.html pero no proporcionó una respuesta.

Intenté una solución, pero creo que es feo y además el RAID debe estar desconectado.

mdadm --fail /dev/md0 /dev/sde
mdadm -r /dev/md0 /dev/sde

(reemplazar / dev / sde)

mdadm -S /dev/md0
ddpt if=/dev/sdd of=/dev/sde verbose=1 oflag=sparing
mdadm -C -v /dev/md0 --assume-clean -l 1 -n 2 /dev/sdd /dev/sde

¿Alguna idea para la reconstrucción de RAID1 de comparación y escritura? Gracias.

Respuestas

2 Nils Oct 11 2020 at 04:41

La respuesta corta es no.

El controlador md está ajustado para el rendimiento. Y tiene un simple mapa sucio para mantener sincronizados a los miembros de la incursión 1.

Entonces, si un miembro falla, todo el mapa está sucio. Dado que md solo está basado en bloques, no se preocupa por el contenido de los bloques, simplemente copia los bloques y borra los bits sucios para estos bloques.

Principio de KISS_ mantenlo simple y estúpido. Cualquier otra cosa estaría en un nivel superior.

Si lo desea, puede usar drbd con dos miembros locales en lugar de md raid1. DRBD proporciona los medios para verificar antes de sincronizar.

2 JohnLeeMcMahon Oct 16 2020 at 10:00

Por lo tanto, la única forma de realizar la reconstrucción de comparación y escritura en MDRAID1 (aparte de sincronizar sin conexión, por ejemplo, ddpt) parece ser la reparación (la matriz debe detenerse y reconfigurarse al reemplazar el disco, el disco bueno debe ir primero en la nueva matriz para convertirse en el ID 0 y la fuente de datos)

mdadm -C -v /dev/md0 -l 1 -n 2 /dev/sdd /dev/sde
mdadm /dev/md0 -f /dev/sdd -r /dev/sdd
mdadm -S /dev/md0
mdadm -C -v /dev/md0 -l 1 -n 2 --assume-clean /dev/sde /dev/sdd
echo repair > /sys/block/md0/md/sync_action

También parece funcionar para múltiples espejos:

mdadm -C -v /dev/md0 -l 1 -n 3 /dev/sdd /dev/sde /dev/sdf
mdadm /dev/md0 -f /dev/sde -f /dev/sdf -r /dev/sde -r /dev/sdf
mdadm -S /dev/md0
mdadm -C -v /dev/md0 -l 1 -n 3 --assume-clean /dev/sdd /dev/sde /dev/sdf
echo repair > /sys/block/md0/md/sync_action

También experimenté con ideas de remodelar la matriz sin parar (RAID0 -> RAID1_or_RAID10 -> RAID0), pero no vi comparar-escribir en RAID10 (aparentemente usado para RAID10 según el hilo original de linux-raid) y las cosas no funcionan como Lo esperaba en RAID0 -> conversiones RAID1.

Copia completa, pero funciona:

mdadm -C -v /dev/md0 -l 0 -n 2 /dev/sdd /dev/sde
mdadm -G /dev/md0 -n 4 -l 10 -a /dev/sdf -a /dev/sdg
mdadm /dev/md0 -f /dev/sdf -f /dev/sdg -r /dev/sdf -r /dev/sdg
mdadm -G /dev/md0 -n 2 -l 0

Copia completa, también funciona:

mdadm -C -v /dev/md0 -l 0 -n 3 /dev/sdd /dev/sde /dev/sdf
mdadm -G /dev/md0 -n 6 -l 10 -a /dev/sdg -a /dev/sdh -a /dev/sdi
mdadm /dev/md0 -f /dev/sdg -f /dev/sdh -f /dev/sdi -r /dev/sdg -r /dev/sdh -r /dev/sdi
mdadm -G /dev/md0 -n 3 -l 0

Pero problemas aquí:

mdadm -C -v /dev/md0 -l 1 -n 2 /dev/sdd /dev/sde
mdadm /dev/md0 -f /dev/sde -r /dev/sde
mdadm -G /dev/md0 -n 1 -l 0

No se puede cambiar el número de discos en RAID1-> conversión RAID0

mdadm -G /dev/md0 -l 0

pero sin -n 1 funciona

mdadm -G /dev/md0 -l 1 -n 2 --force -a /dev/sde

Imposible cambio de nivel solicitado

mdadm -C -v --force /dev/md0 -l 0 -n 1 /dev/sdd
mdadm -G /dev/md0 -l 1 -n 2 --force -a /dev/sde

Imposible cambio de nivel solicitado