Frage

Kennt jemand etablierte Best Practices für die Ausführung von Windows-Diensten (in meinem Fall in .NET entwickelt), sodass sie aus Gründen der Hochverfügbarkeit (automatisch) korrekt auf einen anderen Server umsteigen?

Ich kann mir vorstellen, dass dies hauptsächlich dadurch geschieht, dass entweder der sekundäre Server bei Bedarf gestartet wird (in diesem Fall muss der andere Server überwacht werden) oder beide Dienste gleichzeitig ausgeführt werden (in diesem Fall müssen sie ihre Arbeit synchronisieren). sie versuchen nicht, die gleichen Dinge zu tun).

Gibt es ein Muster oder Modell für diese Art von Problem?Ich weiß, dass die genaue Situation einen großen Unterschied machen wird, aber es scheint ein ziemlich häufiges Problem zu sein.

Danke

John

War es hilfreich?

Lösung

Folgendes hat bei mir funktioniert.

Aus infrastruktureller Sicht benötigen Sie zwei geclusterte Windows-Server.(Zwei Standard-Windows-Server-Boxen reichen aus. Der Clustering-Teil kann installiert und konfiguriert werden. Die meisten Systemadministratoren sollten wissen, wie das geht.) Installieren Sie als Nächstes Ihren Dienst auf beiden Knoten des Clusters und schalten Sie beide aus und stellen Sie sie auf MANUELL ein Start-up.Fügen Sie als Nächstes eine Clusterressource zum Windows-Clusteradministrator für Ihren Dienst hinzu, die das Ein- und Ausschalten Ihres Dienstes auf jedem aktiven Knoten verwaltet.Lassen Sie den Windows-Cluster verwalten, wann und auf welchem ​​Knoten Ihr Dienst ausgeführt wird.Dies ist der einfache Teil der Clusterung Ihres Dienstes.

Aus Service-Sicht sollten Sie Ihren Service so gestalten, dass er möglichst zustandslos ist.Das ist ein ziemlich dummer Ratschlag, aber er hängt wirklich davon ab, was Ihr Dienst tut.Gehen Sie beim Entwurf einfach davon aus, dass der Code irgendwann während der Lebensdauer zum ungünstigsten Zeitpunkt stoppt.Woher weiß der Dienst auf Knoten2, wo er dort weitermachen muss, wo Knoten1 aufgehört hat?Das ist der schwierige Teil, für den Sie entwerfen müssen.Abhängig davon, was Ihr Dienst tut, können Sie die zuletzt abgeschlossene Aufgabe in einer Datenbanktabelle oder einer freigegebenen Datendatei belassen.Sie können es auch von vorne beginnen lassen und noch einmal prüfen, ob die Aufgabe abgeschlossen wurde oder nicht, bevor Sie sie in Angriff nehmen.

Auch hier kommt es wirklich darauf an, was der Dienst leisten muss.Hoffe das hilft.

Andere Tipps

Beide zu haben, die die ganze Zeit laufen, ist wahrscheinlich die einfachste Lösung, aber Sie müssen sicherstellen, dass Sie nie über 50% beladen werden. Andernfalls wird der andere, wenn einer fehlschlägt, überladen und möglicherweise auch scheitert.

Verwenden Sie zum Synchronisieren eine Transaktionsdatenbank. Der Versuch, Ihre eigene Synchronisation zu schreiben, führt normalerweise zu Fehlern.

Wenn Sie beide Dienste funktionieren können, ist es besser. Sie müssen sicherstellen, dass sie staatenlos sind oder wissen, wie das Problem mit dem Status behandelt wird, und die Datenbank wird zwischen ihnen synchronisieren. In einem einzigen Ausfallpunkt - Sie werden das Problem in die DB drücken, und dort können Sie einen 2 Knoten aktiven aktiven Cluster haben und die DB -Herstellung die Synchronisierungsprobleme behandeln lassen.

Ich glaube, der beste Weg, um mit Failover umzugehen, ist nach Möglichkeit auf Netzwerkebene. Virtuelle IPS-Fronting-Ladungs- oder Primär-/Failover-Umgebungen ist ein guter Weg, um zu vermeiden, dass Code für Failover-Szenarien schreiben muss.

In Fällen, in denen Sie Failover im Code bearbeiten müssen:

  1. Testverbindung/Serviceanruf
  2. Wenn der Test fehlschlägt, senden Sie Warnungen
  3. Scheitern Sie den nächsten "registrierten" Serviceendpunkt

Es gibt zwei grundlegende Ansätze.

  1. Die Clients sind sich nach Bedarf auf unterschiedliche Endpunktadresse und -schalter bewusst oder gemäß einem anderen Service- oder Konfigurationsmechanismus. (als Beispiel die Stocktrader Demo -Anwendung macht dies.)

  2. Die Clients sind sich nicht bewusst, und Sie verwenden einen Standard -Ansatz des Netzwerklastausgleichs, der auch Failover liefern kann. F5 ist ein Produkt. Es gibt viele andere. Es ist im Grunde genommen wie ein NAT für Dienste, dass alle Anfragen Ihre NLB durchlaufen und an einen Server gesendet werden und die Antwort an den Anrufer zurückgeleitet werden. Diese Produkte überwachen die Dienstleistungen und nutzen nur diejenigen, die abgelaufen sind. Außerdem können Sie es häufig an Regeln anpassen, damit es Servern basierend auf Server -Workloads neue Anfragen zugewiesen hat. Windows Server hat dies Funktionalität in gewissem Maße integriert.

In jedem Fall ist es viel einfacher, wenn Ihre Serviceaufrufe "staatenlos" sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top