Je suis donc en cours d'exécution sur deux serveurs et je ne peux pas l'obtenir au basculement de l'autre.
Ci-dessous, j'ai mon configuration pour l'un des serveurs. Le seul différent entre les deux est le maître des numéros de priorité étant 110 et le dos étant 109.
Mais quand j'arrête mon processus avec /etc/init.d/process Stop Keepalived n'échoue pas. Je viens d'obtenir le vrrp_script (chk_script) échoué et rien d'autre. Pas de basculement ni rien.
vrrp_script chk_script {
script "/usr/local/bin/failover.sh"
interval 2
weight 2
}
vrrp_instance HAInstance {
state BACKUP
interface eth0
virtual_router_id 8
priority 109
advert_int 1
nopreempt
vrrp_unicast_bind 10.10.10.8
vrrp_unicast_peer 10.10.10.9
virtual_ipaddress {
10.10.10.10/16 dev eth0
}
notify /usr/local/bin/keepalivednotify.sh
track_script {
chk_script weight 20
}
}
Ceci est mon chk_script ci-dessous. Le même problème se produit également lorsque je fais un processus de Killall -0 comme mon script.
!/bin/bash
SERVICE='process'
STATUS=$(ps ax | grep -v grep | grep $SERVICE)
if [ "$STATUS" != "" ]
then
exit 0
else
exit 1
fi
Est-ce que quelqu'un connaît une solution pour cela? Merci.
J'avais exactement le même problème que mon problème n'était pas dans le pare-feu ni dans mon adaptateur Ethernet, mais dans les paramètres "Poids" du script de chèque.
C'était ma configuration:
Master :
vrrp_instance haproxy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
sauvegarde :
vrrp_instance haproxy {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
Check_script :
vrrp_script chk_haproxy {
script "python /root/ha_check.py"
interval 2 # check every 2 seconds
weight 2
rise 2
fall 2
}
La raison pour laquelle le maître refuse de libérer le VIP était parce que malgré le fait que le script avait échoué, le maître a toujours un numéro de priorité plus élevé à partir du serveur de sauvegarde. Ceci est arrivé parce que le réglage "Poids" Sur Check_Script n'était pas suffisant pour couvrir l'écart entre le numéro de priorité, ce qui signifie que le numéro de priorité du serveur de sauvegarde est grand à celui du serveur maître. Je vais expliquer davantage:
Selon le manuel de conserve, un nombre positif sur le paramètre "Poids" ajoutera ce nombre à la priorité si le chèque réussit.
Un nombre négatif soustrait le numéro du numéro de priorité si le chèque échoue.
Donc, selon ma configuration:
PRIORITÉS DE SERVICE DE SERVICE DE SERVICE DE SCRIPT:
[.____] Maître: 152
Sauvegarde: 100
Basculer_ip: maître
L'IP de basculement est correctement "attrapé" par le serveur maître depuis la priorité supérieure par rapport au serveur de sauvegarde (152> 100)
Priorités de serveur après l'échec du script:
Server principal: 148
Sauvegarde Server: 102
Échecover_ip: toujours en maître
L'IP de basculement est toujours sur le serveur maître car le maître a à nouveau une priorité plus élevée par rapport à la sauvegarde (148> 102). Le serveur maître refusait de libérer l'IP et la droite qu'il a fait depuis sa priorité était supérieure à l'autre serveur.
La solution sur ma situation était la suivante:
solution -1: modifier le nombre de priorités des deux serveurs afin qu'ils n'ont pas beaucoup de "écart".
Par exemple:
Priorité de la maîtrise: 150
Priorité de sauvegarde: 149
Check_script Poids: tel qu'il est (2).
Avec la configuration ci-dessus, lorsque le script réussit (ce qui signifie que tout va bien), les priorités seraient les suivantes:
[.____] Maître: 152
[.____] Sauvegarde: 149
[.____] IP_Location: sur Master (152> 149)
Quand le script échoue:
Maître: 150
Sauvegarde: 151
[.____] IP_Location: sur la sauvegarde (151> 150)
Solution - 2: Modifier le numéro de poids du script de 2, à -6
J'ai eu le même problème - deux centos 7.1 serveurs avec pack_script et l'échec du VRRP_Script sur le Master n'entraînerait que le message de journal isolé "VRRP_Script (chk_script) a échoué", pas dans un basculement. Sur le serveur de sauvegarde, cependant, j'ai eu beaucoup de messages de conserve à essayer de prendre en charge la propriété intellectuelle virtuelle tant que j'avais le track_script sur le serveur maître échoue.
Solution Dans mon cas: Le pare-feu (IPtables) sur le serveur maître n'a pas été configuré correctement pour permettre aux paquets/paquets de multidiffusion VRRP, tout en même temps, le pare-feu sur l'autre serveur, la sauvegarde, a été configurée correctement.
J'étais entré dans les mêmes règles d'IPTables dans les deux serveurs comme suit:
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
Cela a fonctionné sur l'un des serveurs (le serveur de sauvegarde VRRP) mais pas le maître, car j'avais oublié que l'interface n'était pas nommée "Eth0" sur le serveur maître, les deux règles n'avaient aucun effet.
Cela a expliqué le comportement que j'avais observé:
Si ce qui est retenu ne peut voir aucun autre orateur VRRP pour un certain virtual_router_id, il croit toujours à être celui avec la priorité la plus élevée (tant que maître légitime) même après une modification de poids négatif, car elle ne reçoit jamais de messages VRRP avec une priorité supérieure à sa propre ( Parce que les publicités d'autres orateurs sont bloquées par le pare-feu et ne peuvent jamais atteindre le processus de conserve pour en faire conscience). C'est pourquoi vous ne voyez pas cela libérer le VIP.
Le serveur de sauvegarde a toutefois pu voir les publicités de la maîtrise (maintenant échouée), a constaté la priorité de ces paquets réduits à une valeur inférieure à celle de son propre, et a procédé à déclarer lui-même maître et à envoyer des ARP gratuits pour réclamer le VIP. Nous avons donc fini dans une situation où les deux serveurs pensaient qu'ils auraient besoin de servir le VIP comme maître.
Conclusions: - Toujours Vérifiez la configuration du pare-feu sur tous les haut-parleurs VRRP si vous rencontrez un comportement étrange (pas de basculement, plusieurs maîtres). La journalisation conserve n'est pas aussi utile que cela pourrait être (un message simple "VIP non publié car je suis toujours la plus haute prio" après l'échec de "VRRP_Script (chk_script)".
Je viens de heurter la même situation que de vous et j'ai fait des études sur la maintenance. Pensons que ce qui se passe dans chaque serveur. En supposant que vous souhaitez implémenter l'architecture manuelle de défaillance,
Chaque fois que le pack_script échoue le numéro automne fois, il envoie la publicité au 2e nœud de sauvegarde. Point Voici la priorité définie à l'intérieur de la publicité. Dans ton cas,
129 (109 + 20)
est envoyé au 2e serveur de sauvegarde.
Suivant est sur le nœud de sauvegarde 2ème.
Selon RFC ,
If the Priority in the ADVERTISEMENT is Zero, then:
o Set the Master_Down_Timer to Skew_Time
else:
If Preempt_Mode is False, or If the Priority in the
ADVERTISEMENT is greater than or equal to the local
Priority, then:
o Reset the Master_Down_Timer to Master_Down_Interval
else:
o Discard the ADVERTISEMENT
endif
endif
Étant donné que vous avez NOPRÉPART Activé et recevez une priorité supérieure VRRP, le 2e noeud de sauvegarde ne va pas afficher la phase de transition.
Donc, si vous voulez faire une transition de l'état se produire sur le 2e noeud, vous pouvez soit,
Set Poids to 0 sur le 1er noeud de sauvegarde. Cela enverra priorité 0 Publicité au 2ème noeud de sauvegarde. doc décrit plus sur le poids 0.
Éteignez le NOPRÉPART sur le nœud de sauvegarde 2e.
Définissez le poids sur au moins 2 sur le 1er noeud de sauvegarde.