Comment remplacer en toute sécurité un disque non encore défaillant dans une matrice Linux RAID5?

26

J'ai une matrice logicielle RAID5 (Linux md) sur 4 disques.

Je voudrais remplacer l'un des disques par un nouveau, sans mettre la baie dans un état dégradé et, si possible, en ligne. Comment serait-ce possible?

C'est important parce que je ne veux pas:

  • prendre le risque de stresser les autres disques afin que l'on puisse planter lors de la reconstruction,
  • prendre le risque d'être dans un "état sans parité" donc je n'ai pas de filet de sécurité depuis un certain temps.

Je suppose que le faire en ligne est trop demander et je devrais simplement copier ( dd) les données de l'ancien disque sur le nouveau hors ligne et les remplacer, mais je pense que c'est théoriquement possible ...

Un peu de contexte : ces disques tournent tous de façon presque continue depuis plus de 5,5 ans. Ils fonctionnent toujours parfaitement pour le moment et ils réussissent tous le (long) autotest SMART. Cependant, j'ai des raisons de penser que l'un de ces 4 disques ne durera pas beaucoup plus longtemps (supposé échec prédictif).

Totor
la source

Réponses:

36

Utilisation de mdadm 3.3

Depuis la mdadm3.3 (sortie le 3 septembre 2013), si vous avez un noyau 3.2+ , vous pouvez procéder comme suit:

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

sdd1est le périphérique que vous souhaitez remplacer, sdc1est le périphérique préféré pour le faire et doit être déclaré comme pièce de rechange sur votre baie.

L' --withoption est facultative, si elle n'est pas spécifiée, toute pièce de rechange disponible sera utilisée.

Ancienne version mdadm

Remarque: Vous avez toujours besoin d'un noyau 3.2+ .

Tout d'abord, ajoutez un nouveau disque en tant que disque de rechange (remplacez md0et sdc1par votre périphérique RAID et disque, respectivement):

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

Ensuite, lancez une opération de remplacement de copie comme celle-ci ( sdd1étant le périphérique défaillant):

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

Résultat

Le système copiera tous les blocs lisibles de sdd1à sdc1. S'il s'agit d'un bloc illisible, il le reconstruira à partir de la parité. Une fois l'opération terminée, l'ancien sdc1disque de rechange (ici :) deviendra actif et le disque défaillant sera marqué comme défaillant (F) afin que vous puissiez le retirer.

Remarque: le mérite revient à frostschutz et Ansgar Esztermann qui ont trouvé la solution d'origine (voir la question en double ).

Amandes plus anciennes

D'autres réponses suggèrent:

  • L' approche de Johnny : convertir la baie en RAID6, "remplacer" le disque, puis revenir en RAID5,
  • L' approche de Hauke ​​Laging : retirez brièvement le disque de la matrice RAID5, intégrez-le à un RAID1 (miroir) avec le nouveau disque et rajoutez ce lecteur miroir à la matrice RAID5 (théorique) ...
Totor
la source
2
mdadm --addest encore nécessaire avant de --replacefonctionner. ( mdadm3.3, Ubuntu 15.10). Si vous procédez --addaprès --replace, la copie commencera dès qu'une pièce de rechange sera ajoutée. (L'appareil reste marqué comme "en attente de remplacement").
Peter Cordes
3

Cela peut être possible en répondant aux exigences

  1. en ligne
  2. n'insistez sur aucun disque à l'exception de celui qui doit être remplacé

Mais même si ce qui suit peut fonctionner, vous ne trouverez probablement aucune recommandation de ce genre "dans les livres" ...

Idée:

  1. Retirez le disque OLD de la baie (pendant un court instant): mdadm --manage /dev/raid5 --fail /dev/OLD
  2. Créez un nouveau périphérique md (RAID-1) à partir de disques OLD et NEW: mdadm --build /dev/md42 --level=mirror --raid-devices=2 /dev/OLD /dev/NEW
  3. Remettez le RAID-1 dans la baie (au lieu de / dev / OLD): mdadm --manage /dev/raid5 --re-add /dev/md42

Que devrait :-) se produire:

  1. Le RAID-5 est synchronisé avec / dev / md42. Cela ne devrait pas tarder.
  2. Le RAID-5 est normalement à nouveau opérationnel (mais plus lent).
  3. / dev / NEW est synchronisé avec / dev / OLD.

Regardez la progression de la synchronisation ( cat /proc/mdstatou mdadm --monitor). Si la synchronisation est terminée, retirez le RAID-1 du RAID-5, arrêtez le RAID-1, ajoutez à nouveau / dev / NEW au RAID-5. Si tout va bien, écrasez les superblocs mdraid sur / dev / OLD afin d'éviter les problèmes:mdadm --zero-superblock

Avertissement: la synchronisation rapide RAID-5 peut fonctionner uniquement si vous utilisez un bitmap. Si vous n'en avez pas, faites d'abord un test avec un RAID-5 factice (sans bitmap). Ou ajoutez-en un. Au moins un ajout externe devrait être possible. Sinon, il peut être nécessaire d'arrêter le RAID-5 avant de changer les périphériques. Si vous démarrez à partir du RAID-5, cela deviendrait un peu compliqué, cependant.

Hauke ​​Laging
la source
3

Si cela ne vous dérange pas d'exécuter RAID-6 (2 disques de parité plutôt que 1), et si vous exécutez mdadmin 3.1.x ou supérieur, vous pouvez convertir votre matrice RAID-5 en RAID-6 pour ajouter un disque de parité supplémentaire . Cependant, cela mettra le tableau sous tension pendant la reconstruction. Et cela a des implications en termes de performances car il y a plus de disques de parité à mettre à jour pendant les écritures.

Mais si cela se termine avec succès, vous pouvez garder votre disque défaillant en place et quand il échoue finalement, vous avez toujours une protection de parité pour la baie. Je pense que vous pouvez reconvertir la matrice de RAID6 en RAID5 si vous n'attendez pas pour la conserver en RAID6.

Je ne connais pas de moyen en ligne de conserver la matrice en RAID-5 et de remplacer le disque sans mettre la matrice en mode dégradé, car je pense que vous devez le marquer comme n'ayant pas réussi à le remplacer. Votre idée de copie DD pourrait être le moyen de le faire.

Johnny
la source
@haukelaging FYI c'est désormais possible depuis le noyau 3.2, voir ma réponse .
Totor