Créer un RAID logiciel


Le Redundant Array of Independent Disks est une technique pour répartir les données sur plusieurs disques dans le but d'optimiser les taux de réponses et/ou d'assurer de la redondance.

RAID 1

On part du principe que nous avons deux disques qui ont chacun une partition de taille strictement identique (sdb1 et sdd1) dont-elles seront utilisées pour le RAID de type miroir. Techniquement, les données seront réparties sur les deux partitions. Ce qui a pour effet d'améliorer le temps de lecture au détriment d'une écriture un peu plus lente que la normale.

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1

Une fois la “nape” md0 a été créée, il reste plus qu'a la formater avec le système de fichier que l'on veut et la monter dans notre système :

mkfs.ext4 /dev/md0
mount /dev/md0 /mnt

Pour que ce montage soit toujours présent après un reboot :

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
echo "/dev/md0 /mnt/       ext4    noatime,rw      0       0" >> /etc/fstab

La mise en place des autres RAID (0,5,6 et 10), le procédé est pratiquement le même.

Cas spéciaux

Admettons que nous souhaitons ajouter encore 1 disque, soit un total de 3 disques dans le raid 1. On devra faire dans ce cas :

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

Puis agrandir la grappe :

mdadm --grow /dev/md0 --raid-devices=3

RAID 5

Admettons que nous ayons besoin d'une grande quantité de stockage avec la possibilités d'avoir un disque de rechange en cas de panne d'un des disques. En d'autres termes, nous avons besoin de 4 disques dont 3 qui seront en fonction et 1 en arrêt le temps qu'un des disques actifs tombe en panne.

On devra donc lancer cette commande :

mdadm --create /dev/md5 --level=5 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1

Admettons que nous avons le disque /dev/sdb1 qui tombe en panne. On peut le changer de cette manière :

mdadm --manage /dev/md5 --set-faulty /dev/sdb1
mdadm --manage /dev/md5 --remove /dev/sdb1
mdadm --manage /dev/md5 --add /dev/sdb1

Changer un disque défectueux

Reprenons l'exemple avec le RAID 1 car j'ai eu un cas réel lorsque j'ai exécuté la commande suivante :

mdadm --detail /dev/md0

On obtient ce genre de message :

On peut s'apercevoir que la partition sdd1 est hors fonctionnement vu qu'elle est en état “removed”. Faire les procédures suivantes pour le remplacer par un nouveau :

mdadm /dev/md0 --fail /dev/sdd1
mdadm /dev/md0 --remove /dev/sdd1

Arrêt de la machine pour changer physiquement le disque :

poweroff

Après le redémarrage de la machine on copie les partitions d'un disque déjà présent dans le raid :

sfdisk -d /dev/sdb | sfdisk /dev/sdd

On joint la nouvelle partition au raid :

mdadm /dev/md0 --add /dev/sdd1

Il est possible de voir l'avancement de la synchronisation avec cette commande :

watch "cat /proc/mdstat"

Si rien ne se passe d'ici quelques petites minutes, c'est qu'il faut lancer manuellement la synchronisation :

mdadm --action=repair /dev/md0

Ou au pire :

mdadm --grow --raid-devices=2 /dev/md0

Changer deux disques défectueux

Admettons que l'on est dans la situation d'avoir 3 disque dont un disque est valide avec un qui a lâché depuis plus d'une semaine et le dernier quelques heures avant le remplacement des disques. L'idéal, est de cloner physiquement ces disques pour réduire le taux de corruptions de données.

Reconnaitre les disques défectueux

La commande suivante va permettre de connaitre :

  • l'“Array UUID” qui est l'identifiant reliant le dique à la grappe raide
  • l'“Events” qui permet de savoir combien de retard il a par rapport aux autres
  • l'“Update Time” qui indique le dernier moment où le disque a été actif
  • l'“Layout” qui indique comment sont positionné les bits de parités
  • l'“Raid Devices” qui correspond à sa position dans la grappe
  • l'“Raid Level” qui info le type de RAID
  • l'“Array State” qui permet de connaitre la position du disque avant l'incident
mdadm --eamine /dev/sd*1

On peut ainsi voir quel est le disque qui s'est arrêté en premier et ainsi dessuite.

Grâce au positionnement des disques au boot (sda, sdb, sdc), la commande suivante permet de connaitre les disques défaillants :

hdparm -I /dev/sd*1

Ces infos sont importantes :

  • Serial Number pour le numéro de série qui doit etre affiché physiquement sur le disque
  • Model Number qui permet de commander un disque aux caractéristiques similères sur les internets

Rassembler la grappe

Executer cette commande suite au remplacement des disques :

mdadm --assemble --force --freeze-reshape --verbose  /dev/md5 /dev/sdb1 /dev/sdc1 /dev/sdd1

Il se peut que mdadm expulse le disque marqué comme défaillant et théoriquement, la grappe est accéssible via un point de montage pour récupérer les données. L'option `–freeze-reshape` permet d'indiquer que l'on veut seulement rassembler les block sans reconstruire ce qui manque.

On pourra ensuite rajouter le disque défaillant ainsi :

mdadm /dev/md5 --add /dev/sdd1

La reconstruction devrait être reprise imédiatement et durer plusieurs heures.

D'autres commandes

  • Supprimer un disque physiquement absent
 mdadm /dev/md0 -r detached
  • Éradiquer un raid

D'abord nous le démontons :

  umount /raid1

Puis nous l'arrêtons :

  mdadm --stop /dev/md0

Pour au final supprimer les métas-données présent sur les disques qui été rattacher au raid :

  mdadm --zero-superblock /dev/sdb
  mdadm --zero-superblock /dev/sdd
  • Scanner / réactiver le RAID
 mdadm --examine --scan
  • benchmark
hdparm -tT /dev/mdX
  • Migrer des données d'un RAID à un autre :
mdadm -A /dev/md1 --update=super-minor -m0 /dev/sdf1 /dev/sdg1
  • Stopper la syncrhonisation directement dans l'environnement kernel :
echo "frozen" > /sys/block/mdX/md/sync_action
  • Définir la vitesse de synchronisation des disques (200 000 par défaut) :
echo 0 > /proc/sys/dev/raid/speed_limit_max
  • Détruire un raid
mdadm --stop /dev/md1
mdadm --remove /dev/md1
mdadm --zero-superblock /dev/sdf1 /dev/sde1