mercredi 15 juin 2011

RAID1 avec un ramdisk

Dans la série c'est faisable mais pas simplement, voici le RAID1 entre un disque physique et un disk RAM.
L'avantage:
- des lectures ultra rapides
- une synchro permanente entre le HD et la RAM

L'inconvénient:
- c'est chère la RAM

Donc, mon Use Case, c'est un serveur MySQL qui demande moultes lectures/ecritures (une DB dspam) qui sature mon serveur de mails en IOwait.

J'ai donc une machine physique avec 32 Go de RAM, et 2x320Go de HD.
J'ai donc installé un RAID 1 complet sur les deux disques, et j'ai paramétré une partition /dev/md3 de 25 Go pour stocker le /var/lib/mysql.

1) donner aux disques physiques une préférence pour l'écriture:
mdadm /dev/md3 -f /dev/sda2 -r /dev/sda2 --add --write-mostly /dev/sda2
... attendre la fin de la synchro ...
mdadm /dev/md3 -f /dev/sdb2 -r /dev/sdb2 --add --write-mostly /dev/sdb2
(notez s/sda2/sdb2/)

2) ensuite, ajouter le ramdisk tout simplement:
mdadm /dev/md3 --add /dev/ramdisk

Et là, attention, le dev/ramdisk est ajouté en tant que Spare.
il faut enlever un HD et le remettre en spare. Je n'ai pas trouvé d'autres méthodes:
mdadm /dev/md3 -f /dev/sda2 -r /dev/sda2
mdadm /dev/md3 --add --write-mostly /dev/sda2

Et maintenant, j'ai :
Number   Major   Minor   RaidDevice State
2       1        0        0      spare rebuilding   /dev/ram0
1       8       18        1      active sync writemostly   /dev/sdb2

0       8        2        -      writemostly spare   /dev/sda2

Le problème c'est que l'allocation de RAM est plutôt longue, du coup la synchro est très lente... (speed=4456K/sec)

Une fois terminée, le résultat est là:
Number   Major   Minor   RaidDevice State
       0       1        0        0      active sync   /dev/ram0
       1       8       18        1      active sync writemostly   /dev/sdb2

       2       8        2        -      writemostly spare   /dev/sda2
/dev/md3:
 Timing buffered disk reads:  1544 MB in  3.00 seconds = 514.37 MB/sec

/dev/md2:
 Timing buffered disk reads:  208 MB in  3.03 seconds =  68.60 MB/sec
(md2 est une autre partition en RAID1 sur les memes disques)

Bien sur, il y a des trucs à savoir:
sfdisk -l /dev/sda donne (entre autres) le nombre de blocs du ramdisk (dans mon cas, 26218080)
J'ajoute donc dans /boot/grub/menu.lst:
kernel /vmlinuz-2.6.18-238.12.1.el5 ro root=/dev/md2 nodmraid ramdisk_size=26218080

Puis je crée dans le fichier rc.local:
# RAID1 ramdisk
mdadm /dev/md3 --add /dev/ramdisk
DEVICE=/dev/sda2
if [ -e /dev/sdb2 ]; then
        DEVICE=/dev/sdb2
fi
mdadm /dev/md3 -f ${DEVICE} -r ${DEVICE}
mdadm /dev/md3 --add --write-mostly ${DEVICE}

Aucun commentaire: