LINUX:Pacemaker - cinq serveurs WEB en Failover, Galera et GlusterFs
→ retour au menu de la Haute disponibilité
But
Autre configuration, nous allons reprendre la configuration présentée à l'article concernant Quatre serveurs WEB en Failover, Fsyncd et ISCSI. Nous y mettrons 5 serveurs WEB en failover au lieu de quatre. Ils seront accompagnés d'un stockage en réplication des fichiers grâce à GlusterFs au lieu d'ISCSI et Fsyncd. Nous y ajoutons la réplication de la base de données grâce à Mariadb-Galera.
Matériel et adressage IP
Dans notre exemple, nous utilisons cinq serveurs Web mis en cluster. Pour améliorer les performances et de sécurité, le trafic généré par la réplication se fera au travers d'un second réseau ("192.168.2.0/24"), chaque machine est pour cette raison équipée d'une seconde carte réseau.
Le schéma ci-dessous nous montre l'adressage IP et le nom de ces machines. En outre pour mettre la fonction Failover, une adresse IP virtuelle est ajoutée à chaque serveur Web.
Principe
En mode d'utilisation complet, nous avons cinq services Web répartis sur cinq machines mises en cluster: "sv0.home.dom", "sv1.home.dom", "sv2.home.dom", "sv3.home.dom" et "sv4.home.dom". A chaque service Web est associé une adresse IP virtuelle propre et un nom de domaine virtuel propre ou nom de machine virtuelle. Ce nom de machine virtuelle et son adresse IP virtuelle seront repris comme "VirtualHost" dans la configuration du service Web HTTP d'Apache.
Associations:
Description | Nom de machine virtuelle | Adresse IP virtuelle | Machine réelle préférée | Adresse IP réelle préférée |
---|---|---|---|---|
Service Web n° 5 | cluster5.home.dom | 192.168.1.75 | sv0.home.dom | 192.168.1.70 |
Service Web n° 6 | cluster6.home.dom | 192.168.1.76 | sv1.home.dom | 192.168.1.71 |
Service Web n° 7 | cluster7.home.dom | 192.168.1.77 | sv2.home.dom | 192.168.1.72 |
Service Web n° 8 | cluster8.home.dom | 192.168.1.78 | sv3.home.dom | 192.168.1.73 |
Service Web n° 9 | cluster9.home.dom | 192.168.1.79 | sv4.home.dom | 192.168.1.74 |
Dans de nombreuses configurations d'un site Web, nous avons les composantes suivantes:
- le code statique du site écrit par exemple en HTML et en PHP
- une base de sonnées SQL contenant la partie dynamique de mise en page et du contenu du site
- un espace disque contenant tous les médias dynamiques téléchargés (images, film, documents PDF,...) qui viendront étoffer le site.
C'est ce que nous rencontrons dans des systèmes de gestion de contenu (CMS) tels Wordpress, Mediawiki, Drupal, Joomla, SPIP,...
Le code statique du site doit être accessible à partir de chaque machine Web. Il faut aussi un espace utilisé pour l'hébergement des médias dynamiques téléchargés. Tous ces fichiers seront hébergés sous une arborescence placée sous le répertoire "/web". Cet espace disque se retrouvera sur chaque machine et seront identiques grâce au système de réplication présenté à l'article sur Glusterfs. Le serveur GlusterFs et le client GlusterFs (Fuse) seront sur la même machine. Le montage de l'espace disque sera donc local.
Classiquement les sites Web ont besoin d'un accès à une base de données. Nous utiliserons le gestionnaire de base de données MariaDb. Cette base se retrouvera sur chaque machine; cet accès sera local. Nous utiliserons le système de réplication entre base de données présenté à l'article sur Galera - Cluster de MariaDB. Les cinq bases de données seront donc identiques.
Ces deux types de réplications se feront au travers du réseau secondaire "192.168.2.0/24".
En cas de défaillance d'une machine du cluster, les différentes ressources de la machine défaillante seront transférés sur une des quatre autres machines et ainsi de suite pour aboutir dans le cas extrême que toutes les ressources soient concentrées sur deux machines. Au delà ces services s'arrêteront.
Prérequis
Configurations de base
En premier, les Prérequis doivent être effectués.
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.70 sv0.home.dom 192.168.1.71 sv1.home.dom 192.168.1.72 sv2.home.dom 192.168.1.73 sv3.home.dom 192.168.1.74 sv4.home.dom 192.168.2.70 dt0.home.dom 192.168.2.71 dt1.home.dom 192.168.2.72 dt2.home.dom 192.168.2.73 dt3.home.dom 192.168.2.74 dt4.home.dom 192.168.1.75 cluster5.home.dom 192.168.1.76 cluster6.home.dom 192.168.1.77 cluster7.home.dom 192.168.1.78 cluster8.home.dom 192.168.1.79 cluster9.home.dom # serveur mail 192.168.1.110 servermail.home.dom home.dom
Configuration des services nécessaires
Nous avons à configurer les différents services nécessaires qui vont être utilisés par Pacemaker.
Service GlusterFs
Sur chaque machine, il faut configurer le serveur Gluster. La configuration se base sur celle présentée dans l'article sur Glusterfs. Toute la configuration centralisée se fera à partir de la machine "sv0.home.dom".
Démarrage
Sur chaque machine, on lance le service "glusterd.service":
systemctl start glusterd.service
Constitution du "Pool"
On constitue le "Pool" de serveurs qui va utiliser le réseau "192.168.2.0/24". Voici la suite des commandes:
gluster peer probe dt1.home.dom gluster peer probe dt2.home.dom gluster peer probe dt3.home.dom gluster peer probe dt4.home.dom
Constitution du volume en réplication
On crée ensuite le volume en réplication "diskgfs1" sur les cinq machines:
gluster volume create diskgfs1 replica 5 transport tcp dt0.home.dom:/disk1/glusterfs/brique1 dt1.home.dom:/disk1/glusterfs/brique1 \ dt2.home.dom:/disk1/glusterfs/brique1 dt3.home.dom:/disk1/glusterfs/brique1 \ dt4.home.dom:/disk1/glusterfs/brique1
qui se placera sur un disque indépendant, sous le répertoire "/disk1/glusterfs".
Services HTTPD et PHP
Le service Web est identique à celui présenté à l'article sur la Configuration du service WEB. La seule différence est qu'il faut l'étendre au cinquième site: "cluster9.home.dom" et à la cinquième machine.
Les fichiers des sites se trouvent sous le répertoire "/web". Cet espace sera monté sur le volume GlusterFs configuré ci-dessus.
mkdir /web mount -t glusterfs localhost:/diskgfs1 /web
Service MariaDb-Galera
La configuration se base sur celle présentée dans l'article sur Galera - Cluster de MariaDB. Notons que comme nous avons un nombre impaire de serveurs, le service Garb n'est pas nécessaire.
Configuration de MariaDb et de Galera
Nous prendrons la même configuration; nous mettrons la base de données dans le répertoire "/produc/mysql". Nous garderons aussi l'utilisation du répertoire "/produc/mysql.bat" et de son script "mysql.bat.
Seules deux options liées à Galera seront adaptées dans le fichier de configuration du serveur "/etc/my.cnf.d/mariadb-server.cnf".
Celle liée à l'ensemble des machines du cluster utilisant le réseau "192.168.2.0/24":
wsrep_cluster_address = "gcomm://192.168.2.70,192.168.2.71,192.168.2.72,192.168.2.73,192.168.2.74"
Et comme nous avons deux interfaces réseaux, il faut spécifier l'option "wsrep_node_address". Sur chaque machine, il faut mettre l'adresse IP de son interface réseau ETH2. Dans cet exemple, c'est celle de la machine "sv1.home.dom":
wsrep_node_address="192.168.2.71"
Configuration du service "checkgalera.service"
Nous utilisons le service "checkgaler.service" vu à l'article concernant la MariaDB/Galera - Solution d'automatisation de démarrage.
Il faut adapter le fichier "/manager/galera/hosts.txt":
sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom
Configuration du service Rsyncd
Le service précédent utilise le service Rsyncd (voir MariaDB/Galera - Solution d'automatisation de démarrage). La seule option à adapter dans le fichier "/etc/rsyncd.conf" est liée à la sécurité:
hosts allow = 192.168.1.70 192.168.1.71 192.168.1.72 192.168.1.73 192.168.1.74
Initialisation
Après la configuration, il est préférable de lancer une fois ces services avant d'aborder Pacemaker pour au moins initialiser correctement MariaDb. Pour initier au début le processus, on lance une première fois sur une machine la commande:
galera_new_cluster
Ensuite on peut lancer sur chaque machine le service "checkgalera.service":
systemctl start checkgalera.service
On les arrête ensuite.
Arrêt des services
Tous ces services que nous venons de configurer, nous avons dû les lancer pour effectuer les configurations.
Mais ce sera le rôle de Pacemaker de les gérer. Il faut donc les désactiver et les arrêter avant d'aborder la configuration de Pacemaker.
Sur toutes les machines, on effectue ces tâches:
umount /web
systemctl stop httpd.service systemctl stop php-fpm.service systemctl stop glusterd.service systemctl stop mariadb.service systemctl stop rsyncd.service systemctl stop checkgalera.service
systemctl disable httpd.service systemctl disable php-fpm.service systemctl disable glusterd.service systemctl disable mariadb.service systemctl disable rsyncd.service systemctl disable checkgalera.service
Configuration de base de Pacemaker
La Configuration de base de Pacemaker doit être effectuée avec quelques modifications car nous avons cinq machines dans le cluster au lieu de deux. Nous allons passer rapidement en revue ces opérations.
Opérations locales
Sur chaque machine:
- le mot de passe de l'utilisateur "hacluster" est à implémenter. "Chasse4321Eau" pour mémoire.
- le service "pcsd.service" est à configurer et est lancé.
Initialisation du cluster
Pour initialiser le cluster, on effectue ces opérations sur une seule machine du cluster:
pcs host auth sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom -u hacluster -p Chasse4321Eau pcs cluster setup fo_cluster \ sv0.home.dom addr=192.168.1.70 sv1.home.dom addr=192.168.1.71 sv2.home.dom addr=192.168.1.72 \ sv3.home.dom addr=192.168.1.73 sv4.home.dom addr=192.168.1.74 \ transport knet ip_version=ipv4 link transport=udp mcastport=5420
Quorum
Nous maintenons la contrainte du "quorum" avec la commande:
pcs property set no-quorum-policy=stop
le "quorum" est de 3; c'est à dire que s'il n'y a pas au moins 3 machines actives, le système s'arrête.
Il est conseillé d'avoir au moins trois serveurs actifs pour un volume GlusterFs en réplication mais nous voulons définir le "quorum" soit de 2. Dans un autre article, nous avions joué sur l'option "expected_votes" dans le fichier "/etc/corosync/corosync.conf". Mais cette valeur n'est prise en compte que si elle est supérieure ou égale au nombre de machines présentes dans le cluster. Nous allons utiliser l'option "last_man_standing".
Modification de la configuration de Corosync
Pour atteindre ce quorum de deux, il faut adapter sur chaque machine du cluster, le fichier "/etc/corosync/corosync.conf". La dernière commande a créé ce fichier. Dans la section "quorum", on va ajouter l'option "last_man_standing: 1". Cette option recalcule le "quorum" en fonction du nombre de machines actives dans le cluster et non sur base du nombre total de machines configurées dans le cluster.
Ce fichier devient pour la section "quorum":
quorum { provider: corosync_votequorum last_man_standing: 1 }
Avec cette configuration, le "quorum" minimum sera de 2 et c'est seulement quand il ne restera qu'une machine active que le système de Failover s'arrêtera.
Notons que pour que cette modification soit effective, il faut arrêter puis redémarrer le cluster:
pcs cluster stop --all pcs cluster start --all
Fin de la configuration
Par la même occasion exécutez la fin de la configuration de base:
pcs property set stonith-enabled=false pcs property set no-quorum-policy=stop
La dernière spécifie que si le quorum n'est pas atteint, les ressources de Pacemaker sont arrêtées.
Configuration des adresses IP virtuelle et des serveurs Web sous 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 ClusterIP5 ocf:heartbeat:IPaddr2 ip=192.168.1.75 nic=eth1 cidr_netmask=24 iflabel=ethcl5 lvs_support=true op monitor interval=30s pcs constraint location ClusterIP5 prefers sv0.home.dom=400 pcs constraint location ClusterIP5 prefers sv1.home.dom=100 pcs constraint location ClusterIP5 prefers sv2.home.dom=100 pcs constraint location ClusterIP5 prefers sv3.home.dom=100 pcs constraint location ClusterIP5 prefers sv4.home.dom=100 pcs resource create ClusterIP6 ocf:heartbeat:IPaddr2 ip=192.168.1.76 nic=eth1 cidr_netmask=24 iflabel=ethcl6 lvs_support=true op monitor interval=30s pcs constraint location ClusterIP6 prefers sv0.home.dom=100 pcs constraint location ClusterIP6 prefers sv1.home.dom=400 pcs constraint location ClusterIP6 prefers sv2.home.dom=100 pcs constraint location ClusterIP6 prefers sv3.home.dom=100 pcs constraint location ClusterIP6 prefers sv4.home.dom=100 pcs resource create ClusterIP7 ocf:heartbeat:IPaddr2 ip=192.168.1.77 nic=eth1 cidr_netmask=24 iflabel=ethcl7 lvs_support=true op monitor interval=30s pcs constraint location ClusterIP7 prefers sv0.home.dom=100 pcs constraint location ClusterIP7 prefers sv1.home.dom=100 pcs constraint location ClusterIP7 prefers sv2.home.dom=400 pcs constraint location ClusterIP7 prefers sv3.home.dom=100 pcs constraint location ClusterIP7 prefers sv4.home.dom=100 pcs resource create ClusterIP8 ocf:heartbeat:IPaddr2 ip=192.168.1.78 nic=eth1 cidr_netmask=24 iflabel=ethcl8 lvs_support=true op monitor interval=30s pcs constraint location ClusterIP8 prefers sv0.home.dom=100 pcs constraint location ClusterIP8 prefers sv1.home.dom=100 pcs constraint location ClusterIP8 prefers sv2.home.dom=100 pcs constraint location ClusterIP8 prefers sv3.home.dom=400 pcs constraint location ClusterIP8 prefers sv4.home.dom=100 pcs resource create ClusterIP9 ocf:heartbeat:IPaddr2 ip=192.168.1.79 nic=eth1 cidr_netmask=24 iflabel=ethcl9 lvs_support=true op monitor interval=30s pcs constraint location ClusterIP9 prefers sv0.home.dom=100 pcs constraint location ClusterIP9 prefers sv1.home.dom=100 pcs constraint location ClusterIP9 prefers sv2.home.dom=100 pcs constraint location ClusterIP9 prefers sv3.home.dom=100 pcs constraint location ClusterIP9 prefers sv4.home.dom=400 pcs resource create ClusterGlusterd systemd:glusterd op monitor interval=30s clone pcs resource create ClusterRsyncd systemd:rsyncd op monitor interval=30s clone pcs constraint order ClusterGlusterd-clone then start ClusterRsyncd-clone pcs resource create ClusterCheckGalera systemd:checkgalera op monitor interval=30s clone pcs constraint order ClusterRsyncd-clone then start ClusterCheckGalera-clone pcs resource create ClusterFsWeb ocf:heartbeat:Filesystem \ device="localhost:/diskgfs1" \ directory="/web" fstype="glusterfs" \ "options=defaults,_netdev" \ op monitor interval=20s on-fail=stop clone pcs constraint order ClusterCheckGalera-clone then start ClusterFsWeb-clone pcs resource create ClusterHttpd systemd:httpd op monitor interval=30s clone pcs constraint order ClusterFsWeb-clone then start ClusterHttpd-clone pcs resource create ClusterPhp systemd:php-fpm àp monitor interval=30s clone pcs constraint order ClusterHttpd-clone then start ClusterPhp-clone pcs resource create ClusterMailTo ocf:heartbeat:MailTo email=root subject="FailOver_Home" op monitor interval=30s clone pcs constraint order ClusterPhp-clone then start ClusterMailTo-clone
Ajout des ressources des adresses IP virtuelles
Nous créons les ressources "ClusterIP5", "ClusterIP6", "ClusterIP7", "ClusterIP8" et "ClusterIP9" grâce à la fonction "ocf:heartbeat:IPaddr2".
On remarque qu'on a ajouté des contraintes de localisation par machine du cluster. Pour chacune de ces ressources, une machine différente préférentielle a été choisie. La ressource "ClusterIP5" sera activée sur la machine "sv0.home.dom" (valeur "400") et ainsi de suite. Chaque machine aura sa propre adresse IP virtuelle prédéfinie. Dans le cas d'une déficience de cette machine, cette ressource sera placée aléatoirement sur une des trois autres machines du cluster; elles ont en effet le même score préférentiel (valeur "100").
Ajout des ressources clonées
Les lignes suivantes créent sept ressources de type clone; ces ressources se retrouveront d'office sur toutes les machines du cluster.
- La ressource "ClusterGlusterd" va activer le service GlusterFs configuré ci-dessus.
- La ressource "ClusterRsyncd" va activer le service Rsync configuré ci-dessus.
- La ressource "ClusterCheckGalera" va activer le service CheckGalera configuré ci-dessus qui lancera le service MariaDb.
- La ressource "ClusterFsWeb" va monter le volume "diskgfs1" local sur le répertoire "/web".
- La ressource "ClusterHttpd" va activer le service Apache configurée ci-dessus.
- La ressource "ClusterPhp" va activer le service Php.
- La ressource "ClusterMailTo" va activer les notifications par mail.
Nous avons intercalé le lancement de Rsyncd et MariaDb entre le service Glusterd et le montage du volume afin de laisser à GlusterFs le temps de se lancer.
Nous avons ordonné l'ordre des lancements de ces services.
Statut
Après cette opération, l'état du cluster peut être visualisé par la commande:
crm_mon -1
qui donne dans le cas des cinq machines actives:
Cluster Summary: * Stack: corosync (Pacemaker is running) * Current DC: sv3.home.dom (version 2.1.6-4.fc38-6fdc9deea29) - partition with quorum * Last updated: Mon Jun 19 14:12:15 2023 on sv1.home.dom * Last change: Mon Jun 19 14:09:15 2023 by root via cibadmin on sv1.home.dom * 5 nodes configured * 40 resource instances configured Node List: * Online: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] Active Resources: * ClusterIP5 (ocf::heartbeat:IPaddr2): Started sv0.home.dom * ClusterIP6 (ocf::heartbeat:IPaddr2): Started sv1.home.dom * ClusterIP7 (ocf::heartbeat:IPaddr2): Started sv2.home.dom * ClusterIP8 (ocf::heartbeat:IPaddr2): Started sv3.home.dom * ClusterIP9 (ocf::heartbeat:IPaddr2): Started sv4.home.dom * Clone Set: ClusterGlusterd-clone [ClusterGlusterd]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterFsWeb-clone [ClusterFsWeb]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterHttpd-clone [ClusterHttpd]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterPhp-clone [ClusterPhp]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterMailTo-clone [ClusterMailTo]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterRsyncd-clone [ClusterRsyncd]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ] * Clone Set: ClusterCheckGalera-clone [ClusterCheckGalera]: * Started: [ sv0.home.dom sv1.home.dom sv2.home.dom sv3.home.dom sv4.home.dom ]
→ retour au menu de la Haute disponibilité