Vous en avez marre des NAS qui vous semblent être un “single point of failure” à MiNET?
Le but de cet article est de décrire une (la?) solution de failover NFS qui utilise DRDB ( permet de faire de la réplication de disque ) et Heartbeat, qui permet de détecter la perte de disponibilité de DRDB et permet de remonter aussi vite que possible le même serveur nfs sur le slave 1).
Voici donc un shéma qui résume ce que nous allons mettre en place ici :
Laissez vous guider !
Histoire de rendre tout ceci bien clair :
Voici ma première machine :
Hostname : benwa-fw-1 IP admin : 192.168.103.208
Et la deuxième :
Hostname : benwa-fw-2 IP admin : 192.168.103.209
Pour cette partie, j'ai ajouté un disque sur deux de mes KVMs. On va en avoir besoin.
Ce disques supplémentaires apparaissent dans /dev
en temps que vdb
.
Bon maintenant les choses sérieuses :
apt-get install drbd8-utils
Voili voilou ;)
Maintenant il va nous falloir le même fichier de conf sur nos deux serveurs NFS. Dans mon cas :
resource aaa { protocol C; handlers { pri-on-incon-degr "echo 'DRBD: primary requested but inconsistent!'"; pri-lost-after-sb "echo 'DRBD: primary requested but lost!'"; } startup { degr-wfc-timeout 10; } disk { on-io-error detach; } net { timeout 120; connect-int 20; ping-int 20; max-buffers 4096; max-epoch-size 4096; ko-count 30; cram-hmac-alg "sha1"; shared-secret "drdbTest1gKey"; } syncer { rate 100M; al-extents 257; } on benwa-fw-1 { device /dev/drbd0; disk /dev/vdb; address 192.168.103.208:7789; meta-disk internal; } on benwa-fw-2 { device /dev/drbd0; disk /dev/vdb; address 192.168.103.209:7789; meta-disk internal; } }
Bon on passe les premiers blocks de la configuration… Clairement, on peut jouer dessus pour obtenir une meilleure synchronisation et une meilleure gestion des erreurs.
sync permet de gérer le débit de synchronisation maximal. clairement, je le monterais à 1Gb…
Ensuite, on ajoute nos nœuds de réplication (identifiés par leur hostname…), en précisant à chaque fois le device à créer, le disque sur lequel s'appuyer et l'adresse de la machine cible.
Alors maintenant, on lance sur chacun des serveurs cette commande pour créer le volume de DRDB :
drbdadm create-md aaa
Bon, ensuite, on en rend un master :
drbdadm -- --overwrite-data-of-peer primary aaa
Sur le master, on cré le système de fichier :
mkfs.ext4 /dev/drbd0
Testons cette réplication de disque…
Sur le master :
mkdir /nfs mount /dev/drdb0 /nfs cd /nfs echo "toto" > toto
Puis on passe le master en slave :
umount nfs drbdadm secondary aaa
Sur le slave, on deviens master et on vérifie la présence du fichier :
drbdadm primary aaa mount /dev/drdb0 /nfs cat /nfs/toto
Et chez moi le résultat est bien “toto”.
C'est dommage, on ne peut utiliser qu'un seul disque pour la synchronisation de DRDB . Sachez qu'un trick existe pour vous permettre de faire du raid par exemple du raid52).
Configurez d'abord bien gentillement votre raid, sur un autre système de fichier.
Ensuite, on va se servir de ce système de fichier comme d'un disque virtuel pour DRDB :
dd if=/dev/zero of=/root/drbd_fs bs=1024 count=20000 losetup /dev/loop0 drbd_fs
Il suffit maintenant d'utiliser dans la conf' de DRDB le device fraîchement créé.
Ensuite, sur le device que vous créerez avec DRDB, vous installerez le système de fichier de vos rêves ( Beter FS ? :-p ).
File System 'ception…
Pour installer un serveur NFS, reportez vous à ce tuto.
On va utiliser des bonds, et heartbeat montera l'ip virtuelle en cas de besoin.
Pour cela :
apt-get install apt-get install ifenslave
Puis éditez /etc/modprobe.d/aliases.conf
alias bond0 bonding options bonding mode=0 miimon=100 downdelay=200 updelay=200
Et enfin voici le contenu du /etc/network/interfaces :
auto bond0 iface bond0 inet static address 192.168.103.208 netmask 255.255.255.0 up /sbin/ifenslave bond0 eth0 up /sbin/ifenslave bond0 eht1 auto eth0 iface eth0 inet manual auto eth1 iface eth1 inet manual
Et enfin après reboot, vous pouvez voir l'état du bond :
cat /proc/net/bonding/bond0
On va installer heartbeat :
apt-get install heartbeat
On donne à heartbeat les droits sur des outils de DRBD :
chgrp haclient /sbin/drbdsetup chmod o-x /sbin/drbdsetup chmod u+s /sbin/drbdsetup chgrp haclient /sbin/drbdmeta chmod o-x /sbin/drbdmeta chmod u+s /sbin/drbdmeta
Bon maintenant la conf :
/etc/heartbeat/ha.cf :
logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 120 bcast bond0 node benwa-fw-1 node benwa-fw-2
/etc/heartbeat/haressource :
benwa-fw-1 IPaddr::192.168.103.210/24/eth0 drbddisk::nfs Filesystem::/dev/drbd0::/nfs::ext3 nfs-kernel-server
/etc/heartbeat/authkeys :
auth 3 3 md5 password
Et on reboot nos serveurs…
Bien que globalement ça marche, je n'ai pas été très convaincu :
Clairement, je mettrais pas ça en prod…
Je vois pas beaucoup d'autres liens. C'est toujours à peu près la même chose.
Note : Au début, je pensais tenter de mettre en place non pas une solution de failover pour nos serveurs NFS mais une solution de load balancing. Pour cela il aurait fallut fixer la valeur des ports utilisés par NFS, afin que la conf nécessaire sur le load balanceur 4) soit toujours la même. Sauf que ça marche pas : avec DRDB, un seul des deux noeuds est utilisable à la fois, et l'autre est en read only. Exit l'idée du load balancing.