GoldZone Web Hosting

Rédigé par Gaëtan Trellu (goldyfruit)

Outils pour utilisateurs

Outils du site


cluster_nfs

Cluster NFS

Mise en place d'un cluster NFS à l'aide de Heartbeat et DRBD.

En cours de rédaction !!

La solution suivante permet d'obtenir un partage NFS haute disponibilité. Cela peut être nécessaire dans le cas d'une grappe de cluster web par exemple, ou plusieurs serveurs Apache ont leurs “DocumentRoot” sur le serveur NFS.

En plus de la redondance, les données sont centralisées et donc plus facile à sauvegarder.

Pour mettre cela en œuvre nous avons utilisé les applications suivantes :

  1. Heartbeat 2.1.4.
  2. DRBD 8.2.6.
  3. NFS supportant le protocole v4.
  4. RedHat EL 5.2.

Une partition de 300Mo a été créée sur les deux serveurs, cette dernière et non-formatée et non-montée. Les partitions doivent-être de la même taille !!
Elle sera utilisée par DRBD sous le nom “/dev/drbd0”, elle sera partagée entre les deux serveurs.

Dessus se trouveront le contenu du répertoire “/var/lib/nfs” ainsi qu'un répertoire “partage”.

  1. Le contenu du répertoire “/var/lib/nfs” doit être déposé sur la partition “/dev/drbd0” afin que les deux serveurs NFS aient exactement les mêmes informations (etab, xtab, etc…).
  1. Le répertoire “partage” contient les informations à partager.

Nos deux serveurs, l'adresse IP virtuelle, le client :

  1. heartbeat1 - 10.11.2.45
  2. heartbeat2 - 10.11.2.48
  3. client - 10.11.2.50
  4. cluster - 10.11.2.65

Ces informations sont à indiquer dans le fichier “/etc/hosts” de chaque serveur.

Installation et configuration de DRBD.

Actuellement aucun paquet RPM n'est disponible pour la version 8.2.6 de DRBD. Il suffit d'aller sur le site officiel puis de télécharger les sources.
Une fois téléchargée et décompressée, il suffit de créer un paquet de la façon suivante :

# cd drdb-2.6
# make
# make rpm

Des paquets sont crées sous le répertoire “dist/i386”, il suffit d'installer les paquets “drbd-8.2.6-3” et “drbd-km-2.6.18_92.1.17”.
Le paquet “drdb-km” est un module pour le noyau, il permet par exemple de recueillir des informations dans “/proc/drbd” sur le statut du disque “/dev/drbd0”.

Ne pas oublier de charger le module.

# depmod -a
# modprobe drbd

Pour être sur que le module soit bien chargé, on utilise la commande “lsmod | grep drbd”. Cette dernière doit retourner une ligne.
Aux prochains reboot, le module sera chargé automatiquement.

Passons à la configuration de DRBD, le fichier se trouve dans “/etc/” et il a pour nom “drbd.conf”.

/etc/drbd.conf

global {
            minor-count 1;
}

resource nfs { # Nom de notre ressource, ici c'est "nfs".
            protocol C; # Il y a trois protocoles, A, B et C.

            #incon-degr-cmd "echo 'DRBD Degraded!' | wall; sleep 60 ; halt -f"; # Si le partage est considérait comme défectueux, un message sera envoyé à  tout les utilisateurs connectés. 60 secondes après l'envoi du message, le système reboot.

            # DRBD sur le serveur "heartbeat1".
            on heartbeat1 {
                        device /dev/drbd0; # Le nom de notre device "drdb".
                        disk /dev/sda2;    # Partition physique utilisée sur le serveur "heartbeat1".
                        address 10.11.2.45:7788; # Adresse IP du serveur "heartbeat1" et port sur lequel sera écouté DRBD.
                        meta-disk internal; # Stocke les meta-data sur le disque système.
            }

            # DRBD sur le serveur "heartbeat2".
            on heartbeat2 {
                        device /dev/drbd0; # Le nom de notre device "drdb", doit-être identique à  celui sur "heartbeat1".
                        disk /dev/sda2;    # Partition physique utilisée sur le serveur "heartbeat1".
                        address 10.11.2.48:7788; # Adresse IP du serveur "heartbeat1" et port sur lequel sera écouté DRBD.
                        meta-disk internal; # Stocke les meta-data sur le disque système.
            }

            disk {
                        on-io-error panic; # Si le de disque "/dev/drdb0" est défectueux on bascule sur l'autre serveur.
            }

            net {
                        max-buffers 2048; # Mise en cache avant écriture sur le disque.
                        ko-count 4; # Le partage est annulé si cette valeur est dépassée.
                        #on-disconnect reconnect; # Si le partage est déconnecté alors on essaye de se reconnecter.
            }

            syncer {
                        rate 10M; # Vitesse de synchronisation entre les deux serveurs (en méga).
                        al-extents 257; # Un extents est égal à  4Mo, cette option définie la taille de la hot-area qui est utilisée pour inscrire les meta-data. Nécessaire à  une re-synchronisation en cas de crash d'un des deux disques.
            }

            startup {
                        wfc-timeout 0; # Temps d'attente du deuxième au lancement du daemon "drbd" (en seconde).
                        degr-wfc-timeout 120; # Temps d'attente du deuxième nœud en cas de crash (en seconde).
            }
}

Le fichier “drbd.conf” doit-être identique sur les deux serveurs.

Maintenance la configuration de DRBD est terminée, nous allons créer la zone des meta-data sur “heartbeat1” via la commande :

# drbdadm create-md nfs

On lance le service sur “heartbeat1”.

# /etc/init.d/drbd start

Lors du lancement DRBD va indiquer qu'il ne trouve pas le second disque (“heartbeat2”), il va alors se mettre en attente jusqu'à ce que le serveur “heartbeat2” soit configuré.
Nous allons donc taper “yes” pour quitter l'attente.

Pour vérifier que le disque a bien été configuré, il suffit d'aller vérifier le contenu du fichier “/proc/drbd”, il doit être en “secondary” comme ci-dessous :

            0: cs:Connected st:Secondary/Unconfigured ds:UpToDate/UpToDate C r---

Sur le serveur “heartbeat2”, nous allons effectuer la même manipulation que celle sur le serveur “heartbeat1” à savoir :

# drbdadm create-md nfs

(“nfs” étant le nom de notre ressource dans le fichier “drbd.conf”.)

Ce qui doit retourner le contenu suivant (“/proc/drbd”):

            version: 8.2.6 (api:88/proto:86-88)
            GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@heartbeat1, 2008-11-05 10:58:09
             0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
                ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:0

Les meta-data ont été initialisées sur les deux disques, il est maintenant nécessaire d'indiquer un disque primaire. Nous allons faire du disque “/dev/drbd0” sur le serveur “heartbeat1” un disque primaire.

# drbdadm -- --overwrite-data-of-peer primary nfs

Dès lors, la synchronisation entre les deux disques s'effectue. Vous pouvez voir en temps réel cette synchronisation via la commande :

# watch cat /proc/drbd

Quand la synchronisation sera terminée, vous devriez avoir le résultat suivant (“/proc/drbd.conf”):

            version: 8.2.6 (api:88/proto:86-88)
            GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@heartbeat1, 2008-11-05 10:58:09
             0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
                ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:0

DRDB est désormais installé et configuré.

Test avec DRBD.

Pour pouvoir utiliser la partition “/dev/drdb0” il est nécessaire de la formater. Nous allons la formater en “ext3” (il est possible de le faire en “reiserfs”).
Bien sûr il est nécessaire d'utiliser un système de fichiers journalisé. La commande est à exécuter depuis le serveur “heartbeat1”.

# mkfs.ext3 -L nfs /dev/drbd0

Si vous essayez d'exécuter la commande ci-dessus sur le serveur “heartbeat2” vous aurez droit au message d'erreur qui suit :

mkfs.ext3: Wrong medium type while trying to determine filesystem size

Cela est du au fait que le serveur “heartbeat1” est primaire et que “heartbeat2” est secondaire donc en lecture seule !!

Une fois la partition formaté, on monte cette dernière dans le répertoire “/data” par exemple puis on créé un fichier via la commande “touch”.

# mkdir /data
# mount /dev/drbd0 /data
# cd /data
# touch test_drdb

On démonte la partition “/dev/drbd0” puis en la passe en seconde sur le serveur “heartbeat1” et en primaire sur le serveur “heartbeat2”.

# cd ~
# umount /data
# drbdadm secondary nfs

Sur le serveur “heartbeat2” on passe la partition “/dev/drbd0” en primaire puis on la monte dans le répertoire “/data”.

# drbdadm primary nfs
# mkdir /data
# mount /dev/drbd0 /data
# cd /data

Dans le répertoire “/data” nous devrions voir le fichier “test_drbd”, si tel est le cas à la synchronisation entre les deux disques s'est effectuée avec succès.

Voilà , DRBD est fonctionnel !!

Configuration du serveur NFS.

Sous RedHat EL 5.2 il est nécessaire de modifier deux fichiers avant de pouvoir déplacer le contenu du répertoire “/var/lib/nfs” vers la partition “/dev/drbd0”.

Les fichiers à modifier sont les suivants :

  1. /etc/modprobe.d/modprobe.conf.dist

Ligne 125 : Remplacer “/var/lib/nfs/rpc_pipefs” par “/var/lib/rpc_pipefs”.

                      Ligne 139 : Remplacer "/var/lib/nfs/rpc_pipefs" par "/var/lib/rpc_pipefs".
  1. /etc/idmapd.conf

Ligne 4 : Remplacer “Pipefs-Directory = /var/lib/nfs/rpc_pipefs” par “Pipefs-Directory = /var/lib/rpc_pipefs”.

Arrêt de tout les services NFS et démontage de “rpc_pipefs”. Le montage système “rpc_pipefs” est automatiquement monté à chaque démarrage du serveur par le module “sunrpc”.

# /etc/init.d/nfslock stop
# /etc/init.d/nfs stop
# /etc/init.d/rpcidmapd stop
# umount -a -t rpc_pipefs

Le répertoire “rpc_pipefs” présent dans “/var/lib/nfs” est désormais inutilisé, on peut donc le déplacer vers “/var/lib”. Une fois ce répertoire déplacé, on remonte “rpc_pipefs” dans son nouveau répertoire.

# mv /var/lib/nfs/rpc_pipefs /var/lib/
# mount -t rpc_pipefs sunrpc /var/lib/rpc_pipefs

On relance le service “rpcidmapd”.

# /etc/init.d/rpcidmapd start

Ces opérations sont effectuées automatiquement au démarrage du système, nous les effectuons à la main juste pour de simples tests. :)

On peut désormais déplacer le répertoire “/var/lib/nfs” vers notre partition “/dev/drbd0”. La partition est à monter sur le serveur “heartbeat1”, une fois le répertoire déplacé il faut créer un lien symbolique vers de “/data/nfs” vers “/var/lib/nfs”.

# mount /dev/drbd0 /data
# mv /var/lib/nfs /data/
# ln -sfn /data/nfs /var/lib/nfs

Le lien doit pointer comme ceci :

lrwxrwxrwx  1 root      root      12 nov  7 14:36 nfs -> /data/nfs

Sur le serveur “heartbeat2”, on supprime le répertoire “/var/lib/nfs” puis on créé uniquement un lien comme ci-dessus.

# ln -sfn /data/nfs /var/lib/nfs

Sur les deux serveurs il est nécessaire de modifier le fichier “/etc/sysconfig/nfs” afin de lui indiquer le nom ou l'adresse IP virtuelle de notre cluster.

A la fin du fichier ajouter ceci :

STATD_HOSTNAME=cluster

Ou :

STATD_HOSTNAME=10.11.2.65

Il reste maintenant à partager le(s) répertoire(s) que nous voulons exporter. Dans notre cas à§a sera le répertoire “/data/partage” qui sera partagé pour le client “10.11.2.50”. Cet export se configure dans le fichier “/etc/exports” et est à faire sur les deux serveurs.

/data/partage           10.11.2.50(rw,sync)

Pour exporter le répertoire on tape la commande suivante :

# exportfs -av

Il est très important d'empêcher “nfs” et “nfslock” de se lancer automatiquement au démarrage du serveur car c'est à Heartbeat de le faire !!! Pour se faire on utilise la commande “chkconfig” :

# chkconfig nfs off
# chkconfig nfslock off

Ces actions sont à effectuer sur les deux serveurs.

La configuration du serveur NFS est terminée.

Installation et configuration de Heartbeat.

Heartbeat propose des paquets pour plusieurs distributions (RedHat, Debian,Suse, Mandriva, etc…), il suffit d'aller récupérer les trois paquets suivants sur leur site web.

  1. heartbeat-stonith-2.1.4-2.1
  2. heartbeat-pils-2.1.4-2.1
  3. heartbeat-2.1.4-2.1

L'installation des paquets s'effectue via la commande RPM (ou Yum si vous avez un dépôt).

# rpm -ivh heartbeat*.rpm

La configuration de Heartbeat consiste à :

  1. Indiquer les noeuds faisant partis du cluster.
  2. Quelques options de bases.
  3. Les actions à effectuer en cas de panne d'un des noeuds.
  4. Le type de communication entre les deux serveurs.

Et se partage trois fichiers de configuration :

  1. /etc/ha.d/ha.cf - Configuration globale de Heartbeat (nœuds, temps entre les battements, logs, etc…).
  2. /etc/ha.d/authkeys - Configuration du chiffrement entre les nœuds.
  3. /etc/ha.d/haresources - Actions à effectuer en cas de crash d'un des noeuds (service à démarrer, etc…).

La configuration doit-être identique sur tous les noeuds du cluster.

/etc/ha.d/ha.cf

logfacility     local0 # Log dans le syslog.
keepalive       2 # Temps entre chaque battement (en seconde).
deadtime        10 # Temps avant qu'un noeud soit considéré comme mort
(en seconde).
bcast           eth0 # Interface sur laquelle est envoyé le broadcast.
node            heartbeat1 heartbeat2 # Serveurs présents dans le cluster.
autofailback             off # Le serveur maître ne reprend pas le contrôle une fois en ligne.
wartime                        5 # Au bout de 5 secondes sans battement une alerte sera envoyée dans les logs (en seconde).
initdead           60 # Fait passer le "daedtime" à  60 secondes au démarrage du serveur.

/etc/ha.d/authkeys

auth 2 # Méthode à  utiliser (en fonction avec le reste du fichier).
1 crc # Méthode peut sécurisé.
2 sha1 SuperPhraseDeLaMortQuiTue # Méthode très sécurisé.
3 md5 SuperPhrase # Méthode sécurisé.

/etc/ha.d/haresources

# Serveur maître du cluster.
heartbeat1 \
            # Ressource "nfs" à  utiliser.
            drbddisk::nfs \
            # Montage de la partition "/dev/drbd0" en "ext3" dans le répertoire "/data".
            Filesystem::/dev/drbd0::/data::ext3 \
            # Exécution du script "killnfsd".
            killnfsd \
            # Lancement du service "nfs".
            nfs \
            # Lancement du service "nfslock".
            nfslock \
            # Effectue une pause de quelques secondes.
            Delay::3::0 \
            # Adresse IP virtuelle du cluster.
            IPaddr::10.11.2.65

Le script “killnfsd” est nécessaire pour tuer les processus “nfsd” avant la relance du service “nfs” sur le nouveau noeud. Cette étape est très importante auquel cas le service ne sera pas lancé donc pas de cluster !!
Ci-dessous le contenu du fichier “killnfsd” qui se trouve dans le répertoire “/etc/ha.d/resource.d/”.

/etc/ha.d/resource.d/killnfsd

killall -9 nfsd ; exit 0

Une fois le script créé, il faut le rendre exécutable.

# chmod +x /etc/ha.d/resource.d/killnfsd

Comme dit plus haut, la configuration est identique sur tout les noeuds du cluster, nous allons donc envoyer nos fichiers sur le serveur “heartbeat2” via la commande “scp” du protocole SSH.

# scp -r /etc/ha.d root@10.11.2.48:/etc/

Par défaut Heartbeat n'est pas lancé au démarrage du serveur. Pour remédier à ce problème il suffit de taper les commandes ci-dessous sur les deux serveurs :

# chkconfig --add heartbeat
# chkconfig --level 2345 heartbeat on
cluster_nfs.txt · Dernière modification: 2011/01/05 16:05 (modification externe)