Table des matières
1. Présentation
RAID est l'acronyme de Redundant Array of Inexpensive Disks: il s'agit d'un mécanisme qui permet de combiner des disques physiques pour créer un volume logique global qui aura des propriétés de capacité et de redondance variables selon la configuration choisie.
A la différence de LVM, le RAID consiste à se concentrer sur l'utilisation et l'association précise des disques physiques, et de permettre explicitement
- de la redondance d'information pour une tolérance au panne accrue
- de la distribution d'information pour une bande passante totale accrue
“MD”, le RAID logiciel de Linux est un module disponible de longue date dans le noyau Linux. Les contrôleurs RAID “matériels” ont traditionnellement été réservés à des système des grande taille et honéreux. Même si cela se démocratise aujourd'hui, il existe toujours de nombreux avantages concernant la solution logicielle.
La configuration du RAID est comparable à LVM, et est même souvent effectuée en même temps que celle de LVM, les deux composants étants traditionnellements complémentaires sur les gros systèmes de stockage. Elle consiste à désigner des éléments de stockage physiques (disques durs entiers ou partitions) et de les combiner pour créer un “Volume logique RAID” qui se comporte alors comme un block device standard.
Note: on peut “imbriquer” les volumes RAID et LVM les uns dans les autres (en anglais: nested RAID), puisqu'ils combinent des block devices pour en créer des nouveaux.
2. Les niveaux de RAID
Il existe de nombreux “niveaux de RAID”, mais en pratique ce sont les niveaux 0, 1 et 5 - et récemment 6 - qui sont de loin les plus utilisés. Il existe également des mécanismes propriétaires ou officieux (comme JBOD).
Niveau | Redondance | Capacité utile pour N disques | Disques min. |
RAID 0 | non | N | 2 |
RAID 1 | oui | N / 2 | 2 |
RAID 0+1 | oui | N / 2 | 4 |
RAID 5 | oui | N - 1 | 3 |
RAID 6 | oui | N - 2 | 4 |
RAID 0 (Striped)
Le RAID 0 consiste à distribuer l'information sur N disques, en général de façon équitable. La capacité de stockage du volume RAID ainsi consituté est donc la somme des disques disponibles. La distribution est définie par une unité (la taille de la bande / stripe): lors d'une écriture séquentielle de données, chaque quantité égale à une bande est écrite sur un volume distinct, en effectuant une simple rotation entre les volumes.
Cette configuration est utilisée quand les limites de performance de stockage viennent du disque dur, du bus (ex: nappe IDE, SCSI) ou même du contrôleur: la bande passante apparente est en effet la somme des bandes passantes des disques ainsi assemblés.
C'est le seul niveau RAID sans redondance, et qui peut être également implémenté par LVM. Il est souvent utilisé avec le RAID 1 en pratique.
RAID 1 (Mirrored)
Le RAID 1 maintient une simple copie d'un disque sur un autre. A tout moment, les disques sont donc identiques. Cela implique que chaque écriture logique de donnée produit une double écriture physique, il convient donc de s'assurer que les disques d'un mirroir sont sur un bus ou un contrôleur distinct, sous peine de voir les performances se dégrader.
C'est la configuration la plus simple pour obtenir de la redondance. Si un disque tombe en panne, le système peut continuer normalement sur un seul disque. Il n'y a de plus aucun effort particulier de calcul de la part du processeur, donc le coût de cette fonctionnalité est marginal à ce niveau.
Etant donné les prix minimes des disques durs aujourd'hui et la facilité technique, il est considéré impardonnable de ne pas équiper un serveur d'au moins 2 disques en RAID 1.
RAID 0+1
Si on veut à la fois les avantages du RAID 0 (bande passante accrue) et du RAID 1 (redondance), on peut combiner les deux niveaux de RAID en les imbriquant. Ce système est en général utilisé pour des besoins de performance importants et garantis (contrôleurs distincts et indépendants), sans renoncer à la sécurité de la redondance. C'est typiquement le cas des bases de données.
On peut imbriquer les niveaux dans les deux sens:
- RAID “01”: un mirroir de bandes, c'est à dire qu'on distribue les données avant de les redonder (tolérance à la panne partielle)
- RAID “10”: des bandes de mirroirs, on distribue les données sur des paires de disques en mirroir (le plus souhaitable)
RAID 5
Le niveau RAID 5 généralise une idée introduite dans les niveaux 3 et 4 (ces derniers étant en pratique très rarement utilisés): sur un jeu de N disques, on peut tolérer la panne d'un disque si on possède assez d'information pour le reconstruire.
Ceci se fait en stockant dans un disque supplémentaire une information redondante intermédiaire qu'on appelle parité ou checksum. Elle est calculée à l'aide des informations de tous les disques: si un disque tombe en panne, il y a assez d'informations dans les N-1 disques restant et dans le disque de parité. Dans le cas du RAID 5, l'information de parité n'est pas sur un disque spécifique, mais distribué sur l'ensemble des disques disponibles, tous commes les données selon un mécanisme de striping similaire au RAID 0.
C'est la solution la plus efficace et la plus économique pour obtenir sur un grand nombre de disques à la fois:
- la concaténation des volumes des disques
- une tolérance à la panne (perte d'un disque)
- une augmentation de la bande passante
RAID 6
Le RAID 6 à été introduit récemment (il s'agit encore d'un terme assez “marketing”), et propose de distribuer l'information de parité en double: la capacité de stockage effective devient alors de N-2 disques, mais on peut tolérer la panne simultanée de 2 disques.
Ceci peut pallier plusieurs sortes de problèmes inhérent au RAID 5:
- lors de la panne d'un disque, puis de la réinsertion d'un nouveau, il y a une phase de reconstruction (pour resynchroniser le disque avec ses confrères). Souvent cette phase peut déclencher une autre panne, fatale celle-là
- une panne disque en annonce souvent une autre: les disques intiaux étant achetés en même temps, ayant le même MTBF et la même sollicitation, il est probable qu'ils tombent en panne vers la même période; ou bien la panne est dûe à une cause extérieure (panne de climatisation), et les disques vont tomber en masse.
Note: le RAID 6 demande l'écriture de deux informations de parité pour une information utile, il implique dont une pénalité en taux d'écriture.
3. Configuration RAID avec Linux
Configuration
Traditionnellement, la configuration du RAID se trouver dans un fichier ad hoc (/etc/mdadm/mdadm.conf), mais cela créait le fameux problème de l'oeuf et de la poule: et si ce fichier est sur le volume RAID ? Désormais, le mécanisme standard consiste donc à “construire” ses volumes RAID avec la commande mdadm, et cette dernière va se charger d'enregistrer les informations de configuration directement dans les éléments (partitions) qui constituent le volume RAID.
L'autre avantage de cette dernière approche est l'assemblage automatique des volumes RAID lors du démarrage du noyau: celui-ci est capable de reconnaître des partitions spécialement marquées “RAID autodetect”, de lire la configuration, et de démarrer les volumes RAID qui conviennent. Pour les experts, cela veut dire qu'on peut se passer du mécanimse initrd.
Partitions
Bien qu'il soit possible d'utiliser des disques entiers pour du RAID, il est recommandé d'utiliser des partitions, ce qui permet notamment d'utiliser le type “RAID autodetect” (FD).
Souvent on a besoin de partitionner beaucoup de disques de manière identique (ou juste une paire dans le cas du RAID1). On peut effectuer un partitionnement classique sur le premier disque et facilement le répéter sur les autres disques de manière automatique ainsi :
sfdisk -d /dev/sda | sfdisdk /dev/sdb
Construction
Il nous faut d'abord nommer notre volume RAID: sous Linux, il s'agit de périphériques de la forme /dev/mdX où X est numéro commençant traditionnement à partir de 0. Ensuite il faut choisir les partitions qui vont participer au volume RAID, en incluant les hot-spares (voir plus loin).
La construction et l'activation d'un volume RAID est immédiat. Par exemple pour un simple mirroir :
mdadm --create /dev/md0 --level=1 --raid-devices=2 --run /dev/sda1 /dev/sdb1
Ou pour un RAID5 plus “massif” :
mdadm --create /dev/md0 --level=5 --raid-devices=11 --spare-devices=1 --run /dev/sd[a-l]1
Une fois qu'un volume RAID est créé, il va commencer immédiatement sa “reconstruction”: les disques qui doivent être identiques sont synchronisés, et les blocs de parité éventuels sont calculés et enregistrés. Cette reconstruction peut être longue: pendant ce temps, le volume RAID est tout à fait utilisable, mais dans les cas des RAID non-0, il n'est pas encore tolérant aux pannes.
On peut surveiller l'état des volumes RAID en scrutant /proc/mdstat :
cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] read_ahead 1024 sectors md0 : active raid1 sdb1[1] sda1[0]
1951744 blocks [2/2] [UU] [=============>.......] recovery = 66.1% (23462/1951744) finish=22.5min speed=4002K/sec
Utilisation
Le volume RAID est un bloc device, on peut donc y déposer un système de fichier et le monter :
mke2fs /dev/md0
/dev/md0 /mnt/myraid
Note: si le système de fichier va service à la racine du système, il faudra bien faire attention à ce que l'autodétection RAID soit possible (type des partitions, mécanisme compilé dans le noyau, disques tous détectés au boot, etc). Il est en général impossible ou très difficile de booter sur un volume autre que RAID1.
Monitoring
Un système RAID avec redondance ne signifie pas que les pannes vont être gérées pour vous, cela signifie seulement que vous aurez le temps de réagir pour réparer la panne. Mais il faut réagir ! Un moyen simple et efficace et d'utiliser le mode “démon” de l'outil mdadm qui vous préviendra par mail dès qu'une faute est détectée dans un volume RAID.
Il est bien entendu conseillé d'ajouter une surveillance active externe (SNMP, etc) si possible.
Ajout, supression
Même si vous avez des disques hot-plug, il vous faut dialoguer avec Linux pour reconfigurer vos volumes RAID et réfléter les modifications matérielles. Il est très simple de désactiver ou réactiver un disque avec la commande mdadm. Vous devrez en général gérer deux situations :
- Réparation d'un disque: il a été automatiquement désactivé pour vous lors de la détection de la panne, il suffit de le réactiver quand vous l'avez remplacé
- Ajout d'un disque (hotspare ou expansion)
Il n'est pas toujours possible de supprimer ou rajouter des disques dans un volume: soit parce que ça n'est pas logiquement réalisable, soit parce que ça n'est pas implémenté.
Note: par exemple, agrandir un volume RAID5 en rajoutant des disques n'est possible que depuis Linux 2.6.17 (http://scotgate.org/?p=107).
Hot spares
Pour qu'un système RAID redondant soit vraiment fiable, il faut avoir des disques de secours (spare) sous la main. On les laisse en général à côté du serveur. On peut faire mieux, si le serveur est suffisamment spacieux: on peut installer les disques de hot spare, de telle sorte que mdadm pourra les utiliser automatiquement en cas de panne.
Ceci permet de diminuer la fenêtre de vulnérabilité de votre système en réduisant le temps d'intervention (n'oubliez pas qu'il faut toujours compter au moins le temps de reconstruction).
Backup
Un système RAID n'est pas un système incassable: c'est juste un système à tolérance de panne, et avec une tolérance souvent assez basse par rapport aux standards industriels dans d'autres domaines.
Il est donc indispensable de continuer à associer un système de stockage RAID avec un système de backup ! Ceci étant une problématique fort délicate, car il est aujourd'hui simple et peu cher de réaliser des stockage de plusieurs téra-octets, mais complexe et honéreux de les sauvegarder (sur bande principalement).
4. RAID hard vs. soft
Il existe des solutions dites “RAID hard” qui comprennent un contrôleur de disque, et un système dédié pour assurer les fonctions RAID. Elles se présentent comme un disque standard du point de vue du système d'exploitation. Quels sont les intérêts et avantages d'une telle solution par rapport au RAID logiciel (de Linux par exemple) ?
Le mythe du XOR
L'argument marketing numéro 1 des vendeurs de contrôleurs RAID hard est le “XOR engine”, cette puce magique capable de calculer les parités des RAID 3/4/5/6 “très” rapidement et de ne pas charger le processeur principal. Il se trouve que ce calcul est trivial et les processeurs et leur bus local largement surdimensionnés par rapport aux taux de transfert des meilleurs disques aujourd'hui.
Voici les performance mesurées par Linux lui-même sur un modeste Intel CoreDuo 1.86Ghz :
kernel: raid5: measuring checksumming speed kernel: 8regs : 3427.600 MB/sec kernel: 32regs : 2137.200 MB/sec kernel: pIII_sse : 6431.600 MB/sec kernel: pII_mmx : 4278.000 MB/sec kernel: p5_mmx : 4273.200 MB/sec kernel: raid5: using function: pIII_sse (6431.600 MB/sec)
Un excellent disque vous permettra d'écrire à une vitesse entre 60 et 80 MB/sec. Si vous avez près de 100 disques, ce n'était peut être pas le bon serveur pour un tel volume !
Le bus “local” (PCI, PCI-Express, etc.) et la mémoire sont rarement un obstacle de plus, à moins que votre machine serve simultanément de serveur de calcul: ce serait une curieuse idée sur un système de stockage.
La portabilité
Les solutions RAID hard utilisent souvent des mécanismes similaires à Linux, en stockant leur configuration sur les disques. Mais dans leur propre format, vous liant ainsi à un fournisseur de contrôleur particulier. Vous ne pourrez pas migrer votre volume RAID en changeant de contrôleur. Question: avez-vous un contrôleur de spare ?
Note: Linux est capable dans une certaine mesure d'importer les configurations RAIDs de certains contrôleurs propriétaires.
La souplesse
Un contrôleur HARD n'a pas accès à votre système d'exploitation directement. Comment va-t-il faire remonter les alertes ? Comment allez-vous le monitorer ? Comment allez-vous le configurer sans repasser par le BIOS ? Comment allez-vous le mettre à jour ?
Chaque contrôleur à sa propre solution: l'hétérogénéité des solutions et les interfaces souvent hasardeuses proposées encouragent à faire des erreurs ou au pire à perdre du temps.