Ich möchte HAProxy für den Lastenausgleich und das Failover einer Apache-PHP-Anwendung verwenden, die auf vielen identischen Backend-Servern gehostet wird. Gibt es eine Möglichkeit, einen ausgefallenen Knoten auf HAproxy zu erkennen und ihn im Rahmen einer einzelnen HTTP-Anforderung aus der aktiven Knotengruppe zu entfernen, ohne einen 5xx-Fehler zurückzugeben?
Im Idealfall kann der Server einen Antwortheader „Status: Fehler“ zurückgeben. HAProxy sollte diesen Header erkennen und den entsprechenden Knoten aus dem aktiven Satz entfernen.
Ich kann von meiner App keinen 5xx-Fehler zurückgeben.
Ist eine solche Konfiguration für HAProxy möglich?
Antwort1
Eine 5xx-Antwort ist immer noch eine Antwort und wird daher standardmäßig an den Client weitergeleitet.
Ich habe noch kein Produkt gesehen, das von Haus aus das von Ihnen genannte Niveau erreicht. Wenn es keins gibt, benötigen Sie einen Load Balancer, mit dem Sie eine benutzerdefinierte Post-Response-Regel schreiben können und der Zugriff darauf hat, den Status des fehlerhaften Knotens im Pool zu ändern und die Anforderung wieder in Ihren Pool einzuspeisen.F5 BigIPs,Riverbed StingRay (Zeug)bieten sicherlich das Scripting-Element und die Knotenverwaltung (f5 zB nach unten).LackUndTintenfischobwohl es sich nicht um reine Lastenausgleichsmodule handelt, bieten sie auch die Möglichkeit, Antworten nach der Backend-Antwort zu ändern. Ich bin mir jedoch nicht sicher, ob sie Zugriff auf die Knoten-/Poolverwaltung haben. Beachten Sie, dass Sie mit Anforderungstimeouts auf die gleiche Weise umgehen müssen wie mit 5xx-Antworten.
Die Seite, die Sie zur Überwachung des Status eines Knotens verwenden, muss außerdem eine Seite sein, die den Status der Anwendungen gründlich testet und recht häufig aufgerufen werden kann.
HAProxy kommt dem am nächsten mitobserve <mode>
Dadurch ist es möglich, auf Fehler im regulären Verkehr zu reagieren.
Ich kann von meiner App keinen 5xx-Fehler zurückgeben.
Irgendwann wird es passieren, also bereiten Sie sich darauf vor.
Antwort2
Ich stimme den meisten Kommentaren von mindthemonkey zu. Beachten Sie, dass Sie die Antwort auch blockieren und durch einen benutzerdefinierten Inhalt ersetzen können (mithilfe des 502-Fehlers). Dies ist jedoch etwas eingeschränkt (z. B. könnte es verwendet werden, um eine Umleitung zu senden, damit der Browser die Anforderung erneut sendet) und ziemlich schmutzig.
Warum möchten Sie das überhaupt tun? Zu sagen, dass Sie „5xx nicht zurückgeben können“, ist falsch, da Sie dies sowieso tun werden und die Clients per Definition und Spezifikation ebenfalls damit umgehen müssen. Liegt das daran, dass Sie sich hinter einem CDN befinden, das sich bei der Rückgabe von 5xx schlecht verhält? Wenn ja, möchten Sie vielleicht einfach die Ausgabefehlercodes neu schreiben (aber seien Sie sehr vorsichtig mit den von Ihnen verwendeten Codes, sie haben alle eine sehr spezifische Semantik).
Antwort3
Praveen, wenn Sie mindestens PHP 5.4 verwenden, sollte dies Ihrer PHP-App helfen:
Wenn Sie PGP 4.3 bis 5.3 verwenden, können Sie stattdessen header() verwenden (Informationen zur Verwendung finden Sie in den Manpages).
Technisch können Sie HAProxy so konfigurieren, dass es das tut, was Sie verlangen, aber es ist wahrscheinlich sinnvoller, Ihre Anwendung einfach so zu ändern, dass sie richtig funktioniert. An diesem Punkt sollte HA Proxy dies mehr oder weniger automatisch erledigen.