RAID

De Lea Linux
Révision datée du 2 septembre 2005 à 19:06 par PingouinMigrateur (discussion | contributions) (conversion de la documentation originale de Léa par HTML::WikiConverter)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Raid logiciel sous Linux

Raid logiciel sous Linux
Un petit tutoriel sur la configuration du 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) :

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...

Glossaire

RAID
Le mot RAID est un acronyme pour "Redundant Array of Inexpensive Disks".

Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Lionel Tricon le 03/02/2001.