SQL Server 2017 mit 500 Datenbanken - Frequent AG trennt seit CU9 die Verbindung

15

Hallo allerseits und vielen Dank im Voraus für Ihre Hilfe. Wir haben Probleme mit SQL Server 2017-Verfügbarkeitsgruppen.

Hintergrund

Das Unternehmen ist eine B2B-Backend-Software für den Einzelhandel. Ungefähr 500 Datenbanken für einzelne Mandanten und 5 gemeinsam genutzte Datenbanken, die von allen Mandanten verwendet werden. Die Auslastungscharakteristik wird meistens gelesen, und die Mehrheit der Datenbanken weist eine sehr geringe Aktivität auf.

Am gemeinsamen Standort gehostete physische Produktionsserver wurden kürzlich von SQL Server 2014 Enterprise unter Windows Server 2012 in einer freigegebenen SAN / FCI-Konfiguration auf SQL Server 2017 Enterprise unter Windows Server 2016 mit einem 2-Socket / 32-Kern / 768 GB RAM und lokal aktualisiert SSD-Laufwerke mit AlwaysOn AG. Der AG-Datenverkehr verwendet dedizierte 10G-NIC-Ports mit gekreuzter Kabelverbindung.

Ihre Anforderung ist, dass alle Datenbanken zusammen ein Failover durchführen, sodass sie alle in einer einzigen AG zusammenfassen müssen. Es ist ein einzelnes, nicht lesbares synchrones Replikat auf einem identischen Server.

Die neuen Server sind seit Juni 2018 in Produktion. Die neuesten Updates für CU (damals CU7) und Windows wurden installiert, und das System funktionierte einwandfrei. Ungefähr einen Monat später, nach dem Update der Server von CU7 auf CU9, bemerkten sie die folgenden Herausforderungen, die in der Reihenfolge ihrer Priorität aufgelistet waren.

Wir haben die Server mit SQL Sentry überwacht und keine physischen Engpässe festgestellt. Alle Schlüsselindikatoren scheinen gut zu sein. Die durchschnittliche CPU-Auslastung liegt bei 20%, die IO-Zeiten betragen weniger als 1 ms, der RAM-Speicher ist nicht voll ausgelastet und das Netzwerk ist <1%.

Herausforderungen

Die Symptome scheinen sich nach dem Failover zu bessern, treten jedoch innerhalb weniger Tage wieder auf, unabhängig davon, welcher Server der primäre ist. Die Symptome sind auf beiden Servern identisch.

  1. Sporadische Client-Timeouts und Konnektivitätsfehler wie

    ... beim Verbindungsaufbau ist ein Fehler aufgetreten ...

    oder

    Ausführungs-Timeout abgelaufen

    Manchmal dauern diese bis zu 40 Sekunden und klingen dann ab.

  2. Der Vorgang zum Sichern des Transaktionsprotokolls dauert zehnmal länger als zuvor. Früher dauerte das Sichern der Protokolle aller 500 Datenbanken 2-3 Minuten, jetzt sind es 15-25. Wir haben überprüft, dass das Backup selbst bei gutem Durchsatz einwandfrei funktioniert. Nach Abschluss der Sicherung eines Protokolls und vor dem Starten des nächsten Protokolls tritt jedoch eine kleine Verzögerung auf. es fängt sehr niedrig an, aber innerhalb eines Tages oder zwei wird zu 2-3 Sekunden. Multipliziert mit 500 Datenbanken, und da ist der Unterschied.

  3. Gelegentlich bleiben einige scheinbar zufällige Datenbanken nach einem manuellen Failover im Status "Nicht synchronisiert" hängen. Die einzige Möglichkeit, dies zu beheben, besteht darin, entweder den SQL Server-Dienst auf dem sekundären Replikat neu zu starten oder diese Datenbanken zu entfernen und erneut der AG hinzuzufügen.

  4. Ein weiteres Problem, das von CU10 eingeführt (und in CU11 nicht behoben) wurde: Verbindungen zu sekundärem Timeout beim Blockieren von master.sys.databases und sogar nicht in der Lage, den SSMS-Objekt-Explorer für sekundäre Replikate zu verwenden. Die Hauptursache scheint zu sein, dass der Microsoft SQL Server VSS-Writer die folgende Abfrage ausgibt:

    select name, 
           recovery_model_desc, 
           state_desc, 
           CONVERT(integer, is_in_standby), 
           ISNULL(source_database_id,0) 
      from master.sys.databases
    

Beobachtungen

Ich glaube, ich habe die rauchende Waffe in den Fehlerprotokollen gefunden. Die Fehlerprotokolle sind voll mit AG-Meldungen, die als "Nur zu Informationszwecken" gekennzeichnet sind, aber anscheinend überhaupt nicht normal sind, und es besteht eine sehr starke Korrelation zwischen ihrer Häufigkeit und den Anwendungsfehlern.

Es gibt verschiedene Arten von Fehlern, die nacheinander auftreten:

  • DbMgrPartnerCommitPolicy :: SetSyncState: GUID

  • DbMgrPartnerCommitPolicy :: SetSyncAndRecoveryPoint: GUID

  • AlwaysOn Availability Groups-Verbindung mit sekundärer Datenbank für primäre Datenbank 'XYZ' auf dem Verfügbarkeitsreplikat 'DB' mit Replikat-ID: {GUID} beendet. Dies ist nur eine Informationsnachricht. Es ist keine Benutzeraktion erforderlich.

  • AlwaysOn Availability Groups-Verbindung mit sekundärer Datenbank für primäre Datenbank 'ABC' auf dem Verfügbarkeitsreplikat 'DB' mit Replikat-ID: {GUID}. Dies ist nur eine Informationsnachricht. Es ist keine Benutzeraktion erforderlich.

An manchen Tagen gibt es Zehntausende davon.

In diesem Artikel wird die gleiche Art von Fehlersequenz in SQL 2016 beschrieben. Dort heißt es, dass sie abnormal ist. Dies erklärt auch das Phänomen der Nicht-Synchronisierung nach dem Failover. Das besprochene Problem war für 2016 und wurde Anfang dieses Jahres in einer CU behoben. Es ist jedoch der einzige relevante Verweis, den ich für die ersten beiden Nachrichtentypen finden konnte, abgesehen von Verweisen auf automatische erste Seeding-Nachrichten, die hier nicht der Fall sein sollten, da die AG bereits eingerichtet ist.

Hier ist eine Zusammenfassung der täglichen Fehler der letzten Woche für Tage mit mehr als 10.000 Fehlern pro Typ auf dem PRIMARY (sekundäres Ereignis zeigt "Verbindungsverlust mit primärem ..."):

Date        Message Type (First 50 characters)                  Num Errors
10/8/2018   DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint:  61953
10/3/2018   DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint:  56812
10/4/2018   DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint:  27951
10/2/2018   DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint:  24158
10/7/2018   DbMgrPartnerCommitPolicy::SetSyncAndRecoveryPoint:  14904
10/8/2018   Always On Availability Groups connection with seco  13301
10/3/2018   DbMgrPartnerCommitPolicy::SetSyncState: 783CAF81-4  11057
10/3/2018   Always On Availability Groups connection with seco  10080

Gelegentlich sehen wir auch "seltsame" Nachrichten wie:

Die Verfügbarkeitsgruppendatenbank "DB" wechselt die Rollen von "SECONDARY" zu "SECONDARY", da die Spiegelungssitzung oder Verfügbarkeitsgruppe aufgrund der Rollensynchronisierung fehlgeschlagen ist. Dies ist nur eine Informationsnachricht. Es ist keine Benutzeraktion erforderlich.

... unter einer Vielzahl von sich ändernden Zuständen von "SECONDARY" zu "RESOLVING".

Nach einem manuellen Failover wird das System möglicherweise mehrere Tage lang ohne eine einzige Meldung dieser Art ausgeführt, und plötzlich werden ohne ersichtlichen Grund Tausende auf einmal angezeigt, was wiederum dazu führt, dass der Server nicht mehr reagiert und die Anwendung startet Verbindungs-Timeouts. Dies ist ein kritischer Fehler, da einige ihrer Anwendungen keinen Wiederholungsmechanismus enthalten und daher möglicherweise Daten verlieren. Wenn eine solche Fehlerhäufung auftritt, gibt die folgende Wartezeit eine Rakete aus. Dies zeigt die Wartezeiten direkt nachdem AG die Verbindung zu allen Datenbanken auf einmal verloren zu haben scheint:

Wartet, wenn ein schwerwiegender Ausbruch von AG-Fehlern auftritt

Ungefähr 30 Sekunden später kehrt alles in Bezug auf Wartezeiten zum Normalzustand zurück, aber die AG-Meldungen fluten die Fehlerprotokolle weiterhin mit unterschiedlichen Raten und zu verschiedenen Tageszeiten, scheinbar zu zufälligen Zeiten, einschließlich Nebenzeiten. Die gleichzeitige Erhöhung der Arbeitslast während dieser Fehlerbündel macht die Sache natürlich noch schlimmer. Wenn nur wenige Datenbanken getrennt werden, kommt es in der Regel nicht zu einer Zeitüberschreitung bei den Verbindungen, da sie von sich aus schnell genug aufgelöst werden.

Wir haben versucht zu überprüfen, ob das Problem durch CU9 verursacht wurde, konnten jedoch beide Knoten nur auf CU9 zurückstufen. Der Versuch, einen der Knoten auf CU8 herunterzustufen, führte dazu, dass der Knoten im Status "Lösung" hängen blieb und denselben Fehler im Protokoll aufwies:

Die permanente Konfiguration der Gruppe "Immer verfügbar" mit der entsprechenden Ressourcen-ID "..." kann nicht gelesen werden. Die persistierte Konfiguration wird von einem SQL Server einer höheren Version geschrieben, der das primäre Verfügbarkeitsreplikat hostet. Aktualisieren Sie die lokale SQL Server-Instanz, damit das lokale Verfügbarkeitsreplikat zu einem sekundären Replikat wird.

Dies bedeutet, dass wir die Ausfallzeit einführen müssen, um beide Knoten gleichzeitig auf CU8 herunterstufen zu können. Dies deutet auch darauf hin, dass es ein großes Update für AG gab, das erklären könnte, was wir gerade erleben.

Wir haben bereits versucht, die max_worker_threads von ihrer Standardeinstellung 0 (= 960 auf unserer Box basierend auf diesem Artikel ) schrittweise auf 2.000 anzupassen, ohne dass sich dies auf die Fehler auswirkt.

Was können wir tun, um diese AG-Verbindungsabbrüche zu lösen? Gibt es jemanden, der ähnliche Probleme hat? Können andere Benutzer mit einer großen Anzahl von Datenbanken in einer AG möglicherweise ähnliche Meldungen im SQL-Fehlerprotokoll sehen, die mit CU9 oder CU8 beginnen?

Vielen Dank im Voraus für jede Hilfe!

SQLRaptor
quelle

Antworten:

9

Aktualisieren:

  1. Es wurde bestätigt, dass es sich bei den Unterbrechungen der Gruppe für häufige Verfügbarkeit um eine Regression handelt, die von CU9 eingeführt und nach der Installation von CU12 behoben wurde.
  2. Es wurde bestätigt, dass es sich bei den Blockierungsproblemen auf dem sekundären Replikat um ein Problem mit einer Aktualisierung des in CU10 eingeführten VSS-Writer-Codes handelt. Hoffentlich wird es in CU 13 behoben. Die vorläufige Lösung besteht darin, die VSS-Writer-DLLs manuell durch die Pre-CU10-DLLs zu ersetzen ...

    BEGIN RANT-SACTION;

    Leider scheint Microsoft nicht nur Windows 10-Updates, sondern auch unternehmenskritische Software wie SQL Server wiederholt nicht ordnungsgemäß zu überprüfen.

    Ich habe ihre bisherige Strategie der Service Packs sehr bevorzugt. Zumindest hatten sie genug Zeit, um sie ordnungsgemäß zu testen, bevor sie ihren Kunden Produktionskrisen und Datenverluste zufügten, wenn sie sorglos halbherbe Aktualisierungen herausgaben.

    COMMIT RANT-SACTION;
SQLRaptor
quelle
2

Hast du die Worker-Threads überprüft? Normalerweise wird immer mehr Arbeitsthread zum Arbeiten verwendet, und normalerweise ist der Standardwert nicht ausreichend. Ich hatte das gleiche Problem mit 600 Datenbanken in einem immer auf, also fügen wir mehr Threads zum Instanzparameter hinzu und das hat unser Problem behoben. Hoffe das hilft!

Gonzalo Bissio
quelle
2
Hallo @Gonzalo und danke für den Rat. Wir haben bereits den Einstellungswinkel max_worker_threads behandelt, es sind jedoch keine Fehler aufgetreten, wie z. B. "Kein Arbeitsthread verfügbar". Diese treten häufig in Fällen auf, in denen nicht genügend Threads vorhanden sind. Die Standardeinstellung für unsere Box war weniger als 1K-Threads. Wir haben sie schrittweise auf 2K angehoben, ohne dass sich dies auf die Fehler auswirkt. Wir erfassen Worker-Thread-Metriken, die im Durchschnitt um 1500 liegen, einschließlich der AG-Threads, die nicht zum Maximum gezählt werden. Daher sind wir weit vom Thread-Limit entfernt.
SQLRaptor