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

introduction

Heartbeat est un programme open source qui fournit des capacités d'infrastructure de cluster - appartenance au cluster et messagerie - aux serveurs clients. Ces fonctionnalités constituent un composant essentiel dans une infrastructure de serveur à haute disponibilité. Dans ce didacticiel, nous montrerons comment créer une configuration de serveur haute disponibilité à 2 nœuds en utilisant simplement Heartbeat et unDigitalOcean Floating IP.

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. Si vous cherchez à créer une configuration HA plus robuste, envisagez d'utiliserCorosync and Pacemaker ouKeepalived.

Goal

Une fois l'opération terminée, la configuration HA comprendra deux serveurs Ubuntu 16.04 dans une configuration active / passive. Ceci sera accompli en pointant une IP flottante, c'est-à-dire comment vos utilisateurs accéderont à vos services ou site Web, pour pointer 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).

Active/passive Diagram

[.note] #Note: Ce didacticiel est destiné à des fins de démonstration et ne couvre que certains des aspects de la configuration d'une solution haute disponibilité fiable.
Les principaux points à retenir de ce document sont les détails sur la façon d'installer nœuds actifs / passifs au niveau de la passerelle et pour les lier à une adresse IP flottante.
Pour simplifier le didacticiel, au lieu de configurer des équilibreurs de charge de proxy inverse sur chaque serveur, nous les configurerons pour répondre avec leurs nom d'hôte et adresse IP publique.
#

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’assigner à l’un des droplets

  • Créer un enregistrement DNS A qui pointe vers l'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éaffectation d'adresses IP flottantes

  • Tester le basculement

Avec cet objectif en tête, nous pouvons commencer à configurer notre configuration HA.

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 API qui peut être utilisé pour vous authentifier sur votre compte DigitalOcean, avec un accèsread etwrite. Vous pouvez y parvenir en suivant la sectionHow To Generate a Personal Access Token du didacticiel sur l'API. Votre PAT sera utilisé dans un script qui sera ajouté aux deux serveurs de votre cluster. Il est important de le conserver dans un endroit sûr, car cela permet un accès complet à votre compte DigitalOcean.

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 la référence. 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 de production, vos serveurs doivent exécuter le serveur Web ou l’équilibreur de charge de votre choix.

Créez deux droplets Ubuntu 16.04,primary etsecondary, avec ce script bash comme 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 > /var/www/html/index.html

Cela installera Nginx et remplacera le contenu deindex.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 surNetworking, dans le menu supérieur, puis surFloating IPs dans le sous-menu.

No Floating IPs

Attribuez une adresse IP flottante à votre dropletprimary, puis cliquez sur le boutonAssign Floating IP.

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://your_floating_ip

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

Configurer DNS (facultatif)

Si vous voulez pouvoir accéder à votre configuration HA via un nom de domaine, allez-y et créez unA record dans votre DNS qui pointe votre domaine vers votre adresse IP flottante. Si votre domaine utilise les serveurs de noms de DigitalOcean, suivez lesstep three du didacticiel 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 utiliserons estexample.com. Si vous n’avez pas encore de nom de domaine, 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 le cluster souhaité soit opérationnel, nous devons créer et configurer ces fichiers de configuration Heartbeat de la même manière dans les répertoires/etc/ha.ddes 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 configurerha.cf, nous devons rechercher les noms de chaque nœud. Heartbeat exige que chaque nom de nœud corresponde à leur sortieuname -n respective.

Surboth servers, 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.

Pour déterminer quels nœuds sont disponibles, nous devons également rechercher l'interface réseau et l'adresse IP que chaque nœud utilisera pour communiquer avec le reste du cluster. Vous pouvez utiliser n'importe quelle interface réseau, à condition que chaque nœud puisse atteindre les autres nœuds du cluster. Nous utiliserons l'interface publique de nos Droplets, qui se trouve êtreeth0.

Surboth servers, utilisez cette commande pour rechercher l'adresse IP de l'interfaceeth0 (ou recherchez-la dans le panneau de configuration DigitalOcean):

ip addr show eth0
ip addr show eth0 output:2: eth0:  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 198.51.100.5/24 brd 198.51.100.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

Surboth servers, ouvrez/etc/ha.d/ha.cf dans votre éditeur préféré. Nous allons utiliser nano:

sudo nano /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 deprimary est198.51.100.5 et l’adresse IP desecondary est198.51.100.6:

/etc/ha.d/ha.cf

node primary
ucast eth0 198.51.100.5
node secondary
ucast eth0 198.51.100.6

Enregistrez et quittez le fichier. 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œudprimary, exécutez ces commandes pour générer une clé d'autorisation appropriée dans une variable d'environnement nomméeAUTH_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 fichierauthkeys 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

auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

Assurez-vous que le fichier n'est lisible que par l'utilisateur 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 avecscp.

Sur le serveursecondary, assurez-vous de définir les autorisations du fichierauthkeys:

sudo chmod 600 /etc/ha.d/authkeys

À ce stade, les deux serveurs doivent avoir un fichier/etc/ha.d/authkeys identique.

Créer un fichier haresources

Le fichierharesources spécifiepreferred hosts associé aux services gérés par le cluster. L'hôte préféré est le nœud sur lequelshould exécute le ou les services associés si le nœud est disponible. Si l'hôte préféréis notest disponible, i.e. 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.

Surboth servers, ouvrez le fichierharesources dans votre éditeur préféré. Nous allons utiliser nano:

sudo nano /etc/ha.d/haresources

Ajoutez maintenant cette ligne au fichier, en substituant dans le nom de votre noeud principal s’il est différent:

/etc/ha.d/haresources

primary floatip

Enregistrez et quittez le fichier. Cela configure le serveurprimary en tant qu'hôte préféré pour le servicefloatip, qui n'est actuellement pas défini. Configurons ensuite le servicefloatip.

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

Notre cluster Heartbeat est configuré pour gérer le servicefloatip, qu'un nœud peut utiliser pour s'attribuer l'adresse IP flottante à lui-même, mais nous devons toujours 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 servicefloatip qui exécutera le script de réaffectation 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.

Surboth servers, téléchargez le script Pythonassign-ip:

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

Surboth servers, rendez-le exécutable:

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

Puisque notre script fait une requête à une API, nous aurons besoin de la bibliothèque PythonRequests installée:

sudo apt-get install python-requests

L'utilisation du scriptassign-ip nécessite les détails suivants:

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

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

  • DigitalOcean PAT (API token): Transmis comme variable d'environnementDO_TOKEN, votre PAT DigitalOcean en lecture / écriture

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

Nous sommes maintenant prêts à créer le servicefloatip.

Créer le servicefloatip

Pour créer le servicefloatip, tout ce que nous avons à faire est de créer un script init qui appelle le scriptassign-ip que nous avons créé précédemment et répond aux sous-commandesstart etstop. Ce script d'initialisation sera chargé de rechercher l'ID Droplet du serveur via le service de métadonnées Droplet. En outre, il faudra l'IP flottante à réaffecter et le jeton de l'API DigitalOcean (le jeton d'accès personnel mentionné dans la section des conditions préalables).

Surboth servers, ajoutez des/etc/init.d/floatip ouverts dans un éditeur:

sudo nano /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='your_DO_API_token'
IP='your_floating_IP_address'
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

Enregistrez et quittez le fichier.

Rendre le script exécutable:

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

Lorsque ce servicefloatip est démarré, il appellera simplement le script Python deassign-ip et attribuera l'adresse IP flottante spécifiée au droplet qui a exécuté le script. C'est le script qui sera appelé par le serveursecondary, si le serveurprimary échoue, pour réaffecter l'IP flottante à lui-même,. De même, le même script sera utilisé par le serveurprimary, pour récupérer l'adresse IP flottante, une fois qu'il rejoindra 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!

Surboth servers, exécutez cette commande pour démarrer Heartbeat:

sudo systemctl start heartbeat

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œudprimary. Accéder maintenant à l'IP flottante, via l'adresse IP ou par le nom de domaine qui pointe vers elle, affichera simplement la page d'index du serveurprimary. Si vous avez utilisé l'exemple de script de données utilisateur, cela ressemblera à ceci:

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

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

Maintenant, ouvrons un terminal local et utilisonscurl pour accéder à l'adresse IP flottante sur une 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://example.com; sleep 1; done

Actuellement, cela produira les mêmes nom et adresse IP du 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.

Redémarrons maintenant le serveurprimary. Faites-le via le Panneau de configuration DigitalOcean ou en exécutant cette commande sur le serveur principal:

sudo reboot

Après quelques instants, le serveur principal devrait devenir indisponible. Faites attention à la sortie de la bouclecurl qui s'exécute dans le terminal. Vous devriez remarquer une sortie qui ressemble à ceci:

curl loop output:Droplet: primary, IP Address: 198.51.100.5
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 198.51.100.6
Droplet: secondary, IP Address: 198.51.100.6
...

Autrement dit, l'adresse IP flottante doit être réaffectée pour pointer vers l'adresse IP du serveursecondary. Cela signifie que votre configuration HA fonctionne, puisqu'un basculement automatique réussi a eu lieu.

Vous pouvez ou non voir l'erreurConnection refused, qui peut se produire si vous essayez d'accéder à l'adresse IP flottante entre la défaillance du serveur principal et la fin de la réaffectation de l'adresse IP flottante.

Maintenant, vous pouvez mettre sous tension votreprimary Droplet, via le panneau de contrôle DigitalOcean. Étant donné que Heartbeat est configuré avec le Droplet principal en tant quepreferred host pour exécuter le script de réaffectation d'adresse IP flottante, l'adresse IP flottante pointera automatiquement vers le serveur principal dès qu'elle redeviendra 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 cherchez à créer une configuration HA plus robuste, envisagez d'utiliserCorosync and Pacemaker ouKeepalived.

Dans cet exemple, nous avons installé Nginx en tant qu'équilibreur de charge de base, mais si vous souhaitez améliorer votre configuration Heartbeat à l'aide d'un équilibreur de charge à proxy inverse, vous pouvez le faire en configurantNginx comme un seul, ou en utilisant HAProxy.

Veuillez garder à l'esprit qu'avec l'une ou l'autre des alternatives que vous choisissez d'utiliser, vous souhaiterez lier votre équilibreur de charge / proxy inverse auxanchor IP address 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).

Related