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