Le cluster haute disponibilité, également appelé cluster de basculement ou cluster actif-passif, est l'un des types de cluster les plus largement utilisés dans un environnement de production pour avoir une disponibilité continue des services même si l'un des nœuds du cluster tombe en panne.
En technique, si le serveur exécutant l'application a échoué pour une raison quelconque (ex :panne matérielle), le logiciel du cluster (pacemaker) redémarrera l'application sur le nœud de travail.
Le basculement ne consiste pas seulement à redémarrer une application ; il s'agit d'une série d'opérations qui lui sont associées, comme le montage de systèmes de fichiers, la configuration de réseaux et le démarrage d'applications dépendantes.
Environnement
Ici, nous allons configurer un cluster de basculement avec Pacemaker pour faire du serveur Apache (web) une application hautement disponible.
Ici, nous allons configurer le serveur Web Apache, le système de fichiers et les réseaux en tant que ressources pour notre cluster.
Pour une ressource de système de fichiers, nous utiliserions un stockage partagé provenant du stockage iSCSI.
Tous s'exécutent sur VMware Workstation.
Stockage partagé
Le stockage partagé est l'une des ressources critiques du cluster haute disponibilité car il stocke les données d'une application en cours d'exécution. Tous les nœuds d'un cluster auront accès au stockage partagé pour les dernières données.
Le stockage SAN est le stockage partagé largement utilisé dans un environnement de production. En raison de contraintes de ressources, pour cette démo, nous allons configurer un cluster avec stockage iSCSI à des fins de démonstration.
Installer des packages
Serveur iSCSI
[root@storage ~]# dnf install -y targetcli lvm2
Nœuds de cluster
dnf install -y iscsi-initiator-utils lvm2
Configurer le disque partagé
Listons les disques disponibles sur le serveur iSCSI à l'aide de la commande ci-dessous.
[root@storage ~]# fdisk -l | grep -i sd
Sortie:disque / dev / sda:100 gib, 107374182400 octets, 209715200 Secteurs / Dev / SDA1 * 2048 2099199 2097152 1G 83 Linux / Dev / SDA2 2099200 209715199 207616000 octets, 20971520 secteurs
À partir de la sortie ci-dessus, vous pouvez voir que mon système a un disque dur de 10 Go (/dev/sdb).
Ici, nous allons créer un LVM sur le serveur iSCSI à utiliser comme stockage partagé pour nos nœuds de cluster.
[root@storage ~]# pvcreate /dev/sdb
[root@storage ~]# vgcreate vg_iscsi /dev/sdb
[root@storage ~]# lvcreate -l 100%FREE -n lv_iscsi vg_iscsi
Créer un stockage partagé
Obtenez les détails de l'initiateur des nœuds.
cat /etc/iscsi/initiatorname.iscsi
Nœud 1 :
NomInitiateur=iqn.1994-05.com.redhat:121c93cbad3a
Nœud 2 :
NomInitiateur=iqn.1994-05.com.redhat:827e5e8fecb
Entrez la commande ci-dessous pour obtenir une CLI iSCSI pour une invite interactive.
[root@storage ~]# targetcli
Sortie :Avertissement :Impossible de charger le fichier de préférences /root/.targetcli/prefs.bin.targetcli shell version 2.1.fb49Copyright 2011-2013 par Datera, Inc et autres. Pour obtenir de l'aide sur les commandes, tapez "help"./> cd /backstores/block/backstores/block> créer iscsi_shared_storage /dev/vg_iscsi/lv_iscsiCreated block storage object iscsi_shared_storage using /dev/vg_iscsi/lv_iscsi./backstores/block> cd /iscsi/iscsi> createCreated target iqn.2003-01.org .linux-iscsi.storage.x8664:sn.eac9425e5e18.Created TPG 1.Global pref auto_add_default_portal=trueCreated default portal listening on all IPs (0.0.0.0), port 3260./iscsi> cd iqn.2003-01.org.linux -iscsi.storage.x8664:sn.eac9425e5e18/tpg1/acls <créer iqn.1994-05.com.redhat :121c93cbad3a < créer iqn.1994-05.com.redhat:827e5e8fecb < cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18/tpg1/luns/iscsi/iqn.20. ..e18/tpg1/luns> create /backstores/block/iscsi_shared_storageCreated LUN 0.Created LUN 0->0 mapping in node ACL iqn.1994-05.com.redhat:827e5e8fecbCreated LUN 0->0 mapping in node ACL iqn. 1994-05.com.redhat:121c93cbad3a/iscsi/iqn.20...e18/tpg1/luns> cd // lso- / ................... .................................................. .................................................. .. [...] o- backstores ............................................. .................................................. .................... [...] | o-bloc ....................................................... .................................................. .[Objets de stockage :1] | | o- iscsi_shared_storage .............................................. [ /dev/vg_iscsi/lv_iscsi (10.0GiB) écriture immédiate activée] | | o-alua ............................................... .................................................. .. [Groupes ALU :1] | | o- default_tg_pt_gp .............................................. ........................ [État ALU :Actif/optimisé] | o-fileio ............................................... .................................................. [Objets de stockage :0] | o-pscsi ............................................... .................................................. .[Objets de stockage :0] | o- disque virtuel .................................................. .................................................. [ Objets de stockage :0] o- iscsi ......................................... .................................................. ................ [Cibles :1] | o-iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18 ............................. ................................ [TPG :1] | o-tpg1 ............................................... ................................................ [non -gen-acls, pas d'authentification] | o-acls ....................................................... .................................................. ......... [ACL :2] | | o- iqn.1994-05.com.redhat:121c93cbad3a ..................................... ............................. [LUN mappés :1] | | | o-mapped_lun0 ............................................... ................... [bloc lun0/iscsi_shared_storage (rw)] | | o- iqn.1994-05.com.redhat:827e5e8fecb ..................................... .............................. [LUN mappés :1] | | o-mapped_lun0 ............................................... ................... [bloc lun0/iscsi_shared_storage (rw)] | o-luns ............................................... .................................................. ......... [LUN :1] | | o- lun0 ......................................... [block/iscsi_shared_storage (/ dev/vg_iscsi/lv_iscsi) (default_tg_pt_gp)] | o-portails ....................................................... .................................................. ... [Portails :1] | o-0.0.0.0:3260 ...................................................... .................................................. ........ [OK] o- bouclage ....................................... .................................................. ................... [Cibles :0]/> saveconfigConfiguration enregistrée dans /etc/target/saveconfig.json/> exitGlobal pref auto_save_on_exit=trueDernières 10 configs enregistrées dans /etc /target/backup/.Configuration enregistrée dans /etc/target/saveconfig.json
Activez et redémarrez le service cible.
[root@storage ~]# systemctl enable target
[root@storage ~]# systemctl restart target
Configurez le pare-feu pour autoriser le trafic iSCSI.
[root@storage ~]# firewall-cmd --permanent --add-port=3260/tcp
[root@storage ~]# firewall-cmd --reload
Découvrir le stockage partagé
Sur les deux nœuds du cluster, découvrez la cible à l'aide de la commande ci-dessous.
iscsiadm -m découverte -t st -p 192.168.0.20
Sortie :192.168.0.20:3260,1 qn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18
Maintenant, connectez-vous au stockage cible avec la commande ci-dessous.
iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18 -p 192.168.0.20 -l
Sortie : Connexion à [iface :par défaut, cible :iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18, portail :192.168.0.20,3260]Connexion à [iface :par défaut, cible :iqn.2003-01.org.linux-iscsi.storage.x8664:sn.eac9425e5e18, portail :192.168.0.20,3260] réussi.
Redémarrez et activez le service initiateur.
systemctl restart iscsid
systemctl enable iscsid
Configurer les nœuds du cluster
Stockage partagé
Accédez à tous vos nœuds de cluster et vérifiez si le nouveau disque du serveur iSCSI est visible ou non.
Dans mes nœuds, /dev/sdb est le disque partagé du stockage iSCSI.
fdisk -l | grep -i sd
Sortie:disque / dev / sda:100 gib, 107374182400 octets, 209715200 Secteurs / Dev / SDA1 * 2048 2099199 2097152 1G 83 LINUX / DEV / SDA2 2099200 209715199 207616000 octets, 20963328 secteurs
Sur l'un de vos nœuds (Ex, node1), créez un système de fichiers pour que le serveur Web Apache contienne les fichiers du site Web. Nous allons créer un système de fichiers avec LVM.
[root@node1 ~]# pvcreate /dev/sdb
[root@node1 ~]# vgcreate vg_apache /dev/sdb
[root@node1 ~]# lvcreate -n lv_apache -l 100%FREE vg_apache
[root@node1 ~]# mkfs.ext4 /dev/vg_apache/lv_apache
Maintenant, allez sur un autre nœud et exécutez les commandes ci-dessous pour détecter le nouveau système de fichiers.
[root@node2 ~]# pvscan
[root@node2 ~]# vgscan
[root@node2 ~]# lvscan
Enfin, vérifiez le LVM que nous avons créé sur node1 est disponible sur un autre nœud (Ex. node2) en utilisant les commandes ci-dessous.
ls -al /dev/vg_apache/lv_apache
et
[root@node2 ~]# lvdisplay /dev/vg_apache/lv_apache
Sortie :_Vous devriez voir /dev/vg_apache/lv_apache sur node2.itzgeek.local_ --- Volume logique --- Chemin LV /dev/vg_apache/lv_apache Nom LV lv_apache Nom VG vg_apache UUID LV gXeaoB-VlN1-zWSW- 2VnZ-RpmW-iDeC-kQOxZE LV Write Access read/write LV Creation host, time node1.itzgeek.local, 2020-03-30 08:08:17 -0400 LV Status NOT available LV Size 9.96 GiB Current LE 2551 Segments 1 Allocation hériter des secteurs de lecture anticipée autoSi le système n'affiche pas le volume logique ou le fichier de périphérique introuvable, envisagez de redémarrer le deuxième nœud.
Entrée de l'hôte
Créez une entrée d'hôte pour chaque nœud sur tous les nœuds. Le cluster utilisera le nom d'hôte pour communiquer entre eux.
vi /etc/hosts
Les entrées d'hôte seront quelque chose comme ci-dessous.
192.168.0.11 node1.itzgeek.local node1
192.168.0.12 node2.itzgeek.local node2
Installer des packages
Les packages de cluster sont disponibles dans le référentiel haute disponibilité. Configurez donc le référentiel haute disponibilité sur votre système.
CentOS 8
dnf config-manager --set-enabled HighAvailability
RHEL 8
Activez l'abonnement Red Hat sur RHEL 8, puis activez un référentiel haute disponibilité pour télécharger les packages de cluster depuis Red Hat.
subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
Installez les packages de cluster (pacemaker) avec tous les agents fence disponibles sur tous les nœuds à l'aide de la commande ci-dessous.
dnf install -y pcs fence-agents-all pcp-zeroconf
Ajoutez une règle de pare-feu pour permettre à toutes les applications à haute disponibilité d'avoir une bonne communication entre les nœuds. Vous pouvez ignorer cette étape si le système n'a pas activé le pare-feu.
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --add-service=high-availability
firewall-cmd --reload
Définissez un mot de passe pour l'utilisateur hacluster.
Ce compte d'utilisateur est un compte d'administration de cluster. Nous vous suggérons de définir le même mot de passe pour tous les nœuds.
passwd hacluster
Démarrez le service de cluster et activez-le pour qu'il démarre automatiquement au démarrage du système.
systemctl start pcsd
systemctl enable pcsd
N'oubliez pas :vous devez exécuter les commandes ci-dessus sur tous les nœuds de votre cluster.
Créer un cluster haute disponibilité
Autorisez les nœuds à l'aide de la commande ci-dessous. Exécutez la commande ci-dessous dans l'un des nœuds pour autoriser les nœuds.
[root@node1 ~]# pcs host auth node1.itzgeek.local node2.itzgeek.local
Sortie : Nom d'utilisateur :haclusterPassword :<Créez un cluster. Modifiez le nom du cluster itzgeek_cluster selon vos besoins.
[root@node1 ~]# configuration du cluster pcs itzgeek_cluster --start node1.itzgeek.local node2.itzgeek.localSortie :Aucune adresse spécifiée pour l'hôte 'node1.itzgeek.local', en utilisant 'node1.itzgeek.local'Aucune adresse spécifiée pour l'hôte 'node2.itzgeek.local', en utilisant 'node2.itzgeek.local'Détruire le cluster sur hôtes :'node1.itzgeek.local', 'node2.itzgeek.local'...node1.itzgeek.local :cluster détruit avec succèsnode2.itzgeek.local :cluster détruit avec succèsRequesting remove 'pcsd settings' from 'node1.itzgeek.local' , 'node2.itzgeek.local'node1.itzgeek.local :suppression réussie du fichier 'pcsd settings'node2.itzgeek.local :suppression réussie du fichier 'pcsd settings'Envoi de 'corosync authkey', 'pacemaker authkey' à ' node1.itzgeek.local', 'node2.itzgeek.local'node1.itzgeek.local :distribution réussie du fichier 'corosync authkey'node1.itzgeek.local :distribution réussie du fichier 'pacemaker authkey'node2.itzgeek.local :distribution réussie du fichier 'corosync authkey'node2.itzgeek.local :distribution réussie du fichier 'pacemaker authkey'Envoi de 'corosync.conf' à 'node 1.itzgeek.local', 'node2.itzgeek.local'node1.itzgeek.local :distribution réussie du fichier 'corosync.conf'node2.itzgeek.local :distribution réussie du fichier 'corosync.conf'Cluster a été réussi configuration.Démarrage du cluster sur les hôtes :'node1.itzgeek.local', 'node2.itzgeek.local'...Activez le cluster pour qu'il démarre au démarrage du système.
[root@node1 ~]# pcs cluster enable --all
Sortie :node1.itzgeek.local :cluster activénode2.itzgeek.local :cluster activéUtilisez la commande ci-dessous pour obtenir l'état du cluster.
[root@node1 ~]# pcs cluster status
Sortie :État du cluster :Pile :corosync DC actuel :node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition avec quorum Dernière mise à jour :lun. 30 mars 08:28:08 2020 Dernière changement :Mon Mar 30 08:27:25 2020 par hacluster via crmd sur node1.itzgeek.local 2 nœuds configurés 0 ressources configuréesPCSD Statut :node1.itzgeek.local :En ligne node2.itzgeek.local :En ligneExécutez la commande ci-dessous pour obtenir des informations détaillées sur le cluster, notamment ses ressources, l'état du stimulateur cardiaque et les détails des nœuds.
[root@node1 ~]# pcs status
Sortie :Nom du cluster :itzgeek_clusterWARNINGS :Aucun appareil stonith et stonith-enabled n'est pas falseStack :corosyncCurrent DC :node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition avec quorumDernière mise à jour :lun 30 mars 08:33:37 2020Dernière modification :lundi 30 mars 08:27:25 2020 par hacluster via crmd sur node1.itzgeek.local2 nœuds configurés0 ressources configuréesEn ligne :[ node1.itzgeek.local node2.itzgeek.local ]Aucune ressourceStatut du démon :corosync :actif/activé stimulateur :actif/activé pcsd :actif/activéDispositifs de clôture
Le dispositif de clôture est un dispositif matériel qui aide à déconnecter le nœud problématique en réinitialisant le nœud/en déconnectant le stockage partagé de son accès. Ce cluster de démonstration s'exécute au-dessus de VMware et n'a aucun périphérique de clôture externe à configurer. Cependant, vous pouvez suivre ce guide pour configurer un dispositif d'escrime.
Puisque nous n'utilisons pas de clôture, désactivez-la (STONITH). Vous devez désactiver le fencing pour démarrer les ressources du cluster, mais la désactivation de STONITH dans l'environnement de production n'est pas recommandée.
[root@node1 ~]# pcs property set stonith-enabled=false
Ressources du cluster
Préparer les ressources
Serveur Web Apache
Installez le serveur Web Apache sur les deux nœuds.
dnf install -y httpd
Modifiez le fichier de configuration.
vi /etc/httpd/conf/httpd.conf
Ajoutez le contenu ci-dessous à la fin du fichier sur les deux nœuds du cluster.
<Location /server-status> SetHandler server-status Require local </Location>
Modifiez la configuration logrotate du serveur Web Apache pour indiquer de ne pas utiliser systemd car la ressource de cluster n'utilise pas systemd pour recharger le service.
Modifiez la ligne ci-dessous.
DE :
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
À :
/usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -c "PidFile /var/run/httpd.pid" -k graceful > /dev/null 2>/dev/null || true
Maintenant, nous allons utiliser le stockage partagé pour stocker le fichier de contenu Web (HTML). Effectuez l'opération ci-dessous dans l'un des nœuds.
[root@node1 ~]# mount /dev/vg_apache/lv_apache /var/www/ [root@node1 ~]# mkdir /var/www/html [root@node1 ~]# mkdir /var/www/cgi-bin [root@node1 ~]# mkdir /var/www/error [root@node1 ~]# restorecon -R /var/www [root@node1 ~]# cat <<-END >/var/www/html/index.html <html> <body>Hello, Welcome!. This Page Is Served By Red Hat Hight Availability Cluster</body> </html> END [root@node1 ~]# umount /var/www
Autoriser le service Apache dans le pare-feu sur les deux nœuds.
firewall-cmd --permanent --add-service=http firewall-cmd --reload
Créer des ressources
Créez une ressource de système de fichiers pour le serveur Apache. Utilisez le stockage provenant du serveur iSCSI.
[root@node1 ~]# ressource pcs crée httpd_fs Filesystem device="/dev/mapper/vg_apache-lv_apache" directory="/var/www" fstype="ext4" --group apacheSortie :Nom d'agent supposé 'ocf:`heartbeat`:Filesystem' (déduit de 'Filesystem')Créez une ressource d'adresse IP. Cette adresse IP agira comme une adresse IP virtuelle pour Apache, et les clients utiliseront cette adresse IP pour accéder au contenu Web au lieu de l'adresse IP d'un nœud individuel.
[root@node1 ~]# ressource pcs créer httpd_vip IPaddr2 ip=192.168.0.100 cidr_netmask=24 --group apacheSortie :nom d'agent supposé 'ocf:`heartbeat`:IPaddr2' (déduit de 'IPaddr2')Créez une ressource Apache pour surveiller l'état du serveur Apache qui déplacera la ressource vers un autre nœud en cas de panne.
[root@node1 ~]# ressource pcs créer httpd_ser apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group apacheSortie :Nom supposé de l'agent 'ocf:`heartbeat`:apache' (déduit de 'apache')Vérifiez l'état du cluster.
[root@node1 ~]# pcs status
Sortie :Nom du cluster :itzgeek_clusterStack :corosyncCurrent DC :node1.itzgeek.local (version 2.0.2-3.el8_1.2-744a30d655) - partition avec quorumDernière mise à jour :lundi 30 mars 09:02:07 2020Dernière modification :lundi 30 mars 09:01:46 2020 par root via cibadmin sur node1.itzgeek.local2 nœuds configurés3 ressources configuréesEn ligne :[ node1.itzgeek.local node2.itzgeek.local ]Liste complète des ressources :Resource Group :apache httpd_fs (ocf:💓Filesystem ):Node1.itzgeek.local httpd_vip (ocf:💓IPaddr2) :Node1.itzgeek.local httpd_ser (ocf:💓apache) :Node1.itzgeek.localDaemon démarré Statut :corosync :stimulateur cardiaque actif/activé :pcsd actif/activé :actif/activéVérifier le cluster haute disponibilité
Une fois le cluster opérationnel, faites pointer un navigateur Web vers l'adresse IP virtuelle Apache. Vous devriez obtenir une page Web comme ci-dessous.
Tester le cluster haute disponibilité
Vérifions le basculement des ressources en mettant le nœud actif (où toutes les ressources sont en cours d'exécution) en mode veille.
[root@node1 ~]# pcs node standby node1.itzgeek.local
Commandes de cluster importantes
Lister les ressources du cluster :
pcs resource status
Redémarrer la ressource du cluster :
pcs resource restart <resource_name>
Déplacez la ressource d'un nœud :
pcs resource move <resource_group> <destination_node_name>
Mettre le cluster en maintenance :
pcs property set maintenance-mode=true
Supprimer le cluster de la maintenance :
pcs property set maintenance-mode=false
Démarrez le nœud de cluster :
pcs cluster start <node_name>
Arrêter le nœud du cluster :
pcs cluster stop <node_name>
Démarrer le cluster :
pcs cluster start --all
Arrêter le cluster :
pcs cluster stop --all
Détruire le cluster :
pcs cluster destroy <cluster_name>
Interface utilisateur Web du cluster
L'interface utilisateur Web pcsd vous aide à créer, configurer et gérer les clusters Pacemaker.
L'interface Web sera accessible une fois que vous aurez démarré le service pcsd sur le nœud et elle sera disponible sur le port numéro 2224.
https://node_name:2224Connectez-vous avec l'utilisateur administratif du cluster hacluster et son mot de passe.
Puisque nous avons déjà un cluster, cliquez sur Ajouter existant pour ajouter le cluster Pacemaker existant. Si vous souhaitez configurer un nouveau cluster, vous pouvez lire la documentation officielle.
Entrez l'un des nœuds de cluster pour détecter un cluster existant.
Dans une minute ou deux, vous verrez votre cluster existant dans l'interface utilisateur Web.
Sélectionnez le cluster pour en savoir plus sur les informations du cluster.
Cliquez sur le nom du cluster pour voir les détails du nœud.
Cliquez sur les ressources du cluster pour voir la liste des ressources et leurs détails.
Référence :Documentation Red Hat.
Conclusion
C'est tout. Dans cet article, vous avez appris à configurer un cluster haute disponibilité sur CentOS 8/RHEL 8.