Table des matières

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

Voici donc un shéma qui résume ce que nous allons mettre en place ici :

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

Préparation de NFS

Pour installer un serveur NFS, reportez vous à 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 :

  1. les personnes qui étaient présentes au local MiNET en témoigneront : je voyais défiler dans le terminal beaucoup d’erreurs sales…
  2. Je n'aime pas beaucoup heartbeat et ses fichiers de confs me semblent peu clair.
  3. 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

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.

1)
non ce n'est pas foireux !!! Y en a qui utilisent ça en prod (les fous)
2)
En terme de performances, ça me semble pas très bon…
3)
Merci Ubuntu
4)
que j'aurais basé sur HAproxy avec des helph check