
Ich habe drei Tomcat-Instanzen, die hinter einem HAProxy laufen. Wenn ich Änderungen an meinen Webanwendungen vornehme, möchte ich eine Rolling Deployment-Methode verwenden (also jeweils einen Tomcat nach dem anderen), damit es für die Benutzer nicht zu Ausfallzeiten kommt.
Wie mache ich das? Ich sehe, dass eine laufende Instanz von HaProxy im laufenden Betrieb neu konfiguriert werden kann (was gut ist, um neue Poolserver hinzuzufügen oder zu entfernen), aber wie reagiert HAProxy, wenn einer seiner Zielserver vorübergehend ausfällt?
Wenn es eine bessere Lösung als HAProxy gibt, wäre ich bereit, mir diese auch anzusehen.
Danke!
Antwort1
Ich habe Willy Tarreau eine E-Mail geschickt und folgende Optionen zurückbekommen:
Sie können Hot-Reconfiguration- oder Socat-Befehle an den Statistikserver senden, um das Gewicht Ihres Zielservers auf 0 zu setzen. Dadurch wird verhindert, dass neue Sitzungen auf diesen Server verteilt werden, bestehende Verbindungen werden jedoch nicht beeinträchtigt.
Sie können die Option „http-check disable-on-404“ in Kombination mit „option httpcheck /myurl“ festlegen und dann Ihre Zielserver so auf /myurl reagieren lassen, dass sie einen 200-Status senden, wenn alles in Ordnung ist, einen 404-Status, wenn der Server keine neuen Anfragen mehr empfangen soll, und einen 500-Status, wenn der Server nichts mehr empfangen soll (d. h. wenn Sie bereit sind, den Server zurückzusetzen). haproxy wird den Server in dem in Ihrer Serverzeile angegebenen Intervall erneut prüfen.
Antwort2
Da HAProxy keine Entfernung ohne Neukonfiguration unterstützt, gemäß @Ernst Müllerin seinemAntwort, ich werde Ihnen eine Alternative anbieten, da Sie auch andere Szenarien angefordert haben.
ich benutzeICH GEGEN, eine meiner bevorzugten Lösungen zum Lastenausgleich, da sie für mehr als nur HTTP verwendet werden kann.
Mit LVS können Sie ipvsadm
Server manuell hinzufügen und entfernen. Ein Beispiel für das Entfernen ist der folgende Befehl:
/sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT
Im Gegensatz zum manuellen Hinzufügen und Entfernen durch Interaktion mit LVS bevorzuge ich häufig die request
Option mitldirectord
. ldirector ist ein Daemon, der Ihre IPvs-Konfiguration abfragt und verwaltet. Mit diesem Parameter können Sie eine Datei mit einem URI-Pfad angeben. Während des Rollouts entfernen Sie die Datei und warten, bis der Zugriff auf den Server beendet ist. An diesem Punkt können Sie den Code bereitstellen, ohne die Produktionsclients zu beeinträchtigen.
Antwort3
Vieles davon hängt davon ab, ob Sie auf den Tomcats Sitzungs-/Statusverwaltung durchführen. Wenn die Sitzung eines Benutzers durch den Neustart zerstört wird, verhindert das Rolling keine Auswirkungen auf den Benutzer (es verhindert möglicherweise, dass er eine 500 sieht, aber nicht, dass er seine Sitzung neu starten muss). Wenn Sie keine Sticky Sessions verwenden, müssen Sie sich darüber wahrscheinlich keine Gedanken machen.
HAproxy und andere Load Balancer können ziemlich schnell feststellen, ob der dahinter liegende Server aktiv oder inaktiv ist, und den Datenverkehr entsprechend umleiten (der „Health Check“ in HAProxy). Es ist ihnen jedoch unmöglich, dies perfekt zu tun. Bei Tomcat gibt es nicht nur „aktiv“ und „inaktiv“, sondern „aktiv, da auf dem Port geantwortet wird, aber die Dinge noch nicht bereit sind“. Sie sollten sich also nicht darauf verlassen, dass der LB Auswirkungen auf den Benutzer vollständig verhindert – selbst bei einem guten Health Check wird es ein Intervall geben, in dem Datenverkehr zu einem fehlerhaften Knoten geleitet wird.
Bei einem Rolling Deploy nehmen wir den Server aktiv aus dem Load Balancer, manipulieren dann den Knoten/starten ihn neu, warten, bis er einen automatisierten Test/Monitor besteht, setzen ihn dann wieder ein und wechseln dann zum nächsten Server. Das ist einfacher mit einem Load Balancer, der eine API hat, die Sie remote aufrufen können (z. B. von einem Skript aus), um einen Server zu deaktivieren – unser alter Netscaler hat das gemacht, HAProxy jedoch nicht. Bei HAProxy müssen Sie entweder die Konfiguration bearbeiten und neu starten (traurig) oder Sie können die Integritätsprüfung so ändern, dass Sie sie manipulieren können – zum Beispiel überprüft sie eine magische Datei, die Sie umbenennen, wenn Sie möchten, dass dieser Knoten weggelassen wird. Sie müssen warten, bis die Integritätsprüfung ausgelöst wird und der Knoten den Cluster verlässt, aber dann sollte alles in Ordnung sein.
Ich lief hinüberdieser Beitragdas eine iptables-bezogene Lösung für dieses Problem bietet ...