Comment créer une configuration haute disponibilité avec pacemaker, Corosync et IP flottantes sur CentOS 7

introduction

Corosync est un moteur de cluster open source utilisé pour implémenter la haute disponibilité dans les applications. Communément appelémessaging layer, Corosync fournit une appartenance à un cluster et un modèle de communication fermé pour créer des machines d'état répliquées, sur lesquelles les gestionnaires de ressources de cluster tels que Pacemaker peuvent s'exécuter. Corosync peut être considéré comme le système sous-jacent qui relie les nœuds du cluster, tandis que Pacemaker surveille le cluster et prend des mesures en cas de défaillance.

Ce tutoriel montrera comment utiliser Corosync et Pacemaker pour créer une infrastructure à haute disponibilité sur DigitalOcean avec des serveurs CentOS 7 et des adresses IP flottantes. Pour faciliter le processus de configuration et de gestion des nœuds de cluster, nous allons utiliser PCS, une interface de ligne de commande qui interagit avec Corosync et Pacemaker.

Conditions préalables

Pour suivre ce guide, vous aurez besoin de:

Lors de la création de ces gouttelettes, utilisez des noms d'hôte descriptifs pour les identifier de manière unique. Pour ce didacticiel, nous appellerons ces Dropletsprimary etsecondary.

Lorsque vous êtes prêt à continuer, assurez-vous que vous êtes connecté à vos deux serveurs avec votre utilisateursudo.

[[step-1 -—- set-up-nginx]] == Étape 1 - Configurer Nginx

Pour accélérer les choses, nous allons utiliser un simpleshell script qui installe Nginx et met en place une page Web de base contenant des informations sur ce serveur spécifique. De cette façon, nous pouvons facilement identifier le serveur actuellement actif dans notre configuration IP flottante. Le script utilise lesMetadata service de DigitalOcean pour récupérer l'adresse IP et le nom d'hôte du Droplet.

Pour exécuter le script, exécutez les commandes suivantes sur les deux serveurs:

sudo curl -L -o install.sh http://do.co/nginx-centos
sudo chmod +x install.sh
sudo ./install.sh

Une fois l'exécution du script terminée, l'accès à l'un des deux gouttelettes via son adresse IP publique à partir d'un navigateur doit vous donner une page Web de base indiquant le nom d'hôte et l'adresse IP de la fillette.

Afin de réduire la complexité de ce didacticiel, nous utiliserons de simples serveurs Web comme nœuds de cluster. Dans un environnement de production, les nœuds sont généralement configurés pour agir comme des équilibreurs de charge redondants. Pour plus d'informations sur les équilibreurs de charge, consultez notre guideIntroduction to HAProxy and Load Balancing Concepts.

[[step-2 -—- create-and-assign-floating-ip]] == Étape 2 - Créer et attribuer une adresse IP flottante

La première étape consiste à créer une adresse IP flottante et à l'attribuer au serveurprimary. Dans le panneau de configuration DigitalOcean, cliquez surNetworking dans le menu supérieur, puis surFloating IPs dans le menu latéral.

Vous devriez voir une page comme celle-ci:

Floating IPs Control Panel

Sélectionnez votre serveurprimary et cliquez sur le bouton «Assign Floating IP». Une fois que l'adresse IP flottante a été attribuée, vérifiez que vous pouvez atteindre le dropletprimary en accédant à l'adresse IP flottante depuis votre navigateur:

http://your_floating_ip

Vous devriez voir la page d'index de votre Droplet principal.

[[step-3 -—- create-ip-reinassignment-script]] == Étape 3 - Créer un script de réattribution IP

Dans cette étape, nous allons montrer comment l’API DigitalOcean peut être utilisée pour réaffecter une adresse IP flottante à un autre Droplet. Ensuite, nous allons configurer Pacemaker pour exécuter ce script lorsque le cluster détecte une défaillance de l’un des nœuds.

Pour notre exemple, nous allons utiliser un script Python de base qui utilise comme argument une adresse IP flottante et un ID de droplet afin d’attribuer l’adresse IP flottante à la droplet donnée. L’identifiant de Droplet peut être extrait de Droplet même à l’aide du service de métadonnées.

Commençons par télécharger le scriptassign-ip et le rendre exécutable. N'hésitez pas à revoir le contenu du script avant de le télécharger.

Les deux commandes suivantes doivent être exécutées surboth servers (primaire et secondaire):

sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip
sudo chmod +x /usr/local/bin/assign-ip

Le scriptassign-ip nécessite les informations suivantes pour être exécuté:

  • Floating IP: le premier argument du script, l'adresse IP flottante attribuée

  • Droplet ID: deuxième argument du script, l'ID de droplet auquel l'adresse IP flottante doit être attribuée

  • DigitalOcean API Token: transmise comme variable d'environnement DO_TOKEN, votre jeton d'accès personnel DigitalOcean en lecture / écriture

Test du script de réassignation IP

Pour surveiller la réaffectation IP en cours, nous pouvons utiliser une commandecurl pour accéder à l'adresse IP flottante dans une boucle, avec un intervalle de 1 seconde entre chaque requête.

Ouvrez un nouveau terminal local et exécutez la commande suivante, en veillant à remplacerfloating_IP_address par votre adresse IP flottante réelle:

while true; do curl floating_IP_address; sleep 1; done

Cette commande continuera à s'exécuter dans le terminal actif jusqu'à ce qu'elle soit interrompue par unCTRL+C. Il récupère simplement la page Web hébergée par le serveur auquel votre adresse IP flottante est actuellement attribuée. Le résultat devrait ressembler à ceci:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...

Maintenant, exécutons le scriptassign-ip pour réaffecter l'adresse IP flottante au dropletsecondary. Nous allons utiliser le service de métadonnées de DigitalOcean pour récupérer l’ID Droplet actuel et l’utiliser comme argument du script. L’extraction de l’ID de Droplet à partir du service de métadonnées peut être effectuée avec:

curl -s http://169.254.169.254/metadata/v1/id

169.254.169.254 est une adresse IP statique utilisée par le service de métadonnées et ne doit donc pas être modifiée. Ces informations ne sont disponibles que dans Droplet.

Avant de pouvoir exécuter le script, nous devons définir la variable d'environnementDO_TOKEN contenant le jeton d'API DigitalOcean. Exécutez la commande suivante à partir du serveursecondary et n'oubliez pas de remplaceryour_api_token par votre jeton d'accès personnel en lecture / écriture dans l'API DigitalOcean:

export DO_TOKEN=your_api_token

Toujours sur le serveursecondary, exécutez le scriptassign-ip en remplaçantfloating_IP_address par votre adresse IP flottante:

assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress

En surveillant la sortie produite par la commandecurl sur votre terminal local, vous remarquerez que l'IP flottante changera son adresse IP attribuée et commencera à pointer vers la gouttelettesecondary après quelques secondes:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address

Vous pouvez également accéder à l'adresse IP flottante à partir de votre navigateur. Vous devriez obtenir une page affichant les informations du dropletsecondary. Cela signifie que le script de réaffectation a fonctionné comme prévu.

Pour réaffecter l'adresse IP flottante au serveur principal, répétez le processus en 2 étapes mais cette fois à partir du dropletprimary:

export DO_TOKEN=your_api_token
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`

Au bout de quelques secondes, l’adresse IP flottante devrait à nouveau pointer vers votre droplet principal.

[[step-4 -—- install-corosync-pacemaker-and-pcs]] == Étape 4 - Installer Corosync, Pacemaker et PCS

La prochaine étape consiste à installer Corosync, Pacemaker et PCS sur vos gouttelettes. Corosync étant une dépendance de Pacemaker, il est généralement préférable d’installer simplement Pacemaker et de laisser le système choisir la version de Corosync à installer.

Installez les packages logiciels surboth servers:

sudo yum install pacemaker pcs

L'utilitaire PCS crée un nouvel utilisateur système lors de l'installation, nomméhacluster, avec un mot de passe désactivé. Nous devons définir un mot de passe pour cet utilisateur sur les deux serveurs. Cela permettra à PCS d'effectuer des tâches telles que la synchronisation de la configuration de Corosync sur plusieurs nœuds, ainsi que le démarrage et l'arrêt du cluster.

Surboth servers, exécutez:

passwd hacluster

Vous devez utiliser lessame password sur les deux serveurs. Nous allons utiliser ce mot de passe pour configurer le cluster à l'étape suivante.

[.note] #L'utilisateurhacluster n'a pas de shell interactif ni de répertoire personnel associé à son compte, ce qui signifie qu'il n'est pas possible de se connecter au serveur en utilisant ses informations d'identification.
#

[[step-5 -—- set-up-the-cluster]] == Étape 5 - Configurer le cluster

Maintenant que Corosync, Pacemaker et PCS sont installés sur les deux serveurs, nous pouvons configurer le cluster.

Activation et démarrage de PCS

Pour activer et démarrer le démon PCS, exécutez ce qui suit surboth servers:

sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service

Obtention de l'adresse IP du réseau privé pour chaque nœud

Pour améliorer les performances et la sécurité du réseau, les nœuds doivent être connectés à l'aide desprivate network. Le moyen le plus simple d’obtenir l’adresse IP du réseau privé de Droplet consiste à utiliser le service de métadonnées. Sur chaque serveur, exécutez la commande suivante:

curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo

Cette commande affichera simplement l’adresse IP du réseau privé du Droplet auquel vous êtes connecté. Vous pouvez également trouver ces informations sur la page de votre Droplet dans le panneau de configuration DigitalOcean (sous l'ongletSettings).

Rassemblez l'adresse IP du réseau privé des deux gouttelettes pour les étapes suivantes.

Authentification des nœuds de cluster

Authentifiez les nœuds du cluster à l'aide du nom d'utilisateurhacluster et du même mot de passe que vous avez défini à l'étape 3. Vous devrez fournir l'adresse IP du réseau privé pour chaque nœud. À partir du serveurprimary, exécutez:

sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address

Vous devriez obtenir une sortie comme ceci:

OutputUsername: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized

Génération de la configuration Corosync

Toujours sur le serveurprimary, générez le fichier de configuration Corosync avec la commande suivante:

sudo pcs cluster setup --name webcluster \
primary_private_IP_address secondary_private_IP_address

La sortie devrait ressembler à ceci:

OutputShutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop  pacemaker.service
Redirecting to /bin/systemctl stop  corosync.service
Killing any remaining services...
Removing all cluster configuration files...
primary_private_IP_address: Succeeded
secondary_private_IP_address: Succeeded
Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Restaring pcsd on the nodes in order to reload the certificates...
primary_private_IP_address: Success
secondary_private_IP_address: Success

Cela générera un nouveau fichier de configuration situé à/etc/corosync/corosync.conf basé sur les paramètres fournis à la commandepcs cluster setup. Nous avons utiliséwebcluster comme nom de cluster dans cet exemple, mais vous pouvez utiliser le nom de votre choix.

Démarrer le cluster

Pour démarrer le cluster que vous venez de configurer, exécutez la commande suivante à partir du serveurprimary:

sudo pcs cluster start --all
Outputprimary_private_IP_address: Starting Cluster...
secondary_private_IP_address: Starting Cluster...

Vous pouvez maintenant confirmer que les deux nœuds ont rejoint le cluster en exécutant la commande suivante sur l’un des serveurs:

sudo pcs status corosync
OutputMembership information
----------------------
    Nodeid      Votes Name
         2          1 secondary_private_IP_address
         1          1 primary_private_IP_address (local)

Pour obtenir plus d'informations sur l'état actuel du cluster, vous pouvez exécuter:

sudo pcs cluster status

Le résultat devrait ressembler à ceci:

OutputCluster Status:
 Last updated: Fri Dec 11 11:59:09 2015     Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
 Stack: corosync
 Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
 2 nodes and 0 resources configured
 Online: [ primary secondary ]

PCSD Status:
  primary (primary_private_IP_address): Online
  secondary (secondary_private_IP_address): Online

Vous pouvez maintenant activer les servicescorosync etpacemaker pour vous assurer qu'ils démarreront au démarrage du système. Exécutez ce qui suit surboth servers:

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service

Désactiver STONITH

STONITH (Tirer sur l'autre nœud de la tête) est une technique de protection destinée à empêcher la corruption des données provoquée par des nœuds défectueux d'un cluster qui ne répondent pas mais qui continuent d'accéder aux données de l'application. Étant donné que sa configuration dépend de nombreux facteurs hors de ce guide, nous allons désactiver STONITH dans la configuration de notre cluster.

Pour désactiver STONITH, exécutez la commande suivante sur l’un des droplets, qu’il soit primaire ou secondaire:

sudo pcs property set stonith-enabled=false

[[step-6 -—- create-floating-ip-reaignment-resource-agent]] == Étape 6 - Créer un agent de ressource de réattribution IP flottante

Il ne reste plus qu'à configurer l'agent de ressources qui exécutera le script de réaffectation IP lorsqu'une défaillance est détectée dans l'un des nœuds du cluster. L'agent de ressources est responsable de la création d'une interface entre le cluster et la ressource elle-même. Dans notre cas, la ressource est le script assign-ip. Le cluster s'appuie sur l'agent de ressources pour exécuter les bonnes procédures lorsqu'il reçoit une commande de démarrage, d'arrêt ou de surveillance. Il existe différents types d'agents de ressources, mais le plus courant est le standard OCF (Open Cluster Framework).

Nous allons créer un nouvel agent de ressources OCF pour gérer le serviceassign-ip sur les deux serveurs.

Tout d’abord, créez le répertoire qui contiendra l’agent de ressources. Le nom de répertoire sera utilisé par Pacemaker comme identifiant pour cet agent personnalisé. Exécutez ce qui suit surboth servers:

sudo mkdir /usr/lib/ocf/resource.d/digitalocean

Ensuite, téléchargez le script de l'agent de ressources FloatIP et placez-le dans le répertoire nouvellement créé, surboth servers:

sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip

Rendez maintenant le script exécutable avec la commande suivante surboth servers:

sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip

Nous devons toujours inscrire l'agent de ressources dans le cluster à l'aide de l'utilitaire PCS. La commande suivante doit être exécutée à partir deone des nœuds (n'oubliez pas de remplaceryour_api_token par votre jeton API DigitalOcean etfloating_IP_address par votre adresse IP flottante réelle):

sudo pcs resource create FloatIP ocf:digitalocean:floatip \
    params do_token=your_api_token \
    floating_ip=floating_IP_address

La ressource doit maintenant être enregistrée et active dans le cluster. Vous pouvez vérifier les ressources enregistrées à partir de l'un des nœuds avec la commandepcs status:

sudo pcs status
Output...
2 nodes and 1 resource configured

Online: [ primary secondary ]

Full list of resources:

 FloatIP    (ocf::digitalocean:floatip):    Started primary

...

[[step-7 -—- test-failover]] == Étape 7 - Test de basculement

Votre cluster doit maintenant être prêt à gérer une défaillance de nœud. Un moyen simple de tester le basculement consiste à redémarrer le serveur actuellement actif dans votre configuration IP flottante. Si vous avez suivi toutes les étapes de ce didacticiel, il doit s'agir du serveurprimary.

Encore une fois, surveillons la réaffectation IP en utilisant une commandecurl dans une boucle. Depuis un terminal local, lancez:

while true; do curl floating_IP_address; sleep 1; done

À partir du serveurprimary, exécutez une commande de redémarrage:

sudo reboot

Après quelques instants, le serveur principal devrait devenir indisponible. Cela entraînera le serveur secondaire à prendre le relais en tant que nœud actif. Vous devriez voir une sortie similaire à celle-ci dans votre terminal local exécutantcurl:

Output...
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
curl: (7) Failed connect to floating_IP_address; Connection refused
Droplet: secondary, IP Address: secondary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
…

[.note] #L'erreur «Connexion refusée» se produit lorsque la demande est faite juste avant ou au même moment où la réaffectation IP est en cours. Il peut ou non apparaître dans la sortie.
#

Si vous souhaitez renvoyer l'adresse IP flottante vers le nœud principal tout en testant également le basculement sur le nœud secondaire, répétez simplement le processus, mais cette fois à partir du dropletsecondary:

sudo reboot

Conclusion

Dans ce guide, nous avons vu comment les adresses IP flottantes peuvent être utilisées avec Corosync, Pacemaker et PCS pour créer un environnement de serveur Web à haute disponibilité sur des serveurs CentOS 7. Nous avons utilisé une infrastructure assez simple pour démontrer l'utilisation des adresses IP flottantes, mais cette configuration peut être adaptée pour implémenter la haute disponibilité à n'importe quel niveau de votre pile d'applications.

Related