Das automatische DB-Failover in c # funktioniert nicht, wenn der Hauptserver physisch offline geschaltet wird


9

Ich richte das automatische DB-Failover in C # mit SQL Server 2008 ein und habe mithilfe eines Zeugen-Setups eine hohe Sicherheit mit automatischem Failover-Spiegel. Meine Verbindungszeichenfolge sieht so aus

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

Wenn ich während des Tests den SQL Server-Dienst auf dem Hauptserver ausschalte, funktioniert das automatische Failover wie ein Zauber, aber wenn ich den Hauptserver offline schalte (durch Herunterfahren des Servers oder Beenden der Netzwerkkarte), funktioniert das automatische Failover nicht und mein Website nur Zeitüberschreitung.

Ich habe diesen Artikel gefunden, in dem der vorletzte Beitrag darauf hinweist, dass wir Named Pipes verwenden, die nicht funktionieren, wenn der Principal offline geht, aber TCP in unserer Verbindungszeichenfolge erzwingen.

Was fehlt mir, damit dieses automatische DB-Failover funktioniert?


Benötigt dies das [C #] -Tag? Es scheint in keiner Weise spezifisch für C # zu sein.
Gabe

Antworten:


6

Nachdem wir eine Woche lang mit MS gearbeitet haben, haben wir herausgefunden, warum dies passiert.

Im Wesentlichen führt die Anwendung kein Failover durch, da sichergestellt werden muss, dass die Datenbank ein Failover durchgeführt hat. Die SQL-Verbindung läuft ab, bevor die Verbindung festgestellt hat, dass die Datenbank ein Failover durchgeführt hat.

Der Vorgang zum Bestätigen des Failovers der Datenbank (mit allen Standardeinstellungen für die TCP-Registrierung) lautet:

  1. Versuchen Sie, mit dem Principal zu kommunizieren, und stellen Sie sicher, dass es nicht mehr der Principal ist
  2. Kommunizieren Sie mit dem Failover, um sicherzustellen, dass es ein Failover durchgeführt hat und jetzt der neue Principal ist.

Wenn der Principal nicht erreichbar ist, dauert diese Kommunikation etwa 21 Sekunden, da:

  1. Versuchen Sie, mit dem Principal zu kommunizieren. Warten Sie 3 Sekunden
  2. Versuchen Sie erneut, mit dem Principal zu kommunizieren. Warten Sie 6 Sekunden
  3. Versuchen Sie erneut, mit dem Principal zu kommunizieren. Warten Sie 12 Sekunden
  4. Versuchen Sie, mit dem Failover-Partner zu kommunizieren. Stellen Sie sicher, dass ein Failover durchgeführt wurde. Führen Sie daher ein Failover in der Anwendung durch.

Wenn Ihre SQL-Verbindung also nicht 21 Sekunden wartet (wahrscheinlich mehr in der Realität), wird eine Zeitüberschreitung auftreten, bevor dieser Tanz beendet ist, und es wird überhaupt kein Failover stattfinden.

Die Lösung besteht darin, das Zeitlimit in Ihrer Verbindungszeichenfolge auf einen großen Wert zu setzen. Wir verwenden 60 Sekunden, um die Sicherheit zu gewährleisten.

Prost


0

Ich frage mich, ob die Bedingungen für ein automatisches Failover zum Zeitpunkt Ihrer Tests nicht erfüllt sind. Insbesondere - wenn die Datenbank zum Zeitpunkt des Fehlers nicht mit dem Spiegel synchronisiert ist (überprüfen Sie den Spiegelungsstatus von sys.database_mirroring) UND / ODER wenn der Zeuge und der Spiegel zu diesem Zeitpunkt nicht verbunden sind (Test über Pings zwischen teilnehmenden Rollen).

Es kann auch vorkommen, dass Ihr Partner und Ihr Spiegel nicht miteinander verbunden sind. Die Partner- und Spiegeldatenbanken sind jedoch weiterhin unabhängig voneinander mit dem Zeugen verbunden. In diesem Fall sieht der Zeuge nichts Falsches (und damit kein Failover). Sie haben jedoch erwähnt, dass Sie den Server selbst heruntergefahren haben, sodass dies weniger wahrscheinlich klingt.

Oder sagen Sie, dass das Failover irgendwann passiert, Ihre erneute Verbindung jedoch fehlschlägt? In diesem Fall variieren die Erkennungs- und Failover-Zeit abhängig davon, wie der Principal ausgefallen ist und wie lange es insgesamt dauert, die Spiegel-Datenbank wiederherzustellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.