LINUX:Pacemaker - Serveurs en Failover

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour au menu de la Haute disponibilité


But

Autre application, nous allons mettre deux serveurs en Failover. Nous utiliserons l'approche utilisée par les routers mis en Failover couplée à l'utilisation de Drbd.

Principe

On dispose de deux ordinateurs Linux configurés en mode serveur. On va utiliser le logiciel Pacemaker qui les regroupent en cluster. Il sera utilisé en Failover. L'un des serveurs concentrera les ressources configurées dans Pacemaker tandis que l'autre sera en attente. Quand le premier serveur sera indisponible, par exemple suite à un problème matériel ou plus simplement lors d'une mise à jour de version, le second reprendra la tâche de serveur en récupérant les ressources de Pacemaker.

La première ressource consiste à créer une adresse IP virtuelle sur l'interface réseau "eth1" accessible par les clients; les autres "eth2" seront réservés à la synchronisation des données effectuée par la seconde ressource Drbd. L'adresse IP virtuelle sera le point d'accès pour les clients voulant utiliser les ressources du serveur. Les adresses IP réelles ne seront utilisées que pour une administration locale, par exemple, pour mettre à jour l'OS.

Le schéma suivant visualise la situation stable complètement opérationnelle. Dans ce cas, au contraire du cas des deux routeurs, aucun serveur n'a la préférence; quand le serveur qui a la main, s'arrête, le second reprend cette charge et la garde quand la situation redevient normale. Le tracé en vert visualise de trafic et l'adresse IP en rouge est virtuelle; elle n'est pas liée à un serveur mais va devoir passer de gauche à droite et inversement en fonction des besoins.

LINUX:Failover3G.pdf

Dans le cas où le serveur de gauche tombe en panne (grisé), celui de droite prend la relève. L' adresse IP virtuelle migre sur l'autre serveur "fo2.home.dom" et la ressource Drbd de ce second serveur passe en mode Actif ("Primary").

LINUX:Failover3D1.pdf

Et en situation redevenue normale.

LINUX:Failover3D2.pdf

Pour plus grande facilité de présentation, nous allons séparer la partie de d'adresse IP virtuelle, de mise en oeuvre de Drbd et de montage du disque partagé, de la partie reprenant les ressources de services propres à un serveur. Pour cette seconde partie, nous prendrons l'exemple de services Web (Apache et Php), de service de base de données (Mariadb) utilisé par nombre d'applications Web tel WordPress et enfin de services de messagerie (Postfix et Dovecot). Le tout sera en mode sécurisé incontournable actuellement grâce à l'utilisation de certificats.

Grâce à Drbd, nous disposerons d'un espace disque partagé nommé ici "/data". C'est sur cet espace que les données utilisées par ces services seront placées.


Prérequis

Configurations de base

En premier, la Configuration de base de Pacemaker doit être effectuée. Elle complétée par la mise en place de Drbd vue dans l'article précédent. Quelques uns de ces prérequis seront adaptés en cours de route.


Fichier "hosts"

Sur chaque machine du cluster, on ajoute un nom aux différentes adresses réseaux. On le fait en local dans le fichier "/etc/hosts" suivant le schéma ci-dessus. Son contenu devient:


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
192.168.1.71 fo1.home.dom
192.168.1.72 fo2.home.dom
192.168.1.73 cluster.home.dom
 
192.168.2.71 fd1.data.dom 
192.168.2.72 fd2.data.dom 
  
# serveur mail
192.168.1.110 servermail.home.dom home.dom

L'adresse IP virtuelle "192.168.1.73" et le nom de machine associé "cluster.home.dom" sont cruciales pour la suite. En effet c'est par ce nom que les clients accèderont aux services du serveur actif.


Bug

Au cours de notre mise en place, nous avons été confrontés à un message d'erreur lors de la création de la ressource Drbd sous Pacemaker que ce soit par la commande "pcs" ou par l'interface Web. Ce problème était bloquant.

Voici le message d'erreur:


Error: Validation result from agent (use --force to override):
  ocf-exit-reason:meta parameter misconfigured, expected clone-max -le 2, but found unset.
Error: Errors have occurred, therefore pcs is unable to continue

Nous utilisons la version "9.23.0-1" de Drbd sous Fedora 37.

En traçant le problème, il est apparu qu'une constante n'était pas initialisée pour effectuer correctement le test.

Dans le fichier "drbd" situé dans le répertoire "/usr/lib/ocf/resource.d/linbit" a cette tâche de création et d'utilisation de cette ressource sous Pacemaker.

Aux environs de la ligne 185 de ce fichier, nous avons ces lignes:


: ${OCF_RESKEY_CRM_meta_clone_node_max=1}
: ${OCF_RESKEY_CRM_meta_master_max=1}
: ${OCF_RESKEY_CRM_meta_master_node_max=1}

Il faut ajouter à ce bloc, la ligne:


: ${OCF_RESKEY_CRM_meta_clone_max=2}

Dès la ligne ajoutée, la création de la ressource Drbd ne pose plus de problème. Cette ligne n'a pas d'impact par la suite si elle n'est pas présente; elle n'intervient que lors de la phase de vérification des paramètres de Drbd avant son implémentation.


Configuration de la première partie

Dans cette partie, on se concentre sur l'activation de Drbd, de son espace disque partage et de l'adresse IP virtuelle.


Script

On effectue la suite des commandes suivantes à partir d'une des machines du cluster. On peut les mettre dans un script.


#!/bin/bash
 
pcs resource create ClusterDrbd ocf:linbit:drbd drbd_resource=drbddata \
 op start interval=0s timeout=240s \
 op stop interval=0s timeout=100s \
 op monitor interval=29s role=Promoted \
 op monitor interval=31s role=Unpromoted \
 clone promotable=true promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true
 
pcs resource create ClusterFs ocf:heartbeat:Filesystem device="/dev/drbd1" directory="/data" fstype="xfs"
pcs constraint colocation add ClusterFs with Promoted ClusterDrbd-clone score=INFINITY
pcs constraint order promote ClusterDrbd-clone then start ClusterFs
 
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.1.73 nic=eth1 cidr_netmask=24 iflabel=ethcl1 lvs_support=true op monitor interval=30s
pcs constraint colocation add ClusterIP with ClusterFs score=INFINITY
pcs constraint order ClusterFs then start ClusterIP

Ces commandes ne sont à exécuter qu'à partir d'une seule machine du cluster.


Ajout de la ressource de Drbd

Les lignes suivantes:


pcs resource create ClusterDrbd ocf:linbit:drbd drbd_resource=drbddata \
 op start interval=0s timeout=240s \
 op stop interval=0s timeout=100s \
 op monitor interval=29s role=Promoted \
 op monitor interval=31s role=Unpromoted \
 clone promotable=true promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true

va créer une ressource, nommée "ClusterDrbd" qui va activer Drbd en mode "Actif/Passif" ("Primary/Secondery") grâce à la fonction "ocf:linbit:drbd" sur base de la ressource Drbd "drbddata". Cette ressource sera présente sur les deux machines ("clone" et "clone-max=2"). Une seule machine est "Active" ("promoted-node-max=1"). Notons que la syntaxe a évolué par rapport au passé; avant on parlait de "Master/Slave", maintenant "Promoted/Unpromoted". Ces changements de syntaxe selon les versions se rencontre un peu partout d'où la nécessité de revalider celle-ci minutieusement avant tout changement de version spécialement lors de changement de version de l'OS qui intervient tous les 6 mois dans le cas de Fedora.


Ajout de la ressource qui monte l'espace disque partagé

La ligne suivante:

pcs resource create ClusterFs ocf:heartbeat:Filesystem device="/dev/drbd1" directory="/data" fstype="xfs"

va créer la ressource disque, nommée "ClusterFs" qui va monter le device "/dev/drbd1", initiée par la ressource "drbddata", sur le répertoire "/data" en utilisant le format "xfs".


Ajout de la ressource de l'adresse IP virtuelle

La ligne suivante:

pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.1.73 nic=eth1 cidr_netmask=24 iflabel=ethcl1 lvs_support=true op monitor interval=30s

va créer une ressource, nommées "ClusterIP" qui va activer l'adresse virtuelle "192.168.1.73/24" grâce à la fonction "ocf:heartbeat:IPaddr2". Elle sera placée sur l'interface réseau "eth1". Le nom virtuel sera aussi donné: "ethcl1".


Contraintes

Les contraintes d'ordre de démarrage sont connues; elles ont déjà été rencontrées dans les articles précédents. Il tombe sous le sens que la ressource "drbddata" active doit être effective avant de pouvoir monter cet espace partagé.

Les deux ressources "ClusterFs" et "ClusterIP" doivent se situer sur la même machine ("INFINITY") que la ressource Drbd (ClusterDrbd") qui est active ("Promoted"), parmi les deux ("clone"), d'où la syntaxe "Promoted ClusterDrbd-clone".


Statut de la première partie

Après cette opération, l'état du cluster peut être visualisé par la commande:

crm_mon -1

qui donne:


Status of pacemakerd: 'Pacemaker is running' (last updated 2023-02-14 12:42:34 +01:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: fo1.home.dom (version 2.1.5-3.fc37-a3f44794f94) - partition with quorum
  * Last updated: Tue Feb 14 12:42:34 2023
  * Last change:  Tue Feb 14 12:42:17 2023 by root via cibadmin on fo1.home.dom
  * 2 nodes configured
  * 4 resource instances configured
 
Node List:
  * Online: [ fo1.home.dom fo2.home.dom ]
 
Active Resources:
  * Clone Set: ClusterDrbd-clone [ClusterDrbd] (promotable):
    * Masters: [ fo2.home.dom ]
    * Slaves: [ fo1.home.dom ]
  * ClusterFs   (ocf::heartbeat:Filesystem):     Started fo2.home.dom
  * ClusterIP   (ocf::heartbeat:IPaddr2):        Started fo2.home.dom

On remarque que dans ce cas, c'est la machine "fo2.home.dom" qui a la main; c'est à partir de cette machine que l'on peut copier des fichiers dans le répertoire "/data". Ne pas le faire sur l'autre machine sinon ce répertoire ne pourra plus être monté.


Voyons l'état de Drbd sur la machine "fo2.home.dom":

cat /proc/drbd

qui affiche:


version: 8.4.11 (api:1/proto:86-101)
srcversion: 086EBDAD8BB6D6FF00986AA
 
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2748 nr:0 dw:2220 dr:5018 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


La commande sur la machine "fo2.home.dom":

df -h

permet de repérer que le répertoire "/data" est monté:


Sys. de fichiers            Taille Utilisé Dispo Uti% Monté sur
devtmpfs                      4,0M       0  4,0M   0% /dev
tmpfs                         1,9G     33M  1,9G   2% /dev/shm
tmpfs                         769M    1,1M  768M   1% /run
/dev/mapper/fo2_lv1-root       15G    3,8G   12G  26% /
tmpfs                         1,9G       0  1,9G   0% /tmp
/dev/sda1                    1014M    329M  686M  33% /boot
/dev/mapper/fo2_lv1-var       9,8G    1,1G  8,8G  11% /var
/dev/drbd1                    149G    1,2G  148G   1% /data
tmpfs                         385M     16K  385M   1% /run/user/0


Voici la situation de l'adressage réseau sur la machine "fo2.home.dom", qui a les ressources, avec la commande:

ifconfig

qui donne:


eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.1.72  netmask 255.255.255.0  broadcast 192.168.1.255
       ether 00:1b:21:3b:b0:77  txqueuelen 1000  (Ethernet)
       RX packets 170080  bytes 147735272 (140.8 MiB)
       RX errors 0  dropped 7  overruns 0  frame 0
       TX packets 102619  bytes 12967633 (12.3 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.2.72  netmask 255.255.255.0  broadcast 192.168.2.255
       ether 00:1c:c0:2a:c4:25  txqueuelen 1000  (Ethernet)
       RX packets 2357  bytes 183467 (179.1 KiB)
       RX errors 0  dropped 1675  overruns 0  frame 0
       TX packets 2931  bytes 3036681 (2.8 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
       device interrupt 20  memory 0xe0380000-e03a0000
 
eth1:ethcl1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.1.73  netmask 255.255.255.0  broadcast 192.168.1.255
       ether 00:1b:21:3b:b0:77  txqueuelen 1000  (Ethernet)
 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1000  (Boucle locale)
       RX packets 265  bytes 84878 (82.8 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 265  bytes 84878 (82.8 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


Paramétrage des services en Failover

Maintenant que le nécessaire est en place, nous allons y placer quelques éléments pratiques: quelques services classiques. Mais avant d'aborder la suite de la configuration de Pacemaker, il nous faut les paramétrer un minimum afin de tester cet ensemble. Pour ne pas alourdir cet article, nous les avons détaillés à part.


Configuration de la seconde partie

Maintenant que les services sont configurés, on peut les intégrer au cluster à l'aide de Pacemaker.


Script

On effectue la suite des commandes suivantes à partir d'une des machines du cluster. On peut les mettre dans un script.


#!/bin/bash
 
pcs resource create ClusterHttp         systemd:httpd        op monitor interval=30s
pcs constraint colocation add ClusterHttp  with    ClusterIP score=INFINITY
pcs constraint order ClusterIP then start ClusterHttp
 
pcs resource create ClusterPhp systemd:php-fpm op monitor interval=30s
pcs constraint colocation add ClusterPhp  with    ClusterHttp score=INFINITY
pcs constraint order ClusterHttp then start ClusterPhp
 
pcs resource create ClusterMariadb systemd:mariadb op monitor interval=30s
pcs constraint colocation add ClusterMariadb  with    ClusterPhp score=INFINITY
pcs constraint order ClusterPhp then start ClusterMariadb
 
pcs resource create ClusterPostfix systemd:postfix op monitor interval=30s
pcs constraint colocation add ClusterPostfix  with    ClusterMariadb score=INFINITY
pcs constraint order ClusterMariadb then start ClusterPostfix
 
pcs resource create ClusterPostfixBase systemd:postfix-base op monitor interval=30s
pcs constraint colocation add ClusterPostfixBase  with    ClusterPostfix score=-INFINITY
pcs constraint order ClusterPostfix then start ClusterPostfixBase
 
pcs resource create ClusterDovecot systemd:dovecot op monitor interval=30s
pcs constraint colocation add ClusterDovecot  with    ClusterPostfix score=INFINITY
pcs constraint order ClusterPostfix then start ClusterDovecot
 
pcs resource create ClusterMailTo ocf:heartbeat:MailTo email=root subject="FailOver_Home" op monitor interval=30s
pcs constraint colocation add ClusterMailTo  with    ClusterDovecot score=INFINITY
pcs constraint order ClusterDovecot then start ClusterMailTo


Ajouts des ressources

La création de ces ressources des différents services sont sur le même gabari; on utilise la fonction Systemd du type "systemd:<service>". (excepté la ressource classique "ClusterMailTo" déjà vue)


Localisation des ressources

Tous les services sont placés sur la machine où Drbd est actif et que l'espace partagé "/data" est monté.

Un seul fait exception, la ressource "ClusterPostfixBase"; elle doit se placer sur la machine passive, celle qui est en attente où la ressource équivalente "ClusterPostfix" ne s'exécute pas. On utilise pour cette raison l'option "score=-INFINITY"; le moins "-" signifie à un endroit opposé.


Ordre de lancement des ressources

Nous avons déjà rencontré ce type de commande; chaque service est chargé chacun à la suite de l'autre après la ressource "ClusterIP".


Statut après l'activation de la seconde partie

Après cette opération, l'état du cluster peut être visualisé par la commande:

crm_mon -1

qui donne:


Status of pacemakerd: 'Pacemaker is running' (last updated 2023-02-15 19:25:01 +01:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: fo1.home.dom (version 2.1.5-3.fc37-a3f44794f94) - partition with quorum
  * Last updated: Wed Feb 15 19:25:02 2023
  * Last change:  Wed Feb 15 19:24:54 2023 by root via cibadmin on fo1.home.dom
  * 2 nodes configured
  * 11 resource instances configured
 
Node List:
  * Online: [ fo1.home.dom fo2.home.dom ]
 
Active Resources:
  * Clone Set: ClusterDrbd-clone [ClusterDrbd] (promotable):
    * Masters: [ fo2.home.dom ]
    * Slaves: [ fo1.home.dom ]
  * ClusterFs   (ocf::heartbeat:Filesystem):     Started fo2.home.dom
  * ClusterIP   (ocf::heartbeat:IPaddr2):        Started fo2.home.dom
  * ClusterHttp (systemd:httpd):         Started fo2.home.dom
  * ClusterPhp  (systemd:php-fpm):       Started fo2.home.dom
  * ClusterMariadb      (systemd:mariadb):       Started fo2.home.dom
  * ClusterPostfix      (systemd:postfix):       Started fo2.home.dom
  * ClusterPostfixBase  (systemd:postfix-base):  Starting fo1.home.dom
  * ClusterDovecot      (systemd:dovecot):       Starting fo2.home.dom

On remarque que seule la ressource "ClusterPostfixBase" s'exécute sur l'autre machine "fo1.home.dom".


Accès pour les clients

Notons que sur les machines clients, le nom de machine "cluster.home.dom" doit être connu et lié à l'adresse IP "192.168.1.73". (serveur DNS ou fichiers "hosts" local)


Pour accéder au site Web, l'URL est:

https://cluster.home.dom

qui affichera:


Nom du serveur: fo2.home.dom 


Du côté de la messagerie, Le serveur est "cluster.home.dom". Par exemple pour l'utilisateur "pdupont", l'adresse mail est "pdupont@failover.dom" et le nom de compte est "pdupont" accompagné du mot de passe Linux associé. Le reste est classique.





retour au menu de la Haute disponibilité