Comment créer une configuration haute disponibilité avec des IP pulsées et flottantes sur Ubuntu 14.04

introduction

Heartbeat est un programme open source offrant des fonctionnalités d’infrastructure de cluster (appartenance à un cluster et messagerie vers des serveurs clients), composant essentiel d’une infrastructure de serveur haute disponibilité. Heartbeat est généralement utilisé avec un gestionnaire de ressources en cluster (CRM), tel que Pacemaker, pour réaliser une configuration HA complète. Toutefois, dans ce didacticiel, nous montrerons comment créer une configuration de serveur haute disponibilité à 2 nœuds en utilisant simplement Heartbeat et une adresse IP flottante DigitalOcean.

Si vous souhaitez créer une configuration HA plus robuste, envisagez d’utiliser https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and -floating-ips-on-ubuntu-14-04 [Corosync et Pacemaker] ou https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-and-floating-ips-on-ubuntu-14-04 [Keepalived].

Goal

Une fois l’opération terminée, la configuration HA comprendra deux serveurs Ubuntu 14.04 dans une configuration active / passive. Pour ce faire, vous devez pointer une adresse IP flottante, qui indique comment vos utilisateurs accéderont à vos services ou à votre site Web, pour qu’ils pointent vers le serveur principal ou actif, à moins qu’une défaillance ne soit détectée. Si le service Heartbeat détecte que le serveur principal est indisponible, le serveur secondaire exécutera automatiquement un script pour réaffecter l’IP flottante à lui-même via l’API DigitalOcean. Ainsi, le trafic réseau ultérieur à l’adresse IP flottante sera dirigé vers votre serveur secondaire, qui fera office de serveur actif jusqu’à ce que le serveur principal redevienne disponible (le serveur principal se réattribuera alors à cette adresse IP flottante).

image: https: //assets.digitalocean.com/articles/high_availability/ha-diagram-animated.gif [Diagramme actif / passif]

Pour atteindre cet objectif, nous allons suivre les étapes suivantes:

  • Créez 2 gouttelettes qui recevront du trafic

  • Créer une adresse IP flottante et l’affecter à l’un des droplets

  • Créer un enregistrement DNS A qui pointe vers une adresse IP flottante (facultatif)

  • Installer Heartbeat sur des gouttelettes

  • Configurer Heartbeat pour exécuter le service de réaffectation d’adresses IP flottantes

  • Créer un service de réattribution d’adresses IP flottantes

  • Tester le basculement

Conditions préalables

Pour automatiser la réaffectation d’adresses IP flottantes, nous devons utiliser l’API DigitalOcean. Cela signifie que vous devez générer un jeton d’accès personnel (PAT), qui est un jeton d’API pouvant être utilisé pour s’authentifier sur votre compte DigitalOcean, avec read et write access en suivant les instructions https://www.digitalocean.com/community. / tutorials / comment-utiliser-le-digitalocean-api-v2 # comment générer un jeton d’accès personnel [Comment générer un jeton d’accès personnel] du didacticiel de l’API. Votre PAT sera utilisé dans un script qui sera ajouté aux deux serveurs de votre cluster. Veillez donc à le conserver dans un endroit sûr, car il permet un accès complet à votre compte DigitalOcean, à des fins de référence.

En plus de l’API, ce didacticiel utilise les fonctionnalités DigitalOcean suivantes:

Veuillez lire les tutoriels liés si vous voulez en savoir plus à leur sujet.

Créer des gouttelettes

La première étape consiste à créer deux droplets Ubuntu dans le même centre de données, qui serviront de serveurs primaire et secondaire décrits ci-dessus. Dans notre exemple de configuration, nous les nommerons «primaire» et «secondaire» pour faciliter les recherches. Nous allons installer Nginx sur les deux gouttelettes et remplacer leurs pages d’index par des informations les identifiant de manière unique. Cela nous permettra de démontrer simplement que la configuration de la haute disponibilité fonctionne. Pour une configuration réelle, vos serveurs doivent exécuter le serveur Web ou l’équilibreur de charge de votre choix.

Créez deux gouttelettes Ubuntu 14.04, * primary * et * secondary *, avec ce script bash en tant que données utilisateur:

Exemple de données utilisateur

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

Cela installera Nginx et remplacera le contenu de + index.html + par le nom d’hôte et l’adresse IP du droplet (en référençant le service de métadonnées). Accéder à Droplet via son adresse IP publique affichera une page Web de base avec le nom d’hôte et l’adresse IP de Droplet, ce qui sera utile pour tester le point cible de Droplet à l’adresse IP flottante.

Créer une adresse IP flottante

Dans le Panneau de configuration DigitalOcean, cliquez sur * Réseau * dans le menu supérieur, puis sur * IP flottantes * dans le menu latéral.

image: https: //assets.digitalocean.com/site/ControlPanel/fip_no_floating_ips.png [Aucune adresse IP flottante]

Attribuez une adresse IP flottante à votre droplet * principal *, puis cliquez sur le bouton * Attribuer une adresse IP flottante *.

Une fois l’adresse IP flottante attribuée, vérifiez que vous pouvez atteindre le droplet auquel il a été attribué en le visitant dans un navigateur Web.

http://

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

Configurer DNS (facultatif)

Si vous souhaitez pouvoir accéder à votre configuration haute disponibilité via un nom de domaine, créez un enregistrement * A * dans votre DNS qui pointe votre domaine vers votre adresse IP flottante. Si votre domaine utilise les serveurs de noms de DigitalOcean, suivez https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean#step-three%E2%80%94configure. -your-domain [étape trois] du tutoriel Comment configurer un nom d’hôte avec DigitalOcean. Une fois que cela se propage, vous pouvez accéder à votre serveur actif via le nom de domaine.

L’exemple de nom de domaine que nous allons utiliser est + exemple.com +. Si vous n’avez pas de nom de domaine pour le moment, vous devriez plutôt utiliser l’adresse IP flottante.

Installer Heartbeat

L’étape suivante consiste à installer Heartbeat sur les deux serveurs. Le moyen le plus simple d’installer Heartbeat est d’utiliser apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Heartbeat est maintenant installé mais il doit être configuré avant de pouvoir faire quoi que ce soit.

Configurer le battement de coeur

Pour que notre cluster souhaité soit opérationnel, nous devons configurer ces fichiers de configuration Heartbeat dans + / etc / ha.d +, de manière identique sur les deux serveurs:

  1. * ha.cf: * Configuration globale du cluster Heartbeat, y compris ses nœuds membres

  2. * authkeys: * contient une clé de sécurité qui fournit aux nœuds un moyen de s’authentifier auprès du cluster

  3. * haresources: * Spécifie les services gérés par le cluster et le nœud qui est le propriétaire préféré des services. Notez que ce fichier n’est pas utilisé dans une configuration utilisant un CRM comme Pacemaker.

Nous devrons également fournir un script qui effectuera la réaffectation d’adresses IP flottantes au cas où la disponibilité de la Droplet principale changerait.

Recueillir des informations sur les nœuds

Avant de configurer + ha.cf +, nous devrions rechercher les noms de chaque noeud. La pulsation nécessite que chaque nom de noeud corresponde à sa sortie + uname -n + respective.

Sur * les deux serveurs *, exécutez cette commande pour rechercher les noms de nœuds appropriés:

uname -n

Notez le résultat de la commande. Les exemples de noms de nœud sont «primaire» et «secondaire», ce qui correspond à ce que nous avons appelé les gouttelettes.

Nous devrons également rechercher l’interface réseau et l’adresse IP que chaque nœud utilisera pour communiquer avec le reste du cluster, afin de déterminer les nœuds disponibles. Vous pouvez utiliser n’importe quelle interface réseau, à condition que chaque nœud puisse atteindre les autres nœuds du cluster. Nous allons utiliser l’interface publique de nos gouttelettes, qui se trouve être + eth0 +.

Sur * les deux serveurs *, utilisez cette commande pour rechercher l’adresse IP de l’interface + eth0 + (ou recherchez-la dans le panneau de configuration de DigitalOcean):

ip addr show eth0
ip addr show eth0 output:2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff
   inet /18 brd 104.236.63.255 scope global eth0
      valid_lft forever preferred_lft forever
   inet 10.17.0.28/16 scope global eth0
      valid_lft forever preferred_lft forever
   inet6 fe80::601:76ff:fea5:4501/64 scope link
      valid_lft forever preferred_lft forever

Notez l’adresse IP de l’interface réseau (mise en évidence dans l’exemple). Assurez-vous d’obtenir les adresses IP des deux serveurs.

Créer un fichier ha.cf

Sur * les deux serveurs *, ouvrez + / etc / ha.d / ha.cf + dans votre éditeur favori. Nous allons utiliser + vi +:

sudo vi /etc/ha.d/ha.cf

Le fichier doit être nouveau et vide. Nous devons ajouter les interfaces réseau et les noms de chaque nœud de notre cluster.

Copiez et collez cette configuration dans le fichier, puis remplacez les noms de nœud et les adresses IP respectifs par les valeurs que nous avons précédemment consultées. Dans cet exemple, l’adresse IP de * primary * est «+ 104.236.6.11 » et l’adresse IP de * secondary * est « 104.236.6.22 +»:

node
ucast eth0
node
ucast eth0

Sauvegarder et quitter. Nous allons ensuite configurer la clé d’autorisation du cluster.

Créer un fichier clé d’authentification

La clé d’autorisation est utilisée pour permettre aux membres du cluster de rejoindre un cluster. Nous pouvons simplement générer une clé aléatoire à cette fin.

Sur le nœud * primaire *, exécutez ces commandes pour générer une clé d’autorisation appropriée dans une variable d’environnement nommée + AUTH_KEY +:

if [ -z "${AUTH_KEY}" ]; then
 export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
     | command openssl sha1 \
     | command cut --delimiter=' ' --fields=2)"
fi

Ensuite, écrivez le fichier + / etc / ha.d / authkeys + avec ces commandes:

sudo bash -c "{
 echo auth1
 echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

Vérifiez le contenu du fichier + authkeys + comme ceci:

sudo cat /etc/ha.d/authkeys

Cela devrait ressembler à quelque chose comme ça (avec une clé d’autorisation différente):

/etc/ha.d/authkeys example:auth1
1 sha1

Assurez-vous que le fichier est uniquement lisible par root:

sudo chmod 600 /etc/ha.d/authkeys

Copiez maintenant le fichier + / etc / ha.d / authkeys + de votre nœud principal vers votre nœud secondaire. Vous pouvez le faire manuellement ou avec + scp +.

Sur le serveur * secondaire *, assurez-vous de définir les autorisations du fichier + authkeys +:

sudo chmod 600 /etc/ha.d/authkeys

Les deux serveurs doivent avoir un fichier + / etc / ha.d / authkeys + identique.

Créer un fichier haresources

Le fichier + haresources + spécifie * les hôtes préférés * associés aux services gérés par le cluster. L’hôte préféré est le nœud qui should doit exécuter le (s) service (s) associé (s) si le nœud est disponible. Si l’hôte préféré * n’est pas * disponible, c’est-à-dire il n’est pas accessible par le cluster, l’un des autres nœuds prendra le relais. En d’autres termes, le serveur secondaire prendra le relais si le serveur principal tombe en panne.

Sur * les deux serveurs *, ouvrez le fichier + haresources + dans votre éditeur favori. Nous allons utiliser + vi +:

sudo vi /etc/ha.d/haresources

Maintenant, ajoutez cette ligne au fichier en remplaçant par le nom de votre noeud principal:

/etc/ha.d/haresources

floatip

Sauvegarder et quitter. Cela configure le serveur * primaire * en tant qu’hôte préféré du service + floatip +, qui n’est actuellement pas défini. Configurons ensuite le service + floatip +.

Créer un service de réattribution d’adresses IP flottantes

Notre cluster Heartbeat est configuré pour maintenir le service + floatip +, qu’un nœud peut utiliser pour s’assigner l’adresse IP flottante, mais nous devons tout de même créer le service. Avant de configurer le service lui-même, toutefois, créons un script qui affectera l’adresse IP flottante, via l’API DigitalOcean, au nœud qui l’exécute. Ensuite, nous allons créer le service + floatip + qui exécutera le script de réaffectation d’adresse IP flottante.

Créer un script assign-ip

Dans notre exemple, nous allons télécharger un script Python de base qui attribue une adresse IP flottante à un ID de droplet donné, à l’aide de l’API DigitalOcean.

Sur * les deux serveurs *, téléchargez le script Python + assign-ip +:

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

Sur * les deux serveurs *, rendez-le exécutable:

sudo chmod +x /usr/local/bin/assign-ip

L’utilisation du script + assign-ip + nécessite les informations suivantes:

  • * IP flottante: * Le premier argument du script, l’adresse IP flottante en cours d’attribution

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

  • * DigitalOcean PAT (jeton d’API): * Transmis en tant que variable d’environnement + DO_TOKEN +, votre PAT en lecture / écriture DigitalOcean

N’hésitez pas à revoir le contenu du script avant de continuer.

Nous sommes maintenant prêts à créer le service + floatip +.

Créer un service floatip

Pour créer le service + floatip +, il suffit de créer un script init qui appelle le script + assign-ip + que nous avons créé précédemment et qui répond aux sous-commandes + start + et + + stop + `. Ce script d’initialisation sera chargé de rechercher l’ID Droplet du serveur via le service de métadonnées Droplet. De plus, il faudra l’IP flottante qui sera réaffectée et le jeton de l’API DigitalOcean (le jeton d’accès personnel mentionné dans la section des conditions préalables).

Sur * les deux serveurs *, ajoutez open + / etc / init.d / floatip + dans un éditeur:

sudo vi /etc/init.d/floatip

Ensuite, copiez et collez dans ce script d’initialisation en remplaçant les parties en surbrillance par votre clé d’API DigitalOcean et l’adresse IP flottante à réaffecter:

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN=''
IP=''
ID=$(curl -s http://169.254.169.254/metadata/v1/id)

if [ "start" == "$param" ] ; then
 python /usr/local/bin/assign-ip $IP $ID
 exit 0
elif [ "stop" == "$param" ] ; then
 exit 0;
elif [ "status" == "$param" ] ; then
 exit 0;
else
 echo "no such command $param"
 exit 1;
fi

Sauvegarder et quitter.

Rendre le script exécutable:

sudo chmod u+x /etc/init.d/floatip

Lorsque ce service + floatip + est démarré, il appelle simplement le script Python + assign-ip + et attribue l’adresse IP flottante spécifiée au droplet ayant exécuté le script. C’est le script qui sera appelé par le serveur * secondaire * pour réaffecter l’IP flottante à lui-même en cas de défaillance du serveur * primaire *. De même, le même script sera utilisé par le serveur * primaire * pour récupérer l’IP flottante une fois qu’il rejoint le cluster.

Démarrer le battement de coeur

Maintenant que Heartbeat est configuré et que tous les scripts sur lesquels il s’appuie sont configurés, nous sommes prêts à démarrer le cluster Heartbeat!

Sur * les deux serveurs *, exécutez cette commande pour démarrer Heartbeat:

sudo service heartbeat start

Vous devriez voir la sortie comme ceci:

Heartbeat output:Starting High-Availability services: Done.

Notre configuration HA est maintenant terminée! Avant de continuer, vérifions que cela fonctionne comme prévu.

Tester la haute disponibilité

Il est important de tester le bon fonctionnement d’une installation à haute disponibilité. Faisons-le maintenant.

Actuellement, l’adresse IP flottante est attribuée au nœud * primaire *. Accéder maintenant à l’adresse IP flottante, via l’adresse IP ou par le nom de domaine qui le désigne, affiche simplement la page d’index du serveur * primaire *. Si vous avez utilisé l’exemple de script de données utilisateur, cela ressemblera à ceci:

Floating IP is pointing to primary serverDroplet: , IP Address:

Cela indique que l’adresse IP flottante est en fait affectée au droplet principal.

Maintenant ouvrons un terminal et utilisons + curl + pour accéder à l’IP Floating en boucle d’une seconde. Utilisez cette commande pour le faire, mais veillez à remplacer l’URL par votre domaine ou votre adresse IP flottante:

while true; do curl http://; sleep 1; done

Actuellement, cela produira le même nom et l’adresse IP de Droplet du serveur principal. Si nous provoquons l’échec du serveur principal, en le mettant hors tension ou en arrêtant le service Heartbeat, nous verrons si l’adresse IP flottante est réaffectée au serveur secondaire.

Allumons le serveur * primaire * maintenant. Faites-le via le Panneau de configuration DigitalOcean ou en exécutant cette commande sur le serveur principal:

sudo poweroff

Après quelques instants, le serveur principal devrait devenir indisponible. Faites attention à la sortie de la boucle + curl + qui est exécutée dans le terminal. Vous devriez remarquer une sortie qui ressemble à ceci:

curl loop output:Droplet: , IP Address:
...
curl: (7) Failed to connect to  port 80: Connection refused
Droplet: , IP Address:
Droplet: , IP Address:
...

C’est-à-dire que l’adresse IP flottante doit être réaffectée pour pointer vers l’adresse IP du serveur * secondaire *. Cela signifie que votre configuration HA fonctionne, puisqu’un basculement automatique réussi a eu lieu.

Vous pouvez ou ne pas voir l’erreur + Connection denied +, qui peut se produire si vous essayez d’accéder à l’adresse IP flottante entre l’échec du serveur principal et la fin de la réaffectation d’adresse IP flottante.

Vous pouvez maintenant mettre votre Droplet * primaire * sous tension, via le panneau de configuration de DigitalOcean. Étant donné que Heartbeat est configuré avec le Droplet principal comme * hôte * préféré pour exécuter le script de réaffectation d’adresse IP flottante, l’adresse IP flottante sera automatiquement redirigée vers le serveur principal dès qu’elle sera à nouveau disponible.

Conclusion

Toutes nos félicitations! Vous disposez maintenant d’une configuration de serveur haute disponibilité de base utilisant Heartbeat et d’une adresse IP flottante DigitalOcean.

Si vous souhaitez créer une configuration HA plus robuste, envisagez d’utiliser https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and -floating-ips-on-ubuntu-14-04 [Corosync et Pacemaker] ou https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-web-servers-with- keepalived-and-floating-ips-on-ubuntu-14-04 [Keepalived].

Si vous souhaitez étendre votre configuration Heartbeat, l’étape suivante consiste à remplacer l’exemple de configuration Nginx par un équilibreur de charge par proxy inverse. Vous pouvez utiliser Nginx ou HAProxy à cette fin. N’oubliez pas que vous souhaiterez lier votre équilibreur de charge à * l’adresse IP d’ancrage *, afin que vos utilisateurs ne puissent accéder à vos serveurs que via l’adresse IP flottante (et non via l’adresse IP publique de chaque serveur).