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?
quelle
Antworten:
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:
Wenn der Principal nicht erreichbar ist, dauert diese Kommunikation etwa 21 Sekunden, da:
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
quelle
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.
quelle