Verwenden von SAN Replication / Snapshots für die SQL Server-Notfallwiederherstellung?

7

Wir haben eine Webanwendung, die SQL Server 2008 auf einem einzelnen Datenbankserver verwendet. Der gesamte Speicher ist lokal. Im letzten Jahr haben wir versucht, eine beliebige Form der SQL Server-Replikation für unsere Konfiguration bereitzustellen, dies ist jedoch nicht der Fall. Der Grund dafür ist, dass wir über 2.000 Datenbanken haben, die ständig aktualisiert werden (eine für jeden unserer Kunden). Unsere Tests zeigen daher, dass alle Formen der Replikation zu ressourcenintensiv sind.

Jedes Mal, wenn ich diese Frage stelle, konzentrieren sich die Leute auf die Tatsache, dass wir zu viele Datenbanken haben. Dies kann sich (aus regulatorischen und anderen Gründen) nicht ändern. Daher möchte ich mich darauf konzentrieren, wie wir die Daten replizieren können.

Uns wurde gesagt, dass eine Option darin besteht, alle Daten in ein SAN zu verschieben und das SAN die Daten replizieren zu lassen (oder häufige Schnappschüsse zu machen). Wenn unser Datenbankserver jedoch ausfällt, besteht in diesem Fall das Risiko, dass eine Datenbank beschädigt wird? Ist es möglich, das in ein anderes SAN replizierte SAN zu nutzen, um eine anständige DR-Lösung bereitzustellen (in unserem Fall können wir bis zu 30 Minuten Daten verlieren, aber wir können nicht den Wert eines ganzen Tages verlieren ... dh wir können ' t zu einem Backup der vorherigen Nacht gehen).

Piep Piep
quelle
Brent Ozar hat einige gute Sachen auf seiner Website: brentozar.com/archive/2011/12/…
Squillman

Antworten:

6

Wie in anderen Antworten erwähnt:

  • Datenbankspiegelung im alten Stil und AlwaysOn im neuen Stil benötigen Threads, und mit 2000 Datenbanken werden Ihnen definitiv die Threads ausgehen. Ich erinnere mich sehr daran, dass die praktische Grenze weit unter 200 Datenbanken liegt. (Irgendwo gibt es ein Whitepaper dazu, aber ich bin zu faul, um es jetzt zu suchen, und diese Antwort ist bereits sehr lang.) Natürlich sind das 200 Datenbanken pro Instanz. Theoretisch könnten Sie 20 Instanzen starten und 100 Datenbanken auf jeder Instanz ausführen. Das alles zu verwalten wäre ein Aufwand, und ich vermute, dass das Verwalten des Speichers zwischen all diesen Instanzen Kopfschmerzen bereiten würde.

  • Die SQL Server-Replikation (Replizieren von Tabellen (oder Teilmengen von Tabellen) anstelle von Dateien) ist nicht wirklich für DR gedacht. Selbst für einige Datenbanken ist die Einrichtung und Verwaltung schwierig. Möglicherweise müssen Sie Ihr Datenmodell ändern, damit es funktioniert. Dies kann Änderungen an Ihrer App bedeuten. Sie benötigen eine automatisierte Methode, um dieselbe Replikationskonfiguration auf jede Ihrer 2000 (vermutlich identischen oder nahezu identischen) Datenbanken anzuwenden. Die gespeicherten Prozeduren, die Sie zum Konfigurieren der Replikation verwenden müssen, sind unübersichtlich. Die Verwaltung von 2000 Datenbanken, die für die Replikation über die GUI konfiguriert sind, wäre ein Albtraum. Wenn Sie ein Failover durchführen, müssen Sie möglicherweise Änderungen vornehmen, damit alles wieder funktioniert. Die Failover-Zeit ist nicht, wenn Sie knifflige Änderungen oder Arbeiten vornehmen möchten, die Sie vermeiden können. Sie möchten alles so schnell wie möglich wieder zum Laufen bringen.

  • Die Replikation zwischen SAN-Speichereinheiten kann teuer sein, insbesondere wenn es sich um Hardware eines Unternehmens wie EMC handelt. Sobald Sie mit einem Anbieter beginnen, sind Sie mit ihm verheiratet, um Upgrades, Wartung, zusätzlichen Speicherplatz usw. zu erhalten.

Vorschlag Nr. 1: Haben Sie sich so etwas wie Steeleyes DataKeeper angesehen? Es handelt sich um ein softwarebasiertes Replikationsprodukt, das auf Ihren Servern ausgeführt wird und Windows Failover Clustering nutzt. Ich habe es nie benutzt und habe keine Verbindung zur Firma, außer ein paar Hund-und-Pony-Shows durchzusitzen. Es sieht ideal für Ihre Situation aus.

Vorschlag Nr. 2: Wenn ich es wäre und ich absolut kein Budget hätte, würde ich mir ein selbst entwickeltes Holzversandsystem ansehen. Ich habe Zweifel, dass der integrierte Protokollversand mit 2000 Datenbanken sehr gut umgehen kann. Es ist nicht so schwer, ein Protokollversandsystem zu schreiben, und es kann alle Probleme lösen, die für Ihre Umgebung spezifisch sind. (Möglicherweise müssen Sie die Dateien per SFTP an Ihre DR-Site senden.)

Grundsätzlich besteht das System aus drei Teilen. Jeder Teil muss regelmäßig ausgeführt werden:

  • Ein Teil führt die Transaktionsprotokollsicherungen durch und legt die tlog-Sicherungsdateien für jede Datenbank in einem anderen Ordner ab (für die Skalierung des Dateisystems). Ich würde den Wartungsassistenten dafür nicht verwenden. Ich habe gesehen, dass er zu oft wackelig wird und anfängt, Datenbanken zu überspringen und sich im Allgemeinen schlecht zu benehmen. Wenn Sie eine 30-minütige Garantie gewähren möchten, wird diese möglicherweise alle 15 Minuten ausgeführt.

  • Ein Teil kopiert die Sicherungsdateien aus dem Staging-Bereich auf Ihre DR-Site. Dies kann so einfach sein wie eine Robocopy-CMD-Datei, wenn Sie über ein VPN zu Ihrem DR verfügen. Sie können ein Paket oder ein Powershell-Skript schreiben, wenn Sie etwas ausgefalleneres benötigen (sftp oder ssh / scp oder zip / unzip, wenn Sie keine integrierte Backup-Komprimierung haben). Dies kann schneller laufen, vielleicht alle 5 Minuten, um sicherzustellen, dass alles kommt. Sobald etwas außerhalb des Standorts kopiert wurde, ist es "sicher".

  • Ein Teil stellt die am DR-Standort gefundenen tlog-Sicherungen auf Ihrem sekundären Server wieder her. Sie müssen sicherstellen, dass Sie die wiederhergestellten Tlogs identifizieren und sie verschieben oder nach einem bestimmten Zeitplan löschen, da sonst der Speicherplatz knapp wird. Dies muss nicht so häufig ausgeführt werden, aber Sie müssen sicherstellen, dass es auf allen verfügbaren tlog-Sicherungen ausgeführt wurde, bevor Sie die DR-Sekundärseite als "live" deklarieren, wenn Sie ein Problem haben.

Sie möchten Tabellen, die alle drei Schritte überwachen, einige Berichte / Skripte, die Ihnen zeigen, was passiert ist (läuft eine bestimmte Datenbank auf Ihrem primären oder sekundären Standort? Hat eine Datenbank auf dem sekundären Standort keine Tlog-Wiederherstellung in beispielsweise zwei Stunden gesehen? ) und ein Warnschema.

Darüber hinaus möchte ich in der Lage sein, eine bestimmte Datenbank für das Failover sowie alles für das Failover auszuwählen. Die Möglichkeit, eine Datenbank für das Failover auszuwählen, ermöglicht ein einfaches Testen (Sie führen ein Failover einer Testdatenbank durch, nicht der Datenbank eines Kunden) und bietet Ihnen möglicherweise ein rudimentäres Lastausgleichsschema, wenn Sie auf Skalierungsprobleme stoßen. Sie möchten auch eine automatisierte Methode zum "erneuten Synchronisieren" zwischen primär und sekundär (erstellen Sie eine vollständige Sicherung von der primären und wenden Sie sie auf die sekundäre an, starten Sie den Tlogs-Fluss usw.). Diese Funktionen sind möglicherweise besser für eine Version 2.0.

(Jeder hat vergessen, dass der früheste von MS unterstützte Tlog-Versand über einige Skripte implementiert wurde, die Sie herunterladen und unter SQL 7.0 ausführen konnten. Es gab eine Go-GUI, die Benutzeroberfläche bestand aus einigen SQL-Berichten und einigen gespeicherten Prozeduren.)

Abgesehen vom Schreiben eines kleinen tsql-Codes sind die Herausforderungen hier:

  • Umstellung auf das vollständige Wiederherstellungsmodell (es scheint mir, dass Sie möglicherweise ein einfaches Wiederherstellungsmodell verwenden) und die Zunahme der Speichernutzung, die für Protokollsicherungen, größere Datenbankgrößen und was-haben-Sie wahrscheinlich sind.

  • Stellen Sie sicher, dass Ihr Speichersystem die Last häufiger tlog-Sicherungen bewältigen kann, und kopieren Sie diese rechtzeitig auf einen DR-Standort. IOW: Wenn Sie über 2000 Datenbanken verfügen und Daten bis zur letzten Stunde garantieren möchten, müssen Sie in der Lage sein, eine Transaktionsprotokollsicherung für jede dieser 2000 Datenbanken zu erstellen und auf einen Netzwerkspeicher zu übertragen (irgendwo, der sich nicht auf Ihrem Primärserver befindet ).

  • Stellen Sie sicher, dass alles im Allgemeinen Schritt hält.

Nachdem ich all das zum Laufen gebracht hatte, beschäftigte ich mich mit der Automatisierung des Failovers, wie ich meinen Websites mitteilen kann, wo die Live-Version der Datenbank eines bestimmten Kunden ausgeführt wurde usw. Wenn Sie keine Cluster-Systeme ausführen, stellen Sie sicher, dass Sie dies tun Halten Sie alle Anmeldungen / Passwörter, Jobs, Verbindungsserver usw. usw. synchron. Dies ist eine PITA.

darin Meerenge
quelle
3

Ja, es besteht die Möglichkeit, dass die Datenbank beschädigt ist. Es ist dasselbe, als ob die Box die Stromversorgung verloren hätte (Sie haben "Absturzkonsistenz").

Datenbank-Engines treffen jedoch viele Vorsichtsmaßnahmen. Jedes Mal, wenn Sie die Daten in Ihrer Datenbank ändern, heißt es "Ich werde eine Änderung vornehmen", dann wird die Änderung vorgenommen und dann wird "Ich habe die Änderung vorgenommen" angezeigt. Der Grad der Granularität hängt davon ab, wie er eingerichtet ist. Sie können jedoch fast immer einen konsistenten Status wiederherstellen, indem Sie die Protokolle erneut abspielen (was beabsichtigt ist).

Das bedeutet nicht, dass Sie keine Daten verlieren, sondern nur, dass das, was vorhanden ist, korrekt ist.

Was Sie in dieser Situation wahrscheinlich wollen (vorausgesetzt, Sie verlieren nicht Tausende von Dollars, wenn Sie 10 Minuten oder was auch immer zurücksetzen), ist eine ASYNCHRONE Replikation (Sie möchten nicht warten, bis die Schreibvorgänge in die Datenbank vom Remotespeicher bestätigt werden ). Bei den meisten gängigen Speichersystemen können Sie einfach "Schnappschuss alle X Minuten" sagen und schon sind Sie fertig.

Schließlich ist dies nicht 100% - Sie müssen noch herkömmliche Backups erstellen. Aber es ist ziemlich zuverlässig. Diese Einrichtung ist sehr verbreitet und funktioniert sowohl mit virtuellen Maschinen als auch mit Datenbanken.

Weitere Informationen finden Sie in Absichtsprotokollen, Wiedergabe, Protokollversand, High Water Mark und Konsistenzprüfpunkten.

TheFiddlerWins
quelle
2

Dies ist definitiv machbar. Ich kenne keinen freien Weg, dies zu tun, aber wir verwenden DIESES . Es ermöglicht der MSSQL-Box grundsätzlich, ihre Dateien in den Ruhezustand zu versetzen, und weist dann das 3Par-Array an, einen Snap auszuführen - was von Natur aus kohärent ist dann geht es weiter. Das Array übernimmt dann den Snap und ermöglicht es Ihnen, so viele zu haben, wie Sie möchten - realistisch gesehen möchten Sie nur etwa 24 Stunden davon, also werfen Sie sie einfach auf dieser Basis ab. Wie ich schon sagte, alles andere als kostenlos, funktioniert aber jedes Mal zu 100% und wurde speziell für diese Art von Dingen entwickelt. Ich bin mir ziemlich sicher, dass NetApp etwas Ähnliches / Identisches tut - ich kenne das Produkt einfach nicht, sorry.

Chopper3
quelle
Das mir bekannte NetApp-Äquivalent (und es gibt wahrscheinlich andere, die ich nicht kenne) ist SnapMirror .
Andrew
1

Ja, es besteht die Möglichkeit von Korruption. Kurzversion: Nach einem Absturz spielt SQL die Transaktionsprotokolle erneut ab, um Ihre Datenintegrität zu überprüfen. Wenn die Protokolldateien beschädigt sind, werden Ihre Datenbanken als verdächtig markiert. (Es gibt mehr hier .)

Was die Replikation betrifft: Es klingt so, als ob der Protokollversand wahrscheinlich die beste Wahl ist. Wenn Sie 30 Minuten verlieren können, können Sie wahrscheinlich (abhängig von der Größe der Datenbanken und ihrer Auslastung) alle 10 Minuten 1/3 davon für Ihr 30-Minuten-Fenster versenden. (Mit anderen Worten, im Falle eines Absturzes wäre 1/3 der Datenbanken 10 Minuten alt, ein weiteres Drittel 20 und ein weiteres Drittel 30.)

Katherine Villyard
quelle
1

Ich habe an einer ähnlichen Anwendung gearbeitet. Keine mandantenfähige Anwendung, die wir vorgaben, war mandantenfähig, also eine Datenbank pro Kunde. Gesaugt.

Sie können versuchen, die Datenbanken auf mehrere SQL Server aufzuteilen, damit Ihnen beim Spiegeln / Replizieren / Protokollversand nicht die Arbeitsthreads ausgehen oder Sie auf einen der anderen Engpässe stoßen.

Ich habe mir AlwaysOn in SQL 2012 angesehen und es sieht so aus, als ob es unter denselben Anforderungen leidet wie die 2008-Spiegelung für Worker-Threads. Ein Upgrade hilft Ihnen also nicht weiter.

Sie können die Replikation auf Speicherebene versuchen, wenn Sie danach fragen. Ich habe nicht viel Erfahrung damit.

mfinni
quelle