Migration raid5

De Wiki LDN
Sauter à la navigation Sauter à la recherche


Contexte

Notre machine est actuellement équipée de 3 disques d'1,5To configurés en RAID5 avec 2 partitions :

  • 1 /boot
  • 1 LVM

Ces disques étant un peu trop lents (faible nombre d'E/S par seconde), l'objectif est de migrer les données de ces 3 nouveaux disques d'1To, toujours en RAID5, mais nettement plus performants.

Nous avons 2 contraintes :

  • la migration doit pouvoir être réalisée "en ligne", tout en maintenant actif les services (seront moins performants pendant la manip', mais pas arrêtés)
  • le serveur ne dispose que de 4 emplacements sata

D'autre part, le /boot n'étant pas pour l'instant dans le LVM, il faudra aussi le déplacer pour l'intégrer dans l'unique array RAID.

Ainsi, le principe sera donc de :

  • passer le raid5 (3 disques) en mode dégradé sur 2 disques
  • ajouter 2 nouveaux disques et les configurer en raid5 dégradé (1 disque manquant)
  • configurer le LVM sur le 2ème raid
  • migrer les données LVM vers le nouveau raid5
  • recopier le contenu du /boot (qui n'était pas dans lvm) dans le /boot du lvm (utilisation de l'option bind, merci Stéphane ;-))
  • réinstaller grub
  • enlever les anciens disques et ajouter le 3ème nouveau puis terminer la reconstruction du raid

Lors du 1er lab, nous avions eu un problème pas tout à fait clairement identifié (pb hot-plug sata ? pb grub ?) qui avait rendu le raid inconsistant et non réparable.

Nous sommes donc reparti de zéro et n'avons pas utilisé de hot-plug => arrêt du pc pour changer les disques.

Les étapes 1 à 5 se sont bien passées. Cependant, nous avons rencontré un problème lors de la réinstallation du grub :

error: unknown LVM metadata header.

Nous pensions que cela n'était pas bloquant, étant donné une erreur similaire lors de l'installation de base, et le dernier message :

Installation finished. No error reported.

Cependant, au redémarrage, la machine restait bloquée sur un busybox (et le clavier n'était pas fonctionnel : bug acpi ? ).

Après quelques recherches et redémarrages en live-usb, nous nous sommes rendu compte que la configuration du raid n'était pas enregistrée dans le fichier de conf /etc/mdadm/mdadm.conf et que grub ne pouvait donc pas générer le nécessaire pour booter. A priori, l'initrd était incomplet (absence du pilote lvm qui n'était pas nécessaire pour l'ancien /boot ?) donc nous l'avons régénéré avec un update-initramfs.

Enfin, il a fallu utiliser l'option "--recheck" lors du 1er grub-install afin que celui-ci mette à jour sa "device map". Ce n'est plus nécessaire par la suite.

Avec ces modifications, l'update-grub fonctionne sans aucune erreur/warning.

Tout le reste s'est très bien passé, ce fut l'occasion de tester les nouveaux disques durs qui s'avèrent performants d'après les premiers tests ; à confirmer avec des accès concurrentiels.

Achat des disques

Raid5

On a acheté chaque disque sur un site différent pour tenter (c'est réussi) d'avoir des séries différentes et donc moins de chance d'avoir les trois qui lâchent en même temps en cas de défaillance :

Disque 2To (spare raid + tdcpb)

Note.png

Un petit compte-rendu a été posté sur : https://lists.ffdn.org/wws/arc/grandest/2014-06/msg00027.html

Matériel à prévoir

  • un tournevis
  • vis
  • nappes SATA
  • noter les numéros des disques durs
  • tester les secteurs des 3 disques actuels avant d'y aller (soit avec dd soit avec /usr/share/mdadm/checkarray /dev/mdX)
  • tester les 4 nouveaux disques en écriture avec la commande dd

Synthèse des commandes

Phase préliminaire (dégradation de la grappe)

On commence par afficher l'état de nos grappes RAID

Terminal.png srv:
cat /proc/mdstat

Les 2 grappes raid5 (boot et root) actuelles s'étendent sur les disques sda, sdb et sdc, On retire le disque sdc de la grappe (il y a la partition boot et la partition root)

Terminal.png srv:
mdadm /dev/md0 --set-faulty /dev/sdc1

mdadm /dev/md1 --set-faulty /dev/sdc2

mdadm /dev/md0 --remove /dev/sdc1

mdadm /dev/md1 --remove /dev/sdc2

On liste les numéros de série des HDDs et on repère celui qui correspond au faulty

Terminal.png srv:
ls -alh /dev/disk/by-id/

Puis on arrête la machine

Terminal.png srv:
halt

On retire le disque dur sdc de la machine (apres l'avoir identifie), et on ajoute 2 des disques neufs à la machine

Préparation de la nouvelle grappe

On partitionne les deux disques neufs et on cree une nouvelle grappe raid5

Terminal.png srv:
fdisk /dev/sdc
Command (m for help): o
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-1953525167, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1953525167, default 1953525167): 
Using default value 1953525167
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Command (m for help): p
/dev/sdc1            2048  1953525167   976761560   fd  Linux raid autodetect
Command (m for help): w

Cette commande créer donc une partition de type raid sur l'intégralitée du disque

Terminal.png srv:
fdisk /dev/sdd

Même opération que pour le disque sdc

On crée maintenant une grappe RAID sur les deux nouveau disques (en mode dégradé car nous disposont que de 4 emplacements sata)

Terminal.png srv:
mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 missing

Vérification

Terminal.png srv:
cat /proc/mdstat

La nouvelle grappe apparaît sous le nom de md2

Terminal.png srv:
mdadm --readwrite /dev/md2

Migration des données

On transforme le nouveau raid en PV, on l'integre au VG de l'ancien raid et on déplace tout sur le nouveau raid

Terminal.png srv:
pvcreate /dev/md2

Intégration du pv dans le vg existant

Terminal.png srv:
vgextend services /dev/md2

Et migration des données \o/

Terminal.png srv:
pvmove /dev/md1

La commande est bien longue, mais affiche sa progression au fur et à mesure

On enlève md1 du vg

Terminal.png srv:
vgreduce services /dev/md1

Et on supprime le pv dessus

Terminal.png srv:
pvremove /dev/md1

Intégration du /boot

On ne souhaite pas de nouveau separer boot sur le nouveau raid donc on copie juste les fichiers

Terminal.png srv:
mount --bind / /mnt

cp -a /boot/* /mnt/boot/

rmdir /mnt/boot/lost+found

umount /boot /mnt

Et on oublie pas d'éditer le fichier fstab (pour retirer le montage de la partition boot)

Terminal.png srv:
vim /etc/fstab

Ménage

On stoppe les anciens raid5 boot et root et on met à jour la conf mdadm

Terminal.png srv:
mdadm --stop /dev/md0 mdadm --stop /dev/md1

Et on modifie le fichier de conf mdadm

Terminal.png srv:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Il faut remonter la dernière ligne ARRAY (md2) de /etc/mdadm/mdadm.conf à la place des deux anciens ARRAY (md0 et md1)

On régénère l'initrd (pour ajouter lvm) si on était en targeted avant

Terminal.png srv:
update-initramfs -u -k $(uname -r)

On install grub sur les deux nouveaux disques

Terminal.png srv:
grub-install /dev/sdc --recheck

grub-install /dev/sdd

update-grub

On peux maintenant arrêter la machine et enlever les deux anciens disques

Finitions

On partitionne le nouveau disque, on l'ajoute au seul raid restant et on installe grub dessus

Terminal.png srv:
fdisk /dev/sda

Idem sdc du début (partitionnement)

On intègre ce disque dans la grappe (qui ne sera plus en mode dégradé)

Terminal.png srv:
mdadm /dev/md2 --add /dev/sda1

Et on peux prendre un café/bière devant la reconstruction

Terminal.png srv:
watch -d cat /proc/mdstat

Il ne reste plus qu'a installer grub sur tous les disques

Terminal.png srv:
grub-install /dev/sda

Et insérer le disque de spare (Pour le disque de 2T (1 partition 1T spare + 1T pour TDCPB))

Terminal.png srv:
fdisk /dev/sdb

Une partition de 1T (vérifier le nombre d'octets par rapport aux WD) de type raid + Une partition du reste de type Linux

Terminal.png srv:
mdadm /dev/md2 --add /dev/sdb1

Benchs sur les disques velocirators en raid5

Lecture

Terminal.png srv:
dd bs=2M if=/dev/md2 | pv -pterb -s 1000000000 | dd bs=2M of=/dev/null
0+16080 records inMB/s] [===================================================================================] 188%
0+16080 records out
2107637760 bytes (2.1 GB) copied, 8.95594 s, 235 MB/s

Écriture

Terminal.png srv:
dd bs=2M if=/dev/zero | pv -pterb -s 1000000000 | dd bs=2M of=/tmp/ploop
1.79GB 0:00:13 [ 133MB/s] [===================================================================================] 192%
0+14676 records in
0+14675 records out
1923497984 bytes (1.9 GB) copied, 13.828 s, 139 MB/s