Frage

Ich weiß, dass mit Network Load Balancing und Failover Clusteringwe passive Dienste machen hochverfügbar. Aber was ist aktive Apps

Beispiel: Einer meiner apps ruft einige Inhalte von einer externen Quelle in einem festen Intervall. Ich habe die folgenden Szenarien vorstellen:

  1. Führen Sie es in einer einzigen Maschine. Problem: Wenn diese Instanz fällt, wird der Inhalt nicht mehr abgerufen werden
  2. Führen Sie es in jeder Maschine des Clusters. Problem: Der Inhalt wird mehrmals abgerufen werden
  3. Haben Sie es in jeder Maschine des Clusters, sondern nur in einem von ihnen laufen. Jede Instanz muss eine Art gemeinsamen Ressource überprüfen, um zu entscheiden, ob er seinerseits die Aufgabe, oder nicht zu tun.

Als ich dachte über die Lösung # 3 Ich frage mich, was die gemeinsame Ressource sein sollte. Ich habe gedacht, eine Tabelle in der Datenbank zu erstellen, wo wir sie verwenden könnten eine globale Sperre zu erhalten.

Ist dies die beste Lösung? Wie funktioniert die Menschen dies in der Regel tun?

Übrigens ist es eine C # .NET WCF App läuft auf Windows Server 2008

War es hilfreich?

Lösung

Für solche Probleme, die sie haben, Nachrichtenwarteschlangen erfunden. Stellen Sie sich den Fall, wenn der Cluster-Anwendungen alle an eine Nachrichtenwarteschlange hören (gruppierten sich :-)). An einem gewissen Punkt in der Zeit eine Instanz bekommt Ihren ersten Befehl Ihre externe Ressource zum Download bereit. Wenn dies gelingt, spült die Instanz die Nachricht und stattdessen es Beiträge eine andere für eine spätere Ausführungszeit, dass die auf ‚die Laufzeit‘ + ‚Intervall‘ gleich. Aber falls die Instanz stirbt während der Verarbeitung, das ist kein Problem. Die Nachricht wird in der Warteschlange (nach Zeit) und einige andere Instanz kann es abholen zurückgerollt. Ein bisschen von Transaktionen, ein bisschen von Nachrichtenwarteschlangen

Ich bin auf der Java EE Seite der Welt kann man so helfen mit Details Codierung

Andere Tipps

Ich habe einmal etwas ähnliches mit Ihrer Lösung # 3 implementiert.

Erstellen Sie eine Tabelle so etwas wie resource_lock genannt, mit einer Spalte (z locking_key), die einen Verriegelungsschlüssel enthalten wird.

Dann wird bei jedem Intervall alle Instanz Ihrer Anwendung wird:

  1. Führen Sie eine Abfrage wie 'update resource_lock set resource_key = 1 where resource_key is null'. (Sie können natürlich auch Einsatz eine serverspezifische ID, Zeitstempel, etc.)
  2. Wenn 0 Zeilen aktualisiert:. Nichts zu tun - eine andere App-Instanz bereits die Ressource zu holen
  3. Wenn 1 Zeile aktualisiert: holt die Ressource und Set locking_key zurück zu null.

Es gibt zwei Vorteile mit dieser:

  • Wenn einer Ihrer Server ausfällt, wird nach wie vor die Ressource, die von den Servern abgerufen werden, die noch ausgeführt werden.
  • Sie verlassen in die Datenbank die Verriegelung, dies erspart Ihnen es selbst zu implementieren.

Es gibt einige Anforderungen, dass Sie wahrscheinlich wissen, aber nicht in der Frage beschrieben haben, die herausfordernd eine fundierte Antwort geben zu machen. Einige dieser Fragen sind:

  • Ist die Aufgabe erfolgreich abgeschlossen haben?
  • Wenn die Aufgabe nicht / nicht erfolgreich abgeschlossen wird, „wer“ Bedürfnisse kennen und welche Art von Maßnahmen durchgeführt werden müssen?
  • Was ist das Verhalten, wenn die Aufgabe nicht abgeschlossen ist, wenn die Zeit wieder die Aufgabe auszuführen kommt? Sollte es laufen oder nicht?
  • Wie wichtig ist es, dass die Arbeitsplätze im angegebenen Intervall laufen? Wenn das Intervall alle 5 Minuten ist es muss alle 5 Minuten oder konnte die Aufgabe laufen nach 5 Minuten und 10 Sekunden?

Der erste Schritt ist zu beantworten, wie die periodische Aufgabe ausgeführt werden soll geplant werden. Eine Option ist ein Windows Scheduled Task aber das ist nicht von Natur aus hoch verfügbar, aber es kann möglich sein, Arbeit rund um die. Wenn Sie SQL Server verwenden, wäre eine weitere Alternative zu SQL Server-Agent als Scheduler zu verwenden, da es als Teil von SQL Server Failover wird.

Der nächste Schritt ist, um zu bestimmen, wie die WCF-Anwendung aufzurufen. Die einfachste Möglichkeit wäre, einen Job zu triggern den WCF-Dienst über einen NLB-IP-Adresse aufzurufen. Dies könnte ein no-no, wenn der Datenbankserver (oder eine anderer Server in dieser Zone) in Betracht gezogen werden soll, auf die Aufgabezone Aufruf (natürlich gibt es immer Ausnahmen wie MSDTC).

Eine andere Möglichkeit wäre die Verwendung der Warteschlange Modell sein. Dies wäre der zuverlässigsten in den meisten Situationen. z.B. SQL Server-Agent könnte eine gespeicherte Prozedur ausführen, um einen Datensatz in einer Warteschlange Tabelle einzugeben. Dann auf jedem Anwendungsserver könnte ein Dienst abfragen für eine Warteschlange Datensatz Prozess suchen. Der Zugriff auf den Datensatz in der Warteschlange würde durch die Datenbank serialisiert werden, so dass der erste Server in den Job laufen würde (und das Job würden nur einmal ausgeführt werden).

Abhängig von den Antworten auf die Öffnung Fragen in dieser Antwort können Sie einige weitere Fehlerbehandlung hinzufügen. Wenn der Abruf der externen Ressource in der Regel recht kurz ist, können Sie einfach die Warteschlangen-Aufzeichnung mit einem select for update gesperrt halten und wenn die Aufgabe Update abgeschlossen ist der Status (oder den Datensatz löschen, wenn Sie möchten). Dies blockiert andere Service-Instanzen von der Verarbeitung des Datensatzes, während es auf einem anderen Server verarbeitet wird und wenn ein Absturz während der Verarbeitung der Transaktion auftritt sollte zurück und ein anderer Dienst im Cluster abholen kann den Datensatz gerollt werden. (Obwohl Sie die Transaktion Timeout so lange erhöhen könnte, wie Sie denken, Sie brauchen.)

eine Datenbanksperre für eine lange Zeit zu halten Wenn nicht lebensfähig ist, dann können Sie die Logik verändern und einige Überwachung auf die Dienste hinzuzufügen. Wenn nun eine Auftragsbearbeitung gestartet wird, würde sein Status geändert wird aus der Warteschlange zu laufen und der Server, der den Datensatz verarbeitet würde auf dem Datensatz aktualisiert werden. Irgendeine Art von Service-Statustabelle erstellt werden kann und jede Dienstinstanz würde die die aktuelle Zeit aktualisieren, jedesmal wenn sie abzufragen. Dies würde zulassen, dass andere Dienste im Cluster reprocess Jobs, die zeigen, wie ausgeführt, aber der Service sie sollen laufen auf nicht „eingecheckt“ innerhalb eines bestimmten Zeitraums.

Dieser Ansatz hat auch Einschränkungen: was ist, wenn die Aufgabe tatsächlich erfolgreich abgeschlossen, aber irgendwie Datenbank-Konnektivität verloren wurde - der Job möglicherweise wieder laufen kann. Natürlich glaube ich nicht, das Problem des mit Atomdatenbankaktionen mit anderen nicht-transaktionssichere Ressourcen kombiniert (zum Beispiel Web-Anfrage, Dateisystem) wird auf einfache Weise gelöst werden. Ich gehe davon aus Sie eine Datei oder etwas schreiben -., Wenn die externen Inhalte auch in eine Datenbank gespeichert wird dann eine einzelne Transaktion wird garantieren, dass alles im Einklang

Von der Einfachheit Sicht der schnellste / einfachste Weg, um zu erreichen, was Sie suchen zu ‚Round-Robin‘ würde den Cluster, so dass für jede Anforderung, eine Maschine (durch einen Cluster-Management-Service ausgewählt ist oder so ähnlich), um eine Anforderung zu verarbeiten. Die tatsächlichen Client-Anforderungen gehen nicht direkt an die Maschine, die Griffe es; sie verweisen stattdessen auf einen einzelnen Endpunkt, die fungiert als Proxy für Maschinen zur Verfügbarkeit und Last basierend eingehende Anfragen zu verteilen. Um es mit dem unten angeführten Link,

  

Network Load Balancing ist eine Möglichkeit, einen Pool von Maschinen so zu konfigurieren, dass sie abwechselnd auf Anfragen zu reagieren nehmen. Es ist am häufigsten in Serverfarmen implementiert gesehen: identisch konfigurierten Maschinen, die ausgebreitete die Last für eine Website, oder vielleicht eine Terminal-Server-Farm. Man könnte es auch für eine Firewall (ISA) Farm, vpn Access Points verwenden, wirklich, zu jeder Zeit haben Sie TCP / IP-Verkehr, der zu viel Last für eine einzelne Maschine geworden ist, aber Sie wollen es immer noch als eine einzige Maschine erscheinen für Zugang Zwecke.

Wie für Ihre Anwendung „aktiv“ ist, geht das Erfordernis nicht Faktor in diese Gleichung da, ob ‚aktiv‘ oder ‚passiv‘, die Anwendung noch eine Anforderung an den Server macht.

existieren Handels Loadbalancer zum Servieren HTTP-Stil-Anforderungen, so dass lohnt sich, in sein mag, aber mit der Last Eigenschaften W2k8 Balancing, können Sie am besten gedient sein, in denen tippen.

Für weitere Informationen darüber, wie zu konfigurieren, die in win2k8 finden Sie unter diese Artikel.

sehen hier für eine weitere detaillierte Freilos von NLB-Setup und Konfiguration.

Gelingt das nicht, können Sie auch durch verschiedene Such / Posting auf ServerFault bedient werden, da der Code-Anwendung ist nicht (und sollte nicht) strikt beachten Sie, dass die NLB existiert.

EDIT:. Hinzugefügt einen anderen Link

EDIT (die zweit): Die OP hat meinen falschen Schluss im ‚aktiven‘ vs. ‚passiven‘ Konzept korrigiert. Meine Antwort auf diese Frage ist sehr ähnlich zu meiner ursprünglichen Antwort, außer dass die ‚aktiven‘ Dienst (die, da Sie WCF verwenden, leicht ein Windows-Dienst sein könnte) könnte in zwei Teile geteilt: die tatsächlichen Verarbeitungsabschnitt, und die -Management-Bereich. Der Verwaltungsteil würde auf einem einzigen Server läuft, und fungiert als Round-Robin-Lastausgleich für die anderen Server die eigentliche Verarbeitung zu tun. Es ist etwas kompliziert, mehr als das ursprüngliche Szenario, aber ich glaube, es ist ein gutes Maß an Flexibilität bieten würde sowie eine saubere Trennung zwischen Verarbeitung und Verwaltungslogik bieten.

In einigen Fällen Menschen finden es nützlich 3 Maschinen haben alle Anforderungen zu tun, und dann die Ergebnisse am Ende zu vergleichen, um sicherzustellen, dass das Ergebnis absolut korrekt und kein Hardware-Fehler verursacht Probleme, während es verarbeitet wird. Dies ist, was sie tun, auf zum Beispiel Flugzeugen.

Zu anderen Zeiten können Sie leben ein einziges schlechtes Ergebnis mit und einen kleinen Ausfallzeit Wechsel zu einem neuen Service, wollen aber nur die nächsten in Ordnung zu sein. In diesem Fall Lösung Nummer 3 mit einem Herzschlag-Monitor ist eine hervorragende Einrichtung.

Andere Zeiten wieder, Menschen muss nur mit einer SMS informiert werden, dass ihr Dienst nicht verfügbar ist und die Anwendung wird nur ein paar veralteten Daten verwenden, bis Sie manuell eine Art von Failover durchführen.

In Ihrem Fall würde ich sagen, letzteres ist wahrscheinlich nützlicher für Sie. Da Sie auf dem Dienst am anderen Ende nicht wirklich verlassen können zur Verfügung steht, müßten Sie noch mit einer Lösung kommen, was in diesem Fall zu tun ist. zurück veraltete Daten geben kann, was gut für sie ist, und es kann nicht sein. Es tut uns Leid sagen müssen: Es hängt davon ab

.

Zookeeper macht einen guten Anwendungsfall von verteilten Schleusen. Zookeeper haben z-Knoten, die mit Daten wie Verzeichnis befinden.

Auch netflix Kurator hat viele Rezepte bereits getan und zu verwenden. Wie: leader Wahl, verteilt Schloss und viele mehr.

ich denke, wir haben Klienten von Tierpfleger für C #. Sie sollten auf jeden Fall diese Optionen versuchen. # Option3

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