2010-12-16 5 views
11

Ich versuche, die sehr leichte Lösung für die Bereitstellung von Java-Anwendungen ohne Ausfallzeiten zu erstellen. Der Einfachheit halber lässt sich denken, dass wir zwei Server haben. Meine Lösung ist zu verwenden:Zero Downtime-Bereitstellung für Java-Anwendungen

  1. Auf der "Front" - einige Load Balancer (Software) - Ich denke an HAProxy hier.

  2. Auf der "Rückseite" - zwei Server, beide laufen Tomcat mit entfalteter Anwendung.

Wenn wir über neue Release

  1. Wir deaktivieren einer der Server mit HAProxy zu implementieren, so dass nur ein Server (wir es ein Server aufrufen, die alte Version läuft) wird verfügbar.

  2. Stellen Sie eine neue Version auf einem anderen Server bereit (nennen wir es Server B), führen Sie Tests für Produktionseinheiten aus (falls vorhanden :-) und aktivieren Sie Server B mit HAProxy, indem Sie Server A gleichzeitig deaktivieren.

  3. Jetzt haben wir wieder nur einen Server aktiv (Server B, mit der neuen Version). Stellen Sie eine neue Version auf Server B bereit, und aktivieren Sie sie erneut.

Irgendwelche Ratschläge, wie man verbessert? Wie automatisieren?

Irgendwelche vorgefertigten Lösungen oder muss ich mit meinen eigenen benutzerdefinierten Skripten enden?

Danke!

Antwort

4

Rolling Upgrade ist in der Tat eine gute Lösung, sofern Ihr Load-Balancer diese Option unterstützt (Server-Hunger). Eine andere Lösung besteht darin, OSGi-fähige Anwendungsserver zu verwenden, um Teile oder die gesamte Anwendung vollständig zu ersetzen.

Ich würde die erste empfehlen. Die AMS-Überwachungskonsole von SpringSource kann einen Cluster von tcServer (ein benutzerdefinierter Tomcat auf Steroiden) herunterfahren, und IIRC führt das rollierende Upgrade automatisch durch (aber überprüfen Sie die Dokumente).

3

Sehen Sie sich die OSGi-Technologie an, wenn Sie einen OSGi-Container unterbringen können, da dieser eine gute Isolation und Hot Deployment für OSGi-Bundles bietet. Wenn Sie das Spring-Framework verwenden, können Sie Spring OSGi

3

LiveRebel bietet die Funktionalität für Rolling-Neustarts, bietet CLI API und Hudson/Jenkins Plugin für die Automatisierung.

3

Ich habe einige interessante Lösungen aus dieser article in Bezug auf Null-Ausfallzeit gefunden. Ich möchte in diesem Artikel nur einige wenige Lösungen hervorheben.

1. A/B-Schalter: (Rolling Upgrade + Fallback-Mechanismus)

wir einen Satz von Knoten im stehenden Modus haben sollten. Wir werden die neue Version auf diesen Knoten bereitstellen und den Datenverkehr sofort auf diese Knoten umstellen. Wenn wir die alten Knoten in ihrem ursprünglichen Zustand belassen, könnten wir auch einen sofortigen Rollback durchführen. Ein Load Balancer steht der Anwendung zur Verfügung und ist auf Anfrage für diesen Switch verantwortlich.

Nachteile: Wenn Sie X-Server benötigen Ihre Anwendung auszuführen, yon müssen 2X Server mit diesem Ansatz.

2. Keine Ausfallzeiten

Mit diesem Ansatz können wir nicht halten eine Reihe von Maschinen; Stattdessen verzögern wir die Portbindung. Die gemeinsame Ressourcenerfassung wird verzögert, bis die Anwendung gestartet wird. Die Ports werden nach dem Start der Anwendung umgeschaltet, und die alte Version wird auch weiterhin ausgeführt (ohne Zugriffspunkt), um bei Bedarf sofort zurückzusetzen.

3. Parallel Deployment - Apache Tomcat: (für Web-Anwendungen)

Apache Tomcat die parallele Bereitstellungsfunktion, um ihre Version 7 Release hinzugefügt. Sie lassen zwei Versionen der Anwendung gleichzeitig laufen und nehmen die neueste Version als Standard.

4. Verzögerte Port-Bindung:

wir hier vorschlagen, ist die Möglichkeit, den Server zu starten, ohne die Portbindung und im Wesentlichen ohne den Stecker zu starten. Später wird ein separater Befehl starten und den Connector binden. Version 2 der Software kann bereitgestellt werden, während Version 1 ausgeführt wird und bereits gebunden ist. Wenn Version 2 später gestartet wird, können Version 1 und Version 2 gebunden werden. Bei diesem Ansatz ist der Knoten nur für wenige Sekunden offline.

5. Erweiterte Port-Bindung:

durch den Mythos zu brechen: ‚Address already in use‘, * sowohl alte Prozess & neue Prozess wird an denselben Port binden. SO_REUSEPORT Option im ON-Modus können zwei (oder mehr) Prozesse an denselben Port binden. Sobald der neue Prozess an den Port gebunden ist, beenden Sie den alten Prozess.

Die SO_REUSEPORT Option Adresse zwei Probleme:

  1. Die kleine Panne zwischen der Anwendungsversion Umschaltung: Der Knoten kann der Verkehr die ganze Zeit dienen, effektiv uns keine Ausfallzeiten geben.

  2. Verbesserte Planung:

enter image description here

In Zusammenfassung:

durch beide Kombination späten Bindung und Port wiederverwenden, können wir effektiv null Ausfallzeiten ermöglichen. Und wenn wir den Standby-Prozess beibehalten, können wir auch einen sofortigen Rollback durchführen.

0

Es gibt easy-deploy, die genau das mit Docker-Containern tut.

Deploy Version 1

easy-deploy -p 80:80 -v some/path:other/path my-image:1 

Um eine neue Version bereitstellen einfach den Befehl mit dem aktualisierten Tag-Namen

easy-deploy -p 80:80 -v some/path:other/path my-image:2 

Disclosure laufen: Ich habe dieses Werkzeug gebaut. Ich habe es genau gebaut, weil ich keine einfache Lösung für dieses Problem finden konnte.