======= Failover NFS ======= 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 ((non ce n'est pas foireux !!! Y en a qui utilisent ça en prod (les fous) )). Voici donc un shéma qui résume ce que nous allons mettre en place ici : {{:wiki:divers:ha:failover_nfs.png?900|}} Laissez vous guider ! ===== Préliminaires ===== 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 ===== Synchronisation avec DRDB ===== ==== Configuration ==== 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. ==== Création des devices ==== 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 ==== Tests ==== 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". ==== Et pour pouvoir utiliser mon raid matériel? ==== 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 raid5((En terme de performances, ça me semble pas très bon...)). 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... ===== Préparation de NFS ===== Pour installer un serveur NFS, reportez vous à [[wiki:divers:coin_geek:nfs|ce tuto]]. ===== Conf réseau ===== 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 ===== Heartbeat ===== 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... ===== Conclusions ===== Bien que globalement ça marche, je n'ai pas été très convaincu : - les personnes qui étaient présentes au local MiNET en témoigneront : je voyais défiler dans le terminal beaucoup d’erreurs sales... - Je n'aime pas beaucoup heartbeat et ses fichiers de confs me semblent peu clair. - Des fois les volumes DRBD refusent catégoriquement de se monter. Après 3/4 passations de pouvoir d'un serveur à l'autre ça se remonte. Clairement, je mettrais pas ça en prod... ===== Liens utiles ===== * Le lien dont tout est partit ((Merci Ubuntu)) : https://help.ubuntu.com/community/HighlyAvailableNFS? 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 (( que j'aurais basé sur [[wiki:divers:HA:haproxy|HAproxy]] avec des helph check )) 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.