pacemaker

pacemaker : Haute disponibité sur CentOS

La haut disponibilité permet à un système d’être disponible à tout moment en cas de panne. cela est réalisable en mettant en cluster (càd en groupe) plusieurs serveurs, si l’un d’eux tombe en panne l’autre prend le relais.

Dans cet article nous allons voir comment   bénéficier de la haute disponibilité en cas d’une défaillance sur un serveur actif sous CentOS 7, afin d’avoir de la continuité de service avec le logiciel open source pacemaker.

pacemaker :

Pacemaker est le gestionnaire du cluster qui assure la haute disponibilité des nœuds du cluster. Il permet de définir, démarrer ou arrêter les ressources (les services, les données) et gère un grand nombre d’applications que l’on peut trouver sur un serveur Linux (apache, nginx ..)

Cluster en mode Actif/Passif :

La configuration que nous allons mette en place dans cet article est la configuration en mode Actif/passif. Dans ce cas l’équipement passif est en mode veille tant que l’équipement actif ne rencontre aucun problème.

Ci-dessous l’environnement que nous allons mettre en place :

web1.local.lan : 192.168.162.2
web2.local.lan : 192.168.162.3

Installation du pacemaker :

Nous allons installer pacemaker sur les deux serveurs web1 et web2

[root@web1 ~]# yum install pcs
Loaded plugins: fastestmirror
Determining fastest mirrors
base: mirror.marwan.ma
extras: mirror.marwan.ma
updates: mirror.marwan.ma
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
extras/7/x86_64/primary_db | 242 kB 00:00:00
Resolving Dependencies
--> Running transaction check
[root@web2 ~]# yum install pcs
Loaded plugins: fastestmirror
Determining fastest mirrors
base: mirror.marwan.ma
extras: mirror.marwan.ma
updates: mirror.marwan.ma
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
extras/7/x86_64/primary_db | 242 kB 00:00:00
Resolving Dependencies
--> Running transaction check

Firewall :

Autoriser la haut disponibilité au niveau du firewall sur web1 et web2:

[root@web1 ~]# firewall-cmd --permanent --add-service=high-availability
success
[root@web2 ~]# firewall-cmd --permanent --add-service=high-availability
success

Mot de passe pour hacluster :

Lors de l’installtion de pacemaker un utilisateur nommé hacluster a été créé automatiquement:

[root@web1 ~]# cat /etc/passwd | grep hacluster
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin
[root@web2 ~]# cat /etc/passwd | grep hacluster
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin

Mettez un mot de passe pour cette utilisateur sur les deux serveurs :

[root@web1 ~]# passwd hacluster
Changing password for user hacluster.
New password:
[root@web2 ~]# passwd hacluster
Changing password for user hacluster.
New password:

Démarrez ensuite le service de pacemaker pcsd et mettez-le en enabled au niveau des deux serveurs:

[root@web1 ~]# systemctl start pcsd.service
[root@mpcc01 ~]# systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
[root@web2 ~]# systemctl start pcsd.service
[root@mpcc01 ~]# systemctl enable pcsd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.

taper ensuite la commande ci-dessous pour que chaque serveur s’authentifie à l’autre, cette commande ne doit être lancé que sur qu’un seul serveur (web1 dans mon cas) :

[root@web1 ~]# pcs cluster auth web1 web2
web1: Already authorized
web2: Already authorized

Création du cluster :

Nous allons créer notre cluster nommé « Cluster » qui comporte nos deux serveur web1 et web2 avec la commande pcs :

les commandes ci-dessous à faire uniquement sur un seul serveur :

[root@web1 ~]# pcs cluster setup --name Cluster web1 web2
Destroying cluster on nodes: mpcc01, mpcc02…
mpcc01: Stopping Cluster (pacemaker)…
mpcc02: Stopping Cluster (pacemaker)…
mpcc01: Successfully destroyed cluster
mpcc02: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'mpcc01', 'mpcc02'
mpcc01: successful distribution of the file 'pacemaker_remote authkey'
mpcc02: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes…
mpcc01: Succeeded
mpcc02: Succeeded
Synchronizing pcsd certificates on nodes mpcc01, mpcc02…
mpcc02: Success
mpcc01: Success
Restarting pcsd on the nodes in order to reload the certificates…
mpcc02: Success
mpcc01: Success

Démarrer ensuite le cluster :

[root@mpcc01 ~]# pcs cluster start --all
mpcc01: Starting Cluster (corosync)…
mpcc01: Starting Cluster (pacemaker)…

Configurez le cluster pour démarrer au boot :

[root@mpcc01 ~]# pcs cluster enable --all
mpcc01: Cluster Enabled
mpcc02: Cluster Enabled

Vérifier ensuite le status du cluster :

[root@mpcc01 ~]# pcs cluster status
Cluster Status:
Stack: corosync
Current DC: mpcc01 (version 1.1.23-1.el7_9.1-9acf116022) - partition WITHOUT quorum
Last updated: Sun Jul 11 10:53:08 2021
Last change: Sun Jul 11 10:40:31 2021 by hacluster via crmd on mpcc01
2 nodes configured
0 resource instances configured
PCSD Status:
web1: Online
web2: Online

Installation du serveur Web :

Nous allons mettre la haute disponibilité pour un serveur web, nous avons d’abord installer apache sur les deux serveurs :

[root@mpcc01 ~]# yum install httpd
[root@mpcc02 ~]# yum install httpd

Ajouter la config ci-dessous au fichier httpd.conf pour les deux serveurs :

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

Autoriser le service httpd au niveau du firewall :

[root@mpcc01 ~]# firewall-cmd --permanent --add-service=http
success
[root@mpcc01 ~]# firewall-cmd --reload
[root@mpcc02 ~]# firewall-cmd --permanent --add-service=http
success
[root@mpcc02 ~]# firewall-cmd --reload

Création des ressources :

Les commandes ci-dessous à faire uniquement sur une seul nœud:

La première ressource à ajouter est l’adresse VIP ( Virtual IP) , elle permet aux nœuds de communiquer avec une seule adresse .

[root@mpcc01 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.139.150 cidr_netmask=32 op monitor interval=10s

Ajouter snsuite la ressource httpd :

[root@mpcc01 ~]# pcs resource create web_server apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apache
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')

Désactiver ensuite stonith et no-quorum-policy :

[root@mpcc01 ~]# pcs property set stonith-enabled=false
[root@mpcc01 ~]# pcs property set no-quorum-policy=ignore

Il faut lier la ressource « web_server » à la VIP :

[root@mpcc01 ~]# pcs constraint colocation add web_server vip INFINITY
[root@mpcc01 ~]# pcs constraint colocation add apache VIP INFINITY

Vérifiez ensuite le status des ressources :

[root@mpcc01 ~]# pcs status resources
vip (ocf::heartbeat:IPaddr2): Started mpcc01
Resource Group: apache
web_server (ocf::heartbeat:apache): Started mpcc01

Comme vous pouvez le constater, les deux ressources sont démarré uniquement sur web1

vous pouvez aussi vérifier le status des ressources avec la commandes ci-dessous :

[root@mpcc01 ~]# pcs status
Cluster name: Cluster
Stack: corosync
Current DC: mpcc01 (version 1.1.23-1.el7_9.1-9acf116022) - partition WITHOUT quorum
Last updated: Sun Jul 11 12:51:45 2021
Last change: Sun Jul 11 12:39:32 2021 by root via cibadmin on mpcc01
2 nodes configured
2 resource instances configured
Online: [ mpcc01 ]
OFFLINE: [ mpcc02 ]
Full list of resources:
vip (ocf::heartbeat:IPaddr2): Started mpcc01
Resource Group: apache
web_server (ocf::heartbeat:apache): Started mpcc01
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled

Test du failover (basculement) :

Après avoir configurer le cluster, nous allons tester le basculement entre les deux noeuds, pour cela nous allons créer un fichier index sur les deux noeud avec un contenu diffèrent :

[root@web1 ~]# cat /var/www/html/index.html
noeud1
[root@web2 ~]# cat /var/www/html/index.html
noeud2

Avec un navigateur accéder à la page http://Adress_VIP :

Comme vous pouvez le constater, c’est le serveur web1 qui a répondu à la requête vu que c’est le serveur actif.

Maintenant arrêter le serveur web1 et réessayer d’accéder à la page http://Adress_VIP :

VIP

Avec la même IP, c’est le contenu de web2 qui s’est affichée vu que le web1 n’est plus joignable.