RAID
Raid logiciel sous Linux
Introduction
Le principe du [#RAID RAID] repose sur l'idée de combiner plusieurs disques durs bon marché (indifférement IDE ou SCSI) dans le but de :
- Etendre la capacité de stockage en ligne possible ;
- Introduire une notion de redondance (pour autoriser une plus grande sécurisation des données) ;
- Améliorer les performances.
En effet, la capacité des disques actuels, même si elle s'est singulièrement améliorée ces dernières années (on trouve couramment du 18 ou du 36 Gigas de nos jours), reste tout de même peu de chose lorsque l'on souhaite parler en Téra et non plus en Giga.
Même sans aller jusqu'à vouloir stocker de grandes quantité de données (soyons raisonnable, 9 Giga devrait suffire pour un petit serveur web ...), on peut vouloir utiliser la notion de redondance du Raid afin d'améliorer la tolérance aux pannes de son architecture : les données seront dupliquées sur des disques différents afin de pouvoir palier à la perte d'un disque.
Si la résistance aux pannes de l'architecture n'est pas une contrainte majeure (on peut envisager de sauvegarder sur bande tous les soirs son serveur de fichiers), on peut utiliser le Raid pour étendre simplement la capacité de stockage possible, et ce de manière transparente pour le système : 4 disques de 4,3Go donnant une partition utile de ~16Go.
On peut vouloir aussi gagner en performance sur les I/O disques : en effet, lire ou écrire sur de multiples disques permet de paralléliser les opérations (surtout sur des bus différents) et donc de gagner en performances.
En fait, il ne faut d'ailleurs pas parler d'un seul Raid, mais bien de plusieurs : [#lineaire Mode Linéaire], [#raid0 Raid 0], [#raid1 Raid 1], [#raid01 Raid 0+1], [#raid4 Raid 4] ou encore [#raid5 Raid 5]. Il conviendra donc d'analyser à l'avance ses besoins pour faire le bon choix.
Je n'aborderais que le Raid logiciel dans ce document et non le Raid hardware. Le premier est supporté directement dans le code de l'OS alors que l'intelligence du second est déportée dans du hardware : que ce soit sous forme d'une carte à enficher dans le serveur (nécessite un driver) ou encore dans une baie extérieure (transparent pour l'OS). On peut dire que le Raid logiciel est moins performant, moins tolérant mais beaucoup plus accessible financièrement.
Nota : Dans presque tous les RAIDS que l'on va aborder (excepté le RAID linéaire et le raid 0), il sera possible de configurer des disques de rechange (disques de spare) qui seront automatiquement utilisés pour reconstruire le RAID dans le cas de pannes disques (pas dans le cas de pannes sur le controleur IDE ou SCSI).
Le Raid et Linux
Le mieux est de directement utiliser le support RAID présent dans les distributions Linux récentes (version des RaidTools : 0.90) : j'ai personnellement testé la distribution Linux RedHat 6.1 sur plateforme Alpha et la Mandrake 7.2 Intel sans rencontrer de soucis majeurs.
Vérifiez que les modules linear, raid0, raid1 et raid5 sont chargés. Au pire, ajoutez les dans le fichier /etc/modules :
# modprobe linear
- modprobe raid0
- modprobe raid1
modprobe raid5
On valide ensuite l'existence du fichier virtuel /proc/mdstat (Par défaut, le noyau est compilé avec le support du RAID) et on vérifie l'installation du package raidtools (format rpm sur la RedHat et la Mandrake) :
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] /* liste des drivers */
read_ahead not set
unused devices: <none>
- rpm -qa | grep raid
raidtools-0.90-8mdk
Le seule fichier que l'on aura à configurer pour tous les RAIDS sera le fichier /etc/raidtab (simple, non?) et le fichier /etc/fstab.
Si vous ne disposez pas de plusieurs disques vous pouvez utiliser des partitions à la place. Cela ne vous apportera ni amélioration de performance, ni haute disponibilité, mais au moins une grande satisfaction de pouvoir mettre en pratique vos connaissances ;-)
Niveaux de RAID disponibles sous Linux
Mode Linéaire [ [#linear_exemple exemple] ]
Cette solution est pertinente lorsque l'on souhaite étendre la capacité de stockage disponible en ligne sans introduire une notion de tolérance aux pannes. Cette solution combine les capacités de stockage d'un ensemble de disques existants (les données sont d'abord écrites sur le premier disque, puis lorsqu'il est plein sur le second, etc...) et permet d'utiliser 100% de l'espace disque utile.
- Avantages :
- Permet de disposer de 100% de l'espace disque dans une partition ;
- Moins de temps CPU mobilisé par le RAID dans le noyau. - Inconvénients :
- Pas de haute disponibilité : la perte d'un disque entraine la perte des données ;
- Quasiment pas d'amélioration des performances (on peut cependant obtenir une amélioration si des I/O se produisent de manières concurrentes sur des disques différents).
RAID 0 [ [#raid0_exemple exemple] ]
Cette méthode (striping) est souvent utilisée lorsque la haute disponibilité des données n'est pas nécessaire (on doit disposer d'au moins 2 disques). Elle permet d'obtenir une amélioration des performances I/O (lecture et écriture) tout en restant trés proche du mode linéaire. Elle permet en effet d'améliorer l'algorithme en dispatchant les données sur l'ensemble des disques (les données sont découpées puis dispersées sur les disques sans redondance).
- Avantages :
- Permet de disposer de 100% de l'espace disque dans une partition ;
- Amélioration des performances I/O en lecture et écriture. - Inconvénients :
- Pas de haute disponibilité : la perte d'un disque entraine la perte des données.
RAID 1 [ [#raid1_exemple exemple] ]
Ce mode (mirroring) implémente une stricte duplication des données sur tous les disques présents dans le miroir (on doit disposer d'au moins 2 disques). L'information étant enregistrée N fois sur les disques (permet de gagner du temps en lecture même si on en perds lors de l'écriture), si on perds N-1 disques on ne perds pas les données. Il est à noter que l'on perds tout de même 50% de l'espace disque utile.
- Avantages :
- Haute disponibilité des données : survit à la perte de N-1 disques ;
- Amélioration des performances en lecture. - Inconvénients :
- Dégradation des performances en écriture ;
- Mobilise un peu plus de temps CPU dans le noyau ;
- Perte de 50% de l'espace disque.
RAID 0+1 [ [#raid01_exemple exemple] ]
Comme son nom l'indique, cette solution combine le RAID 0 et le RAID 1. Elle permet d'améliorer les performances I/O en lecture tout en permettant une bonne disponibilité des données grace à leurs duplications sur l'ensemble des disques. Mais tout comme le mode miroir, on perds 50% de l'espace disque potentiellement disponible.
- Avantages :
- Haute disponibilité des données : survit à la perte d'un coté du miroir ;
- Amélioration des performances en lecture et écriture. - Inconvénients :
- Mobilise un peu plus de temps CPU dans le noyau ;
- Perte de 50% de l'espace disque.
RAID 4 [ [#raid4_exemple exemple] ]
L'algorithme utilisé ici (striping) permet de dispatcher les I/O sur l'ensemble des disques (au moins 3) tout en réservant un disque pour sauvegarder une donnée supplémentaire de parité. De fait, si on perds un disque, on peut reconstituer l'information manquante. Cependant, l'utilisation d'un disque de parité ajoute un goulot d'étranglement au système (toute écriture va provoquer un accés au disque de parité), pour cela il est préférable d'utiliser à la place le Raid5.
- Avantages :
- Haute disponibilité des données : survit à la perte d'un disque ;
- Amélioration des performances en lecture. - Inconvénients :
- On perds l'équivalent d'un disque pour le stockage des données ;
- On risque de plafonner le débit en écriture rapidement.
RAID 5 [ [#raid5_exemple exemple] ]
Le RAID 5 est sensiblement identique au RAID 4 mais améliore le procédé en stripant l'information de parité sur l'ensemble des disques.
- Avantages :
- Haute disponibilité des données : survit à la perte d'un disque ;
- Amélioration des performances en lecture et écriture. - Inconvénients :
- On perds l'équivalent d'un disque pour le stockage des données.
Disques de spare
Les RAIDS 1, 4 et 5 peuvent utiliser la notion de disques de spare. Un disque qui va venir remplacer automatiquement un disque en faute. Linux autorise l'ajout on-line de disques de spare (vous devez cependant les rajouter manuellement dans le fichier de configuration /etc/raidtab pour le cas d'un reboot) :
# raidhotadd /dev/md[0-15] /dev/sdf1
ou
# raidhotremove /dev/md[0-15] /dev/sdf1
Mise en pratique
Mode linéaire
Vous devez disposer de 2 disques ou plus, pas nécessairement de la même taille, pour implémenter le mode linéaire. Modifiez le fichier /etc/raidtab comme dans l'exemple suivant (vous pouvez configurer 16 RAIDs différent sur une machine, d'ou la symbolique avec [0-15] ainsi que dans le reste du document) :
raiddev /dev/md[0-15]
raid-level linear
nr-raid-disks 2 # disques impliqués
persistent-superblock 1 # on considère ici que
# l'auto-détection du RAID
# dans le noyau Linux est activé
device/dev/sda1 # premier disque
raid-disk 0
device/dev/sdb1 # second disque
raid-disk 1
Nota : vous ne disposez pas de disques de spare dans le mode linéaire. Si vous perdez un disque, alors vous perdez tout.
Pour activer le RAID (cette procédure va rester la même pour les autres RAID) :
# mkraid /dev/md[0-15]
- mkfs -t ext2 /dev/md[0-15] # on formatte la partition, ici en Ext2
mount /dev/md[0-15] /scratch
Pour stopper un device RAID :
# raidstop /dev/md[0-15] # pour désactiver un device RAID
Pour mettre en faute un disque (et le retirer avec raidhotremove) :
# raidsetfaulty /dev/md[0-15] /dev/sdf1
Normallement le device sera automatiquement activé lors du boot (dans le fichier /etc/rc.d/rc.sysinit sur la Mandrake 7.2 mais vous pouvez ajoutez la commande raidstart /dev/md[0-15] dans le fichier /etc/rc.d/rc.local sinon), il ne restera plus qu'à mettre à jour le fichier /etc/fstab pour le montage soit automatique. Cela va rester valide pour les autres RAIDS.
RAID 0
Vous devez disposer de 2 disques ou plus, de la même taille, pour implémenter le striping. Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :
raiddev /dev/md[0-15]
raid-level 0
nr-raid-disks 2
persistent-superblock 1
chunk-size4 # voir en fin de document
device/dev/sda1
raid-disk 0
device/dev/sdb1
raid-disk 1
Nota : vous ne disposez pas de disques de spare dans le RAID 0. Si vous perdez un disque, alors vous perdez tout.
RAID 1
Vous devez disposer de 2 disques ou plus de la même taille pour implémenter le mode miroir et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :
raiddev /dev/md[0-15]
raid-level 1
nr-raid-disks 2
nr-spare-disks 1
persistent-superblock 1
chunk-size 16
device/dev/sda1
raid-disk 0
device/dev/sdb1
raid-disk 1
device/dev/sdc1
spare-disk 0
RAID 0+1
Vous devez disposer d'un nombre de disques pairs de la même taille pour implémenter le RAID 0+1 mais vous ne pouvez pas utiliser de disques de spare individuels (je présume qu'il est possible de mettre un place un device de spare contenant le même nombre de disques que les autres). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :
raiddev /dev/md0
raid-level 0
nr-raid-disks 3
persistent-superblock 1
chunk-size 4
device/dev/sda1
raid-disk 0
device/dev/sdb1
raid-disk 1
device/dev/sdc1
raid-disk 0
raiddev /dev/md1
raid-level 0
nr-raid-disks 3
persistent-superblock 1
chunk-size 4
device/dev/sdd1
raid-disk 0
device/dev/sde1
raid-disk 1
device/dev/sdf1
raid-disk 0
raiddev /dev/md2 # seul ce device pourra etre formate
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
chunk-size 16
device/dev/md0
raid-disk 0
device/dev/md1
raid-disk 1
RAID 4
Vous devez disposer de 3 disques ou plus, de la même taille, pour implémenter le RAID 4 et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :
raiddev /dev/md[0-15]
raid-level 4
nr-raid-disks 3
nr-spare-disks 1
persistent-superblock 1
chunk-size 32
device/dev/sda1
raid-disk 0
device/dev/sdb1
raid-disk 1
device/dev/sdc1
raid-disk 2
device/dev/sdd1
spare-disk 0
RAID 5
Vous devez disposer de 3 disques ou plus, de la même taille, pour implémenter le RAID 5 et vous pouvez utiliser 1 ou plusieurs disques de spares (optionnel). Modifiez le fichier /etc/raidtab comme dans l'exemple suivant :
raiddev /dev/md[0-15]
raid-level 5
nr-raid-disks 5
nr-spare-disks 1
persistent-superblock 1
# Parity placement algorithm
# parity-algorithm left-asymmetric
# parity-algorithm right-asymmetric
# parity-algorithm right-symmetric
parity-algorithm left-symmetric
chunk-size 32
device/dev/sda1
raid-disk 0
device/dev/sdb1
raid-disk 1
device/dev/sdc1
raid-disk 2
device/dev/sdd1
raid-disk 3
device/dev/sde1
raid-disk 4
device/dev/sdf1
spare-disk 0
Chunk Size
Le choix de la "chunk size" dépends fortement du type de raid et du nombre de disques. Dans le cas d'un raid 0 de 2 disques, si on écrit 16KB avec une chunk size de 4KB, on va écrire 4KB sur le premier disque puis 4KB sur le second puis de nouveau 4KB sur le premier et pour finir 4KB sur le second ...
Vous obtiendrez généralement de bons résultats avec une chunk size à 32KB mais il est souvent bien utile d'expérimenter soi même pour obtenir le meilleur tuning. A noter que sur un environnement Alpha (64 bits), j'ai du mettre la chunk size à 16 au lieu de 4 car le raid 0 ne voulais pas s'initialiser.
Amélioration des performances
- Il sera trés souvent intéressant de mettre les disques sur des controleurs IDE ou SCSI différents ;
- La méthode la plus efficace pour améliorer drastiquement les performances I/O du système est le striping ;
- Raid 4/5 : les performances seront bien meilleures si vous utilisez une chunk-size de 32 (8*4096=32KB) et un formattage du RAID 4/5 avec la commande : mke2fs -b 4096 -R stride=8 /dev/md[0-15] (l'option -R permet de passer des paramêtres utiles pour la construction du RAID, consulter le man pour avoir plus de détails) ;
- Raid 5 : l'option parity-algorithm accepte plusieurs valeurs (left-asymmetric, right-asymmetric, left-symmetric ou right-symmetric). Il est préférable d'utiliser "left-symmetric" pour obtenir de meilleures performances ;
- Penser à tuner la chunk size ...
Utiliser le RAID sur une partition de swap ?
Il est aberrant d'utiliser le raid sur une partition de swap. Plus simplement, Linux peut utiliser les partitions de swap de la même manière que le raid 0. Il suffit de donner à chaque partition le même niveau de priorité :
/dev/hdc1 swap swap defaults,pri=1 0 0 /dev/hdd1 swap swap defaults,pri=1 0 0 /dev/hde1 swap swap defaults,pri=1 0 0
Il est aussi trés utile de placer ces partitions au début de disque plutôt qu'à la fin. Vous obtiendrez de meilleurs résultats (la vélocité à cet endroit du disque est plus importante).
Précisions (contribution wiki) : La non nécéssite de mettre le swap sur une partition RAID 1 depends de la stabilité qu'on veut obtenir. En cas de crash d'un disque contenant une partition Swap non mirorée, il peut être difficile pour le systeme de continuer à fonctionner sans le redémarrer. En effet, sur cette partition il y a potentiellement des process swappé sur le disque que l'OS n'arrivera certainement pas à remonter en memoire en cas de nécessité.
Finalement :
- Si la machine peut supporter un redémarage après un crash disque, alors oui il n'est pas nécessaire de mirrorer les partitions de swap, et dans ce cas on accepte que les services associés à celle-ci soient indiponibles jusqu'à ce que quelqu'un redémarre la machine.
- Si la machine ne doit pas redémarrer (ce qui dans mon esprit correspond plus à la réalité d'une machine en production) alors il est obligatoire de mirorer les partitions swap.
Divers
- Pensez à mettre à jour votre fichier de configuration (/etc/raidtab) si vous devez enlever ou ajouter des disques...
- N'utiliser le RAID que pour des disques de données. Si vous souhaitez utiliser la partition système avec du RAID (uniquement 0 ou 1), lisez attentivement les HowTo car la mise en oeuvre demeure complexe.
- Allez sur le site de Linas Vepstas qui regorge d'informations intéressantes (pas uniquement sur le RAID).
- Allez aussi jeter un petit coup d'oeil sur le projet Linux Logical Volume Manager même si ce n'est pas vraiment du Raid. A lire absolument car disposer d'un tel outil sous Linux est une perspective fascinante car réservée auparavant aux Unix propriétaires HPUX, Tru64, AIX, etc ...
- On pourrait aussi poser la question de la pertinence d'utiliser un système de fichiers journalisé en lieu et place de Ext2 (le gain lors d'un reboot violent est indéniable). Dans l'immédiat cela n'est pas possible (noyau 2.2.x) mais ouvrira à Linux de nouvelles et fascinantes perspectives...
Nouvel outil de RAID sous Linux: mdadm
La plupart des distributions proposent aujourd'hui mdadm, voici les différentes étapes pour mettre en place les différents niveau de RAID.
Voici les sources d'informations: http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-ig-s390-multi-fr-4/s1-s390info-raid.html
http://www.iteam.org/wiki/wakka.php?wiki=RaidBaal
http://www.frlinux.net/?section=systeme&article=146
http://xenfr.org/tiki-index.php?page=Stockage
Malheureusement, je n'ai fait les manipulations que pour un RAID 5 avec 4 disques de 6 partitions.
Voici la mise en place d'un RAID 5 avec 2 spares:
Les disques:
- Disk /dev/hde: 164.6 GB, 164696555520 bytes
255 heads, 63 sectors/track, 20023 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
- Disk /dev/hdf: 82.3 GB, 82348277760 bytes
16 heads, 63 sectors/track, 159560 cylinders Units = cylinders of 1008 * 512 = 516096 bytes
- Disk /dev/hdg: 164.6 GB, 164696555520 bytes
255 heads, 63 sectors/track, 20023 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes
- Disk /dev/hdh: 82.3 GB, 82348277760 bytes
16 heads, 63 sectors/track, 159560 cylinders Units = cylinders of 1008 * 512 = 516096 bytes
Les partitions 6 Partitions de 78 Go
* /dev/hde1 : : fd Linux raid autodetect * /dev/hde2 : : fd Linux raid autodetect * /dev/hdf1 : Sur rack disque (à changer si problème) * /dev/hdg1 : : fd Linux raid autodetect * /dev/hdg2 : : fd Linux raid autodetect * /dev/hdh1 : SPARE : fd Linux raid autodetect
Création du RAID 5 sur md0 mdadm --create /dev/md0 --level=5 --raid-devices=5 /dev/hde1 /dev/hde2 /dev/hdf1 /dev/hdg1 /dev/hdg2 --spare-devices=1 /dev/hdh1 mdadm: /dev/hde1 appears to contain an ext2fs file system
size=160836448K mtime=Sat Oct 1 18:05:35 2005
mdadm: /dev/hde1 appears to be part of a raid array:
level=5 devices=5 ctime=Sun Oct 2 15:02:01 2005
mdadm: /dev/hde2 appears to be part of a raid array:
level=5 devices=5 ctime=Sun Oct 2 15:02:01 2005
mdadm: /dev/hdf1 appears to contain an ext2fs file system
size=20479504K mtime=Sat Oct 1 18:17:51 2005
mdadm: /dev/hdf1 appears to be part of a raid array:
level=5 devices=5 ctime=Sun Oct 2 15:02:01 2005
mdadm: /dev/hdg1 appears to contain an ext2fs file system
size=2048256K mtime=Sat Oct 1 15:18:46 2005
mdadm: /dev/hdg1 appears to be part of a raid array:
level=5 devices=5 ctime=Sun Oct 2 15:02:01 2005
mdadm: /dev/hdg2 appears to be part of a raid array:
level=5 devices=5 ctime=Sun Oct 2 15:02:01 2005
mdadm: /dev/hdh1 appears to contain an ext2fs file system
size=51025432K mtime=Sat Oct 1 15:18:56 2005
Continue creating array? y mdadm: array /dev/md0 started.
mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.01 Creation Time : Sun Oct 2 15:18:17 2005 Raid Level : raid5 Array Size : 312495872 (298.02 GiB 320.00 GB) Device Size : 78123968 (74.50 GiB 80.00 GB) Raid Devices : 5 Total Devices : 6
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sun Oct 2 15:18:17 2005 State : clean, degraded, recovering
Active Devices : 4 Working Devices : 6 Failed Devices : 0
Spare Devices : 2
Layout : left-symmetric Chunk Size : 64K
Rebuild Status : 1% complete
UUID : 0a551c50:3da4f12a:5c9b3cdc:b9802273 Events : 0.2
Number Major Minor RaidDevice? State 0 33 1 0 active sync /dev/hde1 1 33 2 1 active sync /dev/hde2 2 33 65 2 active sync /dev/hdf1 3 34 1 3 active sync /dev/hdg1 4 0 0 - removed
5 34 2 4 spare rebuilding /dev/hdg2 6 34 65 - spare /dev/hdh1
Arrêter le volume RAID 5 mdadm --stop /dev/md0
Pour démarrer le volume RAID 5 mdadm --assemble /dev/md0 /dev/hde1 /dev/hde2 /dev/hdf1 /dev/hdg1 /dev/hdg2 /dev/hdh1 mdadm: /dev/md0 has been started with 4 drives (out of 5) and 2 spares.
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
more /etc/mdadm/mdadm.conf
DEVICE partitions
ARRAY /dev/md0 level=raid5 num-devices=5 spares=2 UUID=70714300:9da2e11b:a61a9c73:e2e1c245
Glossaire
RAID
Le mot RAID est un acronyme pour "Redundant Array of Inexpensive Disks".
Copyright
Copyright © 03/02/2001, Lionel Tricon
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |