GNU/Linux >> Tutoriels Linux >  >> Linux

Keepalive et haute disponibilité :rubriques avancées

Si vous avez lu mon premier article sur l'utilisation de Keepalived pour gérer le basculement simple dans les clusters, vous vous souviendrez que VRRP utilise le concept de priorité pour déterminer quel serveur sera le maître actif. Le serveur avec la priorité la plus élevée "gagne" et agira en tant que maître, conservant le VIP et traitant les demandes. Keepalived fournit plusieurs méthodes utiles pour ajuster la priorité en fonction de l'état de votre système. Dans cet article, vous allez explorer plusieurs de ces mécanismes, ainsi que Keepalived la capacité d'exécuter des scripts lorsque l'état d'un serveur change.

Je ne montrerai que la configuration sur le serveur 1 pour ces exemples. À ce stade, vous êtes probablement à l'aise avec la configuration nécessaire sur le serveur 2 si vous avez lu toute la série. Si ce n'est pas le cas, prenez un moment pour revoir les premier et deuxième articles de cette série avant de continuer.

  • Utilisation de Keepalived pour gérer le basculement simple dans les clusters
  • Configuration d'un cluster Linux avec Keepalived :configuration de base

Symboles de réseau dans les diagrammes disponibles via VRT Network Equipment Extension, CC BY-SA 3.0.

Keepalived fait un excellent travail pour déclencher un basculement lorsque les publicités ne sont pas reçues, par exemple lorsque le maître actif meurt complètement ou est inaccessible pour une autre raison. Cependant, vous constaterez souvent que des mécanismes de déclenchement plus fins sont nécessaires. Par exemple, votre application peut exécuter ses propres vérifications de l'état pour déterminer la capacité de l'application à répondre aux demandes des clients. Vous ne voudriez pas qu'un serveur d'applications défectueux reste le maître actif simplement parce qu'il était actif et envoyait VRRP publicités.

Remarque :J'ai constaté que la version de Keepalived disponibles via les référentiels de packages standard contenaient des bogues qui empêchaient certains des exemples ci-dessous de fonctionner correctement. Si vous rencontrez des problèmes, vous pouvez installer Keepalived depuis la source, comme décrit dans l'article précédent.

Suivi des processus

L'un des Keepalived les plus courants Les configurations impliquent le suivi d'un processus sur le serveur pour déterminer la santé de l'hôte. Par exemple, vous pouvez configurer une paire de serveurs Web hautement disponibles et déclencher un basculement si Apache cesse de s'exécuter sur l'un d'entre eux.

Keepalived rend cela facile grâce à son track_process consignes de configuration. Dans l'exemple ci-dessous, j'ai configuré Keepalived pour regarder le httpd traiter avec un poids de 10. Tant que httpd est en cours d'exécution, la priorité annoncée sera 254 (244 + 10 =254). Si httpd s'arrête, la priorité passe à 244 et déclenche un basculement (en supposant qu'une configuration similaire existe sur le serveur2).

server1# cat keepalived.conf
vrrp_track_process track_apache {
      process httpd
      weight 10
}

vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 244
      advert_int 1
      authentication {
         auth_type PASS
         auth_pass 12345
      }
      virtual_ipaddress {
         192.168.122.200/24
      }
      track_process {
         track_apache
      }
}

Avec cette configuration en place (et Apache installé et exécuté sur les deux serveurs), vous pouvez tester un scénario de basculement en arrêtant Apache et en observant le passage du VIP du serveur1 au serveur2 :

server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 192.168.122.200/24 fe80::5054:ff:fe82:d66e/64

server1# systemctl stop httpd

server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 fe80::5054:ff:fe82:d66e/64
server2# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.102/24 192.168.122.200/24 fe80::5054:ff:fe04:2c5d/64

Fichiers de suivi

Keepalived a également la capacité de prendre des décisions prioritaires en fonction du contenu d'un fichier, ce qui peut être utile si vous exécutez une application qui peut écrire des valeurs dans ce fichier. Par exemple, vous pouvez avoir un processus d'arrière-plan dans votre application qui effectue périodiquement une vérification de l'état et écrit une valeur dans un fichier en fonction de l'état général de l'application.

Le Keepalived La page de manuel explique que le suivi des fichiers est basé sur le poids configuré pour le fichier :

"la valeur sera lue comme un nombre dans le texte du fichier. Si le poids configuré pour le track_file est 0, une valeur différente de zéro dans le fichier sera traitée comme un état d'échec, et une valeur nulle sera traitée comme un état OK, sinon la valeur sera multipliée par le poids configuré dans le instruction track_file. Si le résultat est inférieur à -253, toute instance VRRP ou groupe de synchronisation surveillant le script passera à l'état d'erreur (le poids peut être de 254 pour permettre la lecture d'une valeur négative à partir du fichier)."

Je vais garder les choses simples et utiliser un poids de 1 pour le fichier de piste dans cet exemple. Cette configuration prendra la valeur numérique dans le fichier à /var/run/my_app/vrrp_track_file et multipliez-le par 1.

server1# cat keepalived.conf
vrrp_track_file track_app_file {
      file /var/run/my_app/vrrp_track_file
}

vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 244
      advert_int 1
      authentication {
         auth_type PASS
         auth_pass 12345
      }
      virtual_ipaddress {
         192.168.122.200/24
      }
      track_file {
         track_app_file weight 1
   }
}

Vous pouvez maintenant créer le fichier avec une valeur de départ et redémarrer Keepalived . La priorité peut être vue dans tcpdump sortie, comme indiqué dans le deuxième article de cette série.

server1# mkdir /var/run/my_app
server1# echo 5 > /var/run/my_app/vrrp_track_file
server1# systemctl restart keepalived
server1# tcpdump proto 112
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:19:32.191562 IP server1 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 249, authtype simple, intvl 1s, length 20

Vous pouvez voir que la priorité annoncée est 249, qui est la valeur dans le fichier (5) multipliée par le poids (1) et ajoutée à la priorité de base (244). De même, ajuster la priorité à 6 augmentera la priorité :

server1# echo 6 > /var/run/my_app/vrrp_track_file
server1# tcpdump proto 112
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:20:43.214940 IP server1 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 250, authtype simple, intvl 1s, length 20

Interface de suivi

Pour les serveurs avec plusieurs interfaces, il peut être utile d'ajuster la priorité du Keepalived instance en fonction de l'état d'une interface. Par exemple, un équilibreur de charge avec un VIP frontal et une connexion dorsale à un réseau interne peut vouloir déclencher un Keepalived basculement si la connexion au réseau principal tombe en panne. Cela peut être accompli avec la configuration track_interface :

server1# cat keepalived.conf
vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 244
      advert_int 1
      authentication {
         auth_type PASS
         auth_pass 12345
      }
      virtual_ipaddress {
         192.168.122.200/24
      }
      track_interface {
         ens9 weight 5
      }
}

La configuration ci-dessus affecte un poids de 5 au statut de l'interface ens9. Cela amènera server1 à assumer une priorité de 249 (244 + 5 =249) tant que ens9 est activé. Si ens9 tombe en panne, la priorité tombera à 244 (et déclenchera un basculement, en supposant que le serveur2 est configuré de la même manière). Vous pouvez tester cela sur un serveur multi-interfaces en désactivant une interface et en regardant le VIP se déplacer entre les hôtes :

server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 192.168.122.200/24 fe80::5054:ff:fe82:d66e/64
ens9             UP             192.168.122.15/24 fe80::7444:5ec4:8015:722f/64

server1# ip link set ens9 down

server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 fe80::5054:ff:fe82:d66e/64
ens9             DOWN   
server2# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
ens9             UP             192.168.122.119/24 fe80::fc9f:8999:b93e:d491/64
eth0             UP             192.168.122.102/24 192.168.122.200/24 fe80::5054:ff:fe04:2c5d/64

Scénario de piste

Vous avez vu que Keepalived offre de nombreuses méthodes de vérification intégrées utiles pour déterminer la santé et le VRRP ultérieur priorité d'un hôte. Cependant, des environnements parfois plus complexes nécessitent l'utilisation d'outils personnalisés, tels que des scripts de vérification de l'état, pour répondre à leurs besoins. Heureusement, Keepalived a également la capacité d'exécuter un script arbitraire pour déterminer la santé d'un hôte. Vous pouvez ajuster le poids du script, mais je vais garder les choses simples pour cet exemple :un script qui renvoie 0 indiquera le succès, tandis qu'un script qui renvoie n'importe quoi d'autre indiquera que le Keepalived l'instance doit entrer dans l'état d'erreur.

Le script est un simple ping vers le 8.8.8.8 préféré de tout le monde Serveur DNS de Google, comme indiqué ci-dessous. Dans votre environnement, vous utiliserez probablement un script plus complexe pour effectuer les vérifications d'état dont vous avez besoin.

server1# cat /usr/local/bin/keepalived_check.sh
#!/bin/bash

/usr/bin/ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1

Vous remarquerez que j'ai utilisé un délai d'attente de 1 seconde pour ping (-W 1). Lors de l'écriture de Keepalived vérifier les scripts, c'est une bonne idée de les garder légers et rapides. Vous ne voulez pas qu'un serveur en panne reste le maître pendant longtemps parce que votre script est lent.

Le Keepalived la configuration d'un script de vérification est illustrée ci-dessous :

server1# cat keepalived.conf
vrrp_script keepalived_check {
      script "/usr/local/bin/keepalived_check.sh"
      interval 1
      timeout 5
      rise 3
      fall 3
}

vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 244
      advert_int 1
      authentication {
         auth_type PASS
         auth_pass 12345
      }
      virtual_ipaddress {
         192.168.122.200/24
      }
      track_script {
         keepalived_check
      }
}

Cela ressemble beaucoup à la configuration avec laquelle vous avez travaillé, mais le vrrp_script block a quelques directives uniques :

  • interval  :fréquence d'exécution du script (1 seconde).
  • timeout :Combien de temps attendre le retour du script (5 secondes).
  • rise :combien de fois le script doit être renvoyé avec succès pour que l'hôte soit considéré comme "sain". Dans cet exemple, le script doit réussir 3 fois. Cela permet d'éviter une condition de "battement" où un seul échec (ou succès) provoque le Keepalived état pour basculer rapidement d'avant en arrière.
  • fall :combien de fois le script doit échouer (ou expirer) pour que l'hôte soit considéré comme "malsain". Cela fonctionne comme l'inverse de la directive rise.

Vous pouvez tester cette configuration en forçant le script à échouer. Dans l'exemple ci-dessous, j'ai ajouté un iptables règle qui empêche la communication avec 8.8.8.8 . Cela a provoqué l'échec du bilan de santé et la disparition du VIP après quelques secondes. Je peux alors supprimer la règle et voir le VIP réapparaître.

server1# iptables -I OUTPUT -d 8.8.8.8 -j DROP
server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 fe80::5054:ff:fe82:d66e/64

server1# iptables -D OUTPUT -d 8.8.8.8 -j DROP
server1# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.122.101/24 192.168.122.200/24 fe80::5054:ff:fe82:d66e/64

Un conseil rapide sur les scripts dans Keepalived :Ils peuvent être exécutés en tant qu'utilisateur différent de root. Bien que je n'aie pas démontré cela dans ces exemples, jetez un œil à la page de manuel et assurez-vous que vous utilisez l'utilisateur le moins privilégié possible pour éviter toute implication négative sur la sécurité de votre script de vérification.

Notifier les scripts

J'ai discuté des moyens de déclencher Keepalived réponses basées sur des conditions externes. Cependant, vous souhaitez probablement également déclencher des actions lorsque Keepalived transitions d'un état à un autre. Par exemple, vous pouvez arrêter un service lorsque Keepalived entre dans l'état de sauvegarde, ou vous pouvez envoyer un e-mail à un administrateur. Keepalived vous permet de le faire avec des scripts de notification.

Keepalived fournit plusieurs directives de notification pour appeler uniquement des scripts sur des états particuliers (notify_master , notify_backup , etc.), mais je vais me concentrer sur le simple notify directive car c'est la plus souple. Lorsqu'un script dans la notify est appelée, elle reçoit quatre arguments supplémentaires (après tous les arguments passés au script lui-même).

Classés dans l'ordre, il s'agit de :

  • Groupe ou instance :indique si la notification est déclenchée par un VRRP groupe (non abordé dans cette série) ou un VRRP particulier exemple.
  • Nom du groupe ou de l'instance
  • Indiquer que le groupe ou l'instance est en transition vers
  • La priorité

Jeter un oeil à un exemple rend cela plus clair. Le script et Keepalived la configuration ressemble à ceci :

server1# cat /usr/local/bin/keepalived_notify.sh
#!/bin/bash

echo "$1 $2 has transitioned to the $3 state with a priority of $4" > /var/run/keepalived_status

server1# cat keepalived.conf
vrrp_script keepalived_check {
      script "/usr/local/bin/keepalived_check.sh"
      interval 1
      timeout 5
      rise 3
      fall 3
}

vrrp_instance VI_1 {
      state MASTER
      interface eth0
      virtual_router_id 51
      priority 244
      advert_int 1
      authentication {
         auth_type PASS
         auth_pass 12345
      }
      virtual_ipaddress {
         192.168.122.200/24
      }
      track_script {
         keepalived_check
      }
      notify "/usr/local/bin/keepalived_notify.sh"
}

La configuration ci-dessus appellera le /usr/local/bin/keepalived_notify.sh script à chaque fois qu'un Keepalived transition d'état se produit. Puisque le même script de vérification est en place, vous pouvez facilement inspecter l'état initial puis déclencher une transition :

server1# cat /var/run/keepalived_status
INSTANCE VI_1 has transitioned to the MASTER state with a priority of 244

server1# iptables -A OUTPUT -d 8.8.8.8 -j DROP
server1# cat /var/run/keepalived_status
INSTANCE VI_1 has transitioned to the FAULT state with a priority of 244

server1# iptables -D OUTPUT -d 8.8.8.8 -j DROP
server1# cat /var/run/keepalived_status
INSTANCE VI_1 has transitioned to the MASTER state with a priority of 244

Vous pouvez voir que les arguments de la ligne de commande correspondent à ceux que j'ai décrits au début de cette section. Évidemment, il s'agit d'un exemple simple, mais les scripts de notification peuvent effectuer de nombreuses actions complexes, telles que l'ajustement des règles de routage ou le déclenchement d'autres scripts. Ils constituent un moyen utile d'effectuer des actions externes basées sur Keepalived changements d'état.

Conclusion

Cet article a clôturé un Keepalived fondamental série avec quelques concepts avancés. Vous avez appris à déclencher Keepalived changements de priorité et d'état en fonction d'événements externes, tels que l'état du processus, les changements d'interface et même les résultats de scripts externes. Vous avez également appris à déclencher des scripts de notification en réponse à Keepalived changements d'état. Vous pouvez combiner deux ou plusieurs de ces approches pour créer une paire de serveurs Linux hautement disponibles qui répondent à plusieurs stimuli externes et garantissent que le trafic atteint toujours une adresse IP saine qui peut répondre aux demandes des clients.

[ Vous souhaitez en savoir plus sur l'administration système ? Suivez un cours en ligne gratuit :Présentation technique de Red Hat Enterprise Linux. ]


Linux
  1. Linux - Qu'est-ce que la mémoire élevée et la mémoire faible sous Linux ?

  2. RCRON – Configuration de la haute disponibilité des tâches cron

  3. Tutoriel sur le clustering Linux (haute disponibilité)

  4. paramètre sysctl pour une charge élevée et empêcher les attaques DDoS

  5. Qu'est-ce que la mémoire haute et la mémoire basse sous Linux ?

Comment installer et configurer Hive avec une haute disponibilité – Partie 7

Équilibrage de charge avec HAProxy, Nginx et Keepalived sous Linux

Commande Cat sous Linux :Exemples essentiels et avancés

Comment multi-maître MySQL avec Percona et Keepalived

Tolérance aux pannes Linux :haute disponibilité Linux

Développement Web et techniques avancées avec Linux sur Windows (WSL)