HAProxy Health Checks: Verwenden von httpchk und beobachten?

10

Ich verwende HAProxy 1.4.18 mit der folgenden Backend-Konfiguration

backend staging
  option httpchk HEAD /check.txt HTTP/1.0
  http-check disable-on-404
  default-server error-limit 1 on-error mark-down
  server staging01 x.x.x.x:80 check observe layer7
  server staging02 x.x.x.x:80 check observe layer7

Auf den Servern werden mehrere Anwendungen auf Apache / Passenger ausgeführt.

Die Kombination von httpchk und disable-on-404 ermöglicht ein ordnungsgemäßes Herunterfahren und Entfernen eines Servers aus dem lb, während der direkte Zugriff (dh zum Testen) weiterhin möglich ist.

Ich versuche, Observ einzurichten, um einen Server zu deaktivieren, wenn eine Anwendung nicht funktioniert. Ich habe die Anwendungskonfiguration in staging02 unterbrochen, sodass immer eine 500 zurückgegeben wird. Sie ist nach den ersten 500 korrekt mit DOWN markiert, beim nächsten httpchk jedoch mit UP.

Hier ist die Protokolldatei:

Server staging/staging02 is DOWN, reason: Health analyze, info: "Detected 1 consecutive errors, last one was: Wrong http response". 1 active and 1 backup servers left. 2 sessions active, 0 requeued, 0 remaining in queue.
Server staging/staging02 is DOWN, reason: Health analyze, info: "Detected 1 consecutive errors, last one was: Wrong http response". 1 active and 1 backup servers left. 1 sessions active, 0 requeued, 0 remaining in queue.
Server staging/staging02 is UP, reason: Layer7 check passed, code: 200, info: "OK", check duration: 0ms. 2 active and 1 backup servers online. 0 sessions requeued, 0 total in queue.

Gibt es eine Möglichkeit, diese beiden Prüfungen zu kombinieren?

Ouranos
quelle
Um sicherzugehen, dass HAProxy definitiv das Problem ist, können Sie die drei übereinstimmenden Protokollzeilen von Ihrem Backend-Apache-Server finden und zu Ihrer Frage hinzufügen?
Ladadadada
Einer der Apache-Server ist absichtlich falsch konfiguriert, sodass alle darauf befindlichen Anwendungen einen 500-Fehlercode zurückgeben. Die Datei /check.txt funktioniert jedoch immer, es sei denn, ich entferne die Datei. Ich möchte, dass der Apache-Server deaktiviert wird, wenn er 500 Fehler zurückgibt, auch wenn die Datei check.txt noch vorhanden ist.
Ouranos

Antworten:

4

Die Unterscheidung , die ich jetzt verstehen, dass /check.txt ist eigentlich eine 200 - Antwort zurück , sondern alle Anfragen an die Anwendung zurückgeben 500. HAProxy die 500s sieht von den Proxy - Anfragen kommt zurück und nimmt den Server aus dem Pool , aber dann beginnt seine eigenen check, erhält eine 200 und legt den Server wieder in den Pool.

Die Lösung wäre, eine der folgenden Aktionen auszuführen:

  1. Konfigurieren Sie Apache anstelle der Anwendung so, dass jede Anforderung eine 500-Antwort zurückgibt, auch die statische Datei /check.txt.
  2. Wechseln Sie /check.txtin eine Ruby-App, die gerade genug Logik enthält, um bei Bedarf zwischen einer 200- und einer 500-Antwort zu wählen.
  3. Stellen Sie den interWert auf etwas Lächerliches wie 3600 ein. Dies sollte Ihnen eine Stunde Zeit geben, um Ihre Tests durchzuführen oder (falls der Server von selbst ausfällt) das Problem herauszufinden und es wieder aufzurufen.
  4. Setzen Sie den interWert auf einen kleineren Wert wie 60, aber setzen Sie den riseWert auf einen höheren Wert wie 60. Dies würde Ihnen auch eine Stunde Zeit geben, bevor der Server wieder zum Pool hinzugefügt wurde. (Beachten Sie, dass diese beiden zuletzt aufgeführt sind, da es sich wahrscheinlich um sehr schlechte Ideen handelt.)
Ladadadada
quelle
Ja, genau das passiert. Ich denke, ich muss das loswerden /check.txtund das httpchk auf eine Anwendung verweisen. Die check.txtDatei war praktisch, um einen Server schnell und ordnungsgemäß von allen HAProxy zu entfernen (3 davon im HA-Setup, nur einer aktiv). Es scheint auch, dass disable serverzwischen dem Nachladen nicht bestehen bleibt.
Ouranos