SQL Server-Datenbankspiegelung: Seltsames Verhalten der Clientanwendung beim Failover

7

Ich richte eine HA SQL Server-Umgebung ein, die auf drei SQL Server 2008 R2-Computern und Datenbankspiegelung basiert.

Ich werde sie nennen:

  • Principal.Company.Intra
  • mirror.company.intra
  • zeugen.unternehmen.intra

Die Domain "company.intra" ist die Domain der Holding.

Beide Datenbankmodule überwachen den statischen 52002-Port, sodass Clientanwendungen auf folgende Weise auf sie zugreifen können:

principal.company.intra,52002 & mirror.company.intra,52002

Endpunkte werden EP_Mirroringbeim Principal und Mirror, EP_Witnessbeim Zeugen aufgerufen und am 5022-Port beim Principal, 5023 beim Mirror und 5024 beim Zeugen abgehört.

Dienstkonten sind korrekt konfiguriert und erhalten Verbindungsberechtigungen für die Endpunkte des jeweils anderen.

Die Spiegelungsfunktion funktioniert einwandfrei und das Datenbank-Failover ist korrekt, wenn ein manuelles TSQL-Failover oder ein simulierter Systemfehler vorliegt.

Das Problem besteht darin, dass sich Anwendungen beim Failover seltsam verhalten.

Der Kontext für Anwendungstests ist folgender:

Eine kleine .NET-App bestehend aus zwei Textfeldern und einer Schaltfläche:

Wenn auf die Schaltfläche geklickt wird, wird ein gespeicherter Proc-Aufruf ausgeführt und Textbox1 mit der Ausgabe des SP und Textbox2 mit der Datenquelleneigenschaft von my gefüllt SqlConnection.

Die Verbindungszeichenfolge sieht folgendermaßen aus:

Data source=principal.company.intra,52002;failover partner=mirror.company.intra,52002;
initial catalog = TEST_FAILOVER;user ID=user;password=pass;Connection Timeout=30

Ich habe diese App von meinem Laptop aus gestartet, der sich in einer anderen Domain befindet: laptop.childcompany.com

Szenario 1 :

  1. Ich starte die App
  2. Taste gedrückt, TB1: SP-Ausgabe / TB2: Principal.Company.Intra, 52002
  3. Datenbank-Failover
  4. Taste gedrückt, Verbindungszeitüberschreitung
  5. Taste gedrückt, Verbindungszeitüberschreitung
  6. DB-Failover am Spiegel (zurück zum Prinzipal)
  7. Taste gedrückt, TB1: SP-Ausgabe / TB2: Principal.Company.Intra, 52002

Szenario 2 :

  1. Datenbank-Failover
  2. App starten
  3. Taste gedrückt, TB1: SP-Ausgabe / TB2: Mirror.Company.Intra, 52002
  4. Datenbank-Failover am Spiegel (zurück zum Prinzipal)
  5. Taste gedrückt, Verbindungsfehler
  6. Taste gedrückt, TB1: SP-Ausgabe / TB2: Principal.Company.Intra, 52002
  7. Datenbank-Failover
  8. Taste gedrückt, Verbindungszeitüberschreitung
  9. Taste gedrückt, Verbindungszeitüberschreitung

Ich habe dann versucht, die App auf dem Spiegelserver lokal über RDP zu starten

Szenario 3

  1. App starten
  2. Taste gedrückt, TB1: SP-Ausgabe / TB2: Principal.Company.Intra, 52002
  3. Datenbank-Failover
  4. Taste gedrückt, Verbindungsfehler
  5. Taste gedrückt, TB1: SP-Ausgang / TB2: SPIEGEL

Ich habe MSDN auf das Verhalten der Ole DB-Konnektivität im Falle eines Failovers überprüft, um zu verstehen, warum im dritten Szenario die Datenquelleneigenschaft meiner Verbindung auf MIRRORund nicht festgelegt wurdemirror.company.holding,52002

Ich habe erfahren, dass die Failover-Server-Eigenschaft meiner Verbindungszeichenfolge nur für den Fall verwendet wird, dass eine anfängliche Verbindung zum Principal fehlschlägt (was erklärt, warum Szenario 2 ordnungsgemäß funktioniert hat), dass der Principal-Server jedoch für den Fall einer vorhandenen Verbindung bereits bereitgestellt hat die App mit der Spiegelserveradresse (in einem sogenannten "Failover-Cache"); Die angegebenen Informationen sind falsch, keine Überwachungsportinformationen und kein Hostname anstelle des vollqualifizierten Domänennamens, wodurch außerhalb der Domäne der Holdinggesellschaft ein Fehler auftritt.

Im nächsten Schritt habe ich die Ansicht sys.database_mirroring überprüft:

select M.* 
from sys.databases D 
inner join sys.database_mirroring M on D.database_id = M.database_id 
where D.name = 'TEST_FAILOVER'

Und festgestellt, dass das Feld "mirrororing_partner_instance" "MIRROR" anstelle von "mirror.company.intra, 52002" enthält.

Bei einer kurzen Überprüfung von Books Online wurde mir mitgeteilt, dass in diesem Feld Client-Apps des Failover-Partners bei der ersten Verbindung mit der Haupt-DB-Engine informiert werden.

Schließlich lautet meine Frage:

Gibt es eine Möglichkeit, dieses Verhalten zu korrigieren und das Feld "mirrororing_partner_instance" dazu zu bringen, den vollqualifizierten Domänennamen des Spiegels mit dem Überwachungsport zu speichern?

Bei der Endpunkterstellung? Auf Spiegelung der Konfigurationsebene (über eine Änderung der Datenbankanweisung)? DB Engine Konfiguration?

Ich habe bereits erfolgreich versucht, einen SQL Server Native-Clientalias auf Clientcomputern als Problemumgehung einzurichten. Ich würde es jedoch wirklich vorziehen, wenn der Hauptserver die richtigen Failover-Informationen an Clientanwendungen zurückgibt.

Alexis Stap
quelle
Ich stehe vor genau demselben Szenario, in dem ich manchmal den Computernamen in der Verbindungszeichenfolge und nicht im vollqualifizierten Domänennamen sehe und sehr traurig bin, dass er zwei Jahre später unbeantwortet bleibt. Ich habe eine Hosts-Datei verwendet, aber das ist nicht ideal. Hat einer von Ihnen das Problem gelöst?
ss2k

Antworten:

1

Schlagen Sie vor, dass Sie überprüfen, ob in jeder Box jeder FQDN mit Port usw. für jedes Ziel / sql-srv sowie der FQDN des Zeugen registriert ist. Auf jedem Server sind alle drei beim FQDN registriert. Die Endpunkte neu initialisieren und die Daumen drücken! :) Wenn Sie in DMZ sind, können Sie AD in DMZ verwenden? oder gibt es vielleicht Vertrauen zurück aus dem Unternehmen AD? Wenn Kurznamen registriert und FQDN registriert sind, denken Sie, dass diese Vertrauensstellung Ihnen möglicherweise passt. Daher wird ein Nicht-FQDN verwendet. Rick

RickWillemain
quelle