Ich verwende Keepalived auf zwei Servern und kann kein Failover auf den anderen Server durchführen.
Unten habe ich meine Konfiguration für einen der Server. Der einzige Unterschied zwischen den beiden besteht darin, dass die Prioritätsnummern Master 110 und Back 109 sind.
Aber wenn ich meinen Prozess mit /etc/init.d/process stoppe, wird stop keepalived nicht beendet. Ich bekomme nur das VRRP_Script (chk_script) fehlgeschlagen und sonst nichts. Keine Failover oder nichts.
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
}
}
Dies ist mein chk_script unten. Das gleiche Problem tritt auch auf, wenn ich den Killall -0-Prozess als mein Skript ausführe.
!/bin/bash
SERVICE='process'
STATUS=$(ps ax | grep -v grep | grep $SERVICE)
if [ "$STATUS" != "" ]
then
exit 0
else
exit 1
fi
Kennt jemand eine Lösung dafür? Vielen Dank.
linux
keepalived
Nvasion
quelle
quelle
Antworten:
Ich hatte genau das gleiche Problem, aber mein Problem lag weder in der Firewall noch in meinem Ethernet-Adapter, sondern in den "Gewichts" -Einstellungen des Überprüfungsskripts.
Dies war meine Konfiguration:
MEISTER:
SICHERUNG:
Check_script:
}}
Der Grund, warum der Master sich weigerte, den VIP freizugeben, war, dass der Master trotz der Tatsache, dass das Skript fehlgeschlagen war, immer noch eine höhere Prioritätsnummer vom BACKUP-Server hatte. Dies geschah, weil die Einstellung "weight" in check_script nicht ausreichte, um die "Lücke" zwischen der Prioritätsnummer abzudecken, was bedeutet, dass die Prioritätsnummer des BACKUP-Servers höher als die von MASTER Server ist. Ich werde weiter erklären:
Gemäß dem Handbuch von keepalived fügt eine positive Zahl in der Einstellung "Gewicht" diese Zahl der Priorität hinzu, wenn die Prüfung erfolgreich ist.
Eine negative Zahl subtrahiert diese Zahl von der Prioritätsnummer, wenn die Prüfung fehlschlägt.
Also, entsprechend meiner Konfiguration:
Serverprioritäten Vorheriger Fehler des Skripts:
MASTER: 152
BACKUP: 100
Failover_IP: MASTER
Die Failover-IP wird vom Master-Server korrekt "erfasst", da der Master im Vergleich zum Backup-Server eine höhere Priorität hat (152> 100).
Serverprioritäten NACH Ausfall des Skripts:
MASTER-Server: 148
BACKUP-Server: 102
Failover_IP: STILL ON MASTER
Die Failover-IP befindet sich immer noch auf dem Master-Server, da der Master im Vergleich zu BACKUP (148> 102) erneut eine höhere Priorität hat. Der MASTER-Server weigerte sich, die IP freizugeben, und richtig, da seine Priorität höher war als die des anderen Servers.
Die Lösung für meine Situation war:
Lösung -1: Ändern Sie die Prioritätsnummer beider Server, damit sie nicht viel "GAP" haben.
Zum Beispiel:
Master-Priorität: 150
Sicherungspriorität: 149
Check_script-Gewicht: Wie es ist (2).
Wenn das Skript mit der obigen Konfiguration erfolgreich ist (was bedeutet, dass alles in Ordnung ist), lauten die Prioritäten:
Master: 152
Backup: 149
IP_Location: On Master (152> 149)
Wenn das Skript fehlschlägt:
Master: 150
Backup: 151
IP_Location: On Backup (151> 150)
Lösung - 2: Ändern Sie die Gewichtsnummer des Skripts von 2 auf -60
quelle
Ich hatte das gleiche Problem - zwei CentOS 7.1-Server mit track_script, und ein Fehlschlagen des vrrp_script auf dem MASTER würde nur zu der einsamen Protokollmeldung "VRRP_Script (chk_script) failed" führen, nicht zu einem Failover. Auf dem BACKUP-Server wurden jedoch viele Meldungen von Keepalived angezeigt, die versuchten, die virtuelle IP zu übernehmen, solange das track_script auf dem MASTER-Server fehlschlug.
Lösung in meinem Fall: Die Firewall (iptables) auf dem MASTER-Server war nicht richtig konfiguriert, um VRRP-Pakete / Multicast-Pakete zuzulassen, während gleichzeitig die Firewall auf dem anderen Server, dem BACKUP, korrekt konfiguriert war.
Ich hatte auf beiden Servern die gleichen iptables-Regeln wie folgt eingegeben:
Dies funktionierte auf einem der Server (dem BACKUP VRRP-Server), aber nicht auf dem MASTER-Server, da ich vergessen hatte, dass die Schnittstelle auf dem MASTER-Server nicht den Namen 'eth0' trug, sodass die beiden Regeln überhaupt keine Auswirkung hatten.
Dies erklärte das Verhalten, das ich beobachtet hatte:
Wenn keepalived keinen anderen VRRP-Sprecher für eine bestimmte virtual_router_id sehen kann, glaubt es auch nach einer negativen Gewichtsänderung immer noch, derjenige mit der höchsten Priorität (also rechtmäßiger MASTER) zu sein, da es niemals VRRP-Nachrichten mit einer höheren Priorität als seiner eigenen empfängt ( weil Werbung anderer Sprecher von der Firewall blockiert wird und niemals den Keepalived-Prozess erreichen kann, um auf sie aufmerksam zu machen). Aus diesem Grund wird der VIP nicht freigegeben.
Der BACKUP-Server konnte jedoch die Anzeigen des (jetzt fehlgeschlagenen) MASTER sehen, fand die Priorität in diesen Paketen auf einen Wert reduziert, der unter seinem eigenen Wert lag, und erklärte sich selbst zum MASTER und sendete unentgeltliche ARPs, um den VIP zu beanspruchen. Wir waren also in einer Situation, in der beide Server dachten, sie müssten den VIP als MASTER bedienen.
Schlussfolgerungen: - Überprüfen Sie immer die Firewall-Konfiguration aller VRRP-Lautsprecher, wenn Sie ein seltsames Verhalten feststellen (kein Failover, mehrere MASTERs). Die Keepalived-Protokollierung ist nicht ganz so hilfreich wie sie sein könnte (eine einfache Meldung "VIP nicht freigegeben, weil ich immer noch das höchste Prio bin", nachdem die Zeile "VRRP_Script (chk_script) fehlgeschlagen") die Fehlerbehebung erheblich vereinfacht hätte.
quelle
Ich bin gerade in die gleiche Situation geraten wie Sie und habe ein bisschen über Keepalived gelernt. Überlegen wir mal, was auf jedem Server passiert. Angenommen, Sie möchten die manuelle Failback-Architektur implementieren.
Auf dem 1. BACKUP-Knoten
Jedes Mal , wenn die track_script Anzahl von nicht fallen mal sendet er die Anzeige an den zweiten Knoten Backup. Punkt hier ist die in der Anzeige festgelegte Priorität . In deinem Fall,
129 (109 + 20)
wird an den 2. BACKUP-Server gesendet.
Auf dem 2. BACKUP-Server
Weiter ist auf dem 2. BACKUP-Knoten.
Laut RFC ,
Da Sie nopreempt aktiviert haben und vrrp mit höherer Priorität erhalten, wird der 2. BACKUP-Knoten keine Übergangsphase angeben.
Lösung
Wenn Sie also einen Statusübergang auf dem 2. Knoten durchführen möchten, können Sie entweder
Setzen Sie das Gewicht am 1. BACKUP-Knoten auf 0 . Dadurch wird eine Ankündigung mit Priorität 0 an den 2. BACKUP-Knoten gesendet. doc beschreibt mehr über Gewicht 0.
Schalten Sie die Nopreempt am 2. BACKUP-Knoten aus.
Stellen Sie das Gewicht am 1. BACKUP-Knoten auf mindestens -2 ein .
quelle