linux

Comment migrer un RAID10 mdadm avec 4 disques vers un RAID5 ?

J'ai un RAID10 logiciel basé sur mdadm de Linux sous Debian Buster.À l'origine,je trouvais que le RAID10 avait les meilleures performances.Mais j'ai besoin de plus d'espace et j'accepte d'échanger quelques performances d'écriture contre +50% d'espace.

# chat /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>

Ce stockage est desservi par NFS et,idéalement,le RAID pourrait être transformé sans temps d'arrêt.Oui,j'ai des sauvegardes et une panne ne serait pas critique mais pourquoi ne pas migrer sans interruption si cela fonctionne.

J'ai trouvé un article de 2012 décrivant le processus. Les commandes se sont avérées tout à fait correctes. À l'époque, l'auteur avait des problèmes selon lesquels l' utilitaire mdadm (ou probablement le pilote du noyau) bloquait immédiatement le système avec la première commande. Ce problème semble avoir été résolu depuis.

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

Il n'y a pas de chemin direct de RAID10→RAID5 dans mdadm.Au lieu de cela,vous devez d'abord le dégrader en RAID0 :

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

Cela a été instantanément efficace et a fait échouer 2 appareils et les a retirés de la baie. Malheureusement, le niveau RAID n'a pas été défini sur RAID0. dmesg a montré:

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

J'ai trouvé que le problème était que sysfs signalait que le tableau n'était pas dégradé alors qu'il l'était en réalité et que mdadm et cat /proc/mdstat s'affichaient correctement :

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

Je n'ai pas trouvé d'autre solution que d'arrêter le serveur NFS,de démonter le système de fichiers,de fermer le périphérique LUKS,d'arrêter la matrice RAID,de réassembler la matrice RAID et de redémarrer tous les services.Après cela,il a été correctement signalé comme dégradé et a pu être transformé en RAID0.

Ensuite,je pourrais le faire passer à 4 périphériques avec RAID5 :

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

Contrairement à jamais cat /proc/mdstat n'a pas montré de "reconstruction" en cours mais un "remodelage". Cela a pris un certain temps (environ 10 heures) et le système a répondu beaucoup plus lentement que lors des reconstructions RAID10. Je l'ai laissé seul pour le temps de la reconstruction.

Depuis que le remodelage est terminé,le RAID5 est propre et la vitesse est bonne.J'ai probablement fait des erreurs lors de la mesure,mais la vitesse de lecture est maintenant plus rapide que ce que j'ai enregistré auparavant et la vitesse d'écriture est également acceptable pour moi.

# chat /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>

(avertissement : toute l'histoire a été écrite lorsque la migration était déjà terminée. J'ai essayé avec soin de décrire les commandes et les messages d'erreur réels, mais il peut y avoir des erreurs mineures. Le processus global a fonctionné comme décrit.)




Pas (encore) testé (ne faites pas confiance aux données importantes pour les étapes ci-dessous) mais voici une idée pour tout scénario où l'espace utilisable est augmenté et mdadm --grow dit "Disposition RAID10 trop complexe pour l'opération Grow":

  1. Arrêtez le md
  2. Sauvegarde des premiers MiB de chaque partition du md (en supposant que les superblocs RAID sont près du début de chaque partition).
  3. Nettoyer les super-blocs
  4. Créez un RAID5 (ou un autre RAID) avec --assume-clean en utilisant les partitions
  5. Créez des instantanés de chaque partition du md, par exemple suivez https://gist.github.com/jowagner/b36024636140ddf453c12eaf6e590b5d
  6. Restaurer la sauvegarde des partitions de l'étape 2 en snapshots des partitions
  7. Assembler le RAID10 à partir des snapshots
  8. dd toutes les données du RAID10 au RAID5. L'utilisation du multiple le moins courant des 2 tailles de bande est probablement la meilleure pour les performances, mais n'importe quelle taille de bloc devrait suffire. Les premières lectures ne seront pas corrompues par les écritures car elles proviennent de données de copie sur écriture écrites à l'étape 5. Les lectures restantes ne seront pas corrompues car elles sont en avance avec une distance de sécurité par rapport aux écritures sur chaque partition (d'où le limitation de cette idée à des scénarios où l'espace utilisable est augmenté).
  9. Arrêtez le RAID10
  10. Jeter les instantanés

Cela suppose qu'un instantané ne redirige que les écritures sur les instantanés vers un dispositif COW et que les écritures sur le dispositif d'origine ne déclenchent pas une copie des anciennes données à stocker dans le dispositif COW (sinon la solution ne serait pas pratique car trop d'espace supplémentaire est nécessaire).

De plus,si les superblocs de l'ancien RAID se trouvent vers la fin de chaque partition,ces données doivent également être sauvegardées avant l'étape 3.Calculez une position appropriée à rechercher et la quantité de données.J'utiliserais quelques lignes de Python mais il existe probablement un outil en ligne de commande qui peut le faire.