Keepalived VRRP_script führt kein Failover durch

10

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.

Nvasion
quelle
Hat Ihre Sicherungsinstanz die Prioritätsänderung bemerkt oder protokolliert sie etwas? Protokolle von beiden wären hilfreich.
Jim G.
Nein, tut es nicht. Das einzige Mal, wenn eine Änderung bemerkt wird, ist, wenn der Master weggeht. Zum Beispiel, wenn ich aufhöre, am Leben zu bleiben. Das Stoppen des Prozesses, den ich überwache, zeigt nur, dass VRRP_Script (chk_script) auf dem Master fehlgeschlagen ist. Mit nichts auf dem Sklaven.
Nvasion

Antworten:

11

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:

vrrp_instance haproxy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1

SICHERUNG:

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

}}

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

Giomanda
quelle
Es scheint auch so, als würde die Nichtangabe eines Gewichts bedeuten, dass ein fehlgeschlagenes track_script den Fehlerzustand direkt auslöst
Oscar
@Nvasion: Bitte akzeptieren Sie diese Antwort, da auch ich mein Problem gelöst habe.
Ankur Soni
4

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:

iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
iptables -A INPUT -p vrrp -i eth0 -j ACCEPT

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.

  • Ein track_script ist kein Ein / Aus-Schalter ("wenn das Skript in Ordnung ist: für die VIP-Wahl geeignet; wenn NICHT in Ordnung: für die VIP-Wahl völlig unzulässig") - es erhöht / verringert lediglich die Wahrscheinlichkeit, die Wahl zu gewinnen, und wenn es nur am Leben bleibt beobachtet sich jemals als der einzige VRRP-Sprecher und empfängt nie Nachrichten von anderen Sprechern, es gibt wirklich nicht viel von einer Wahl - Sie gewinnen immer.
Patrick Wagner
quelle
0

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 ,

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

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

  1. 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.

  2. Schalten Sie die Nopreempt am 2. BACKUP-Knoten aus.

  3. Stellen Sie das Gewicht am 1. BACKUP-Knoten auf mindestens -2 ein .

Yu Watanabe
quelle