Gibt es eine Beschränkung für die Anzahl der Datenbanken, die Sie auf einem SQL Server speichern können?

43

Ich richte ein SaaS-System ein, in dem wir jedem Kunden eine eigene Datenbank zur Verfügung stellen möchten. Das System ist bereits so eingerichtet, dass wir problemlos auf zusätzliche Server skalieren können, wenn die Auslastung zu hoch wird. Wir hoffen, Tausende oder sogar Zehntausende von Kunden zu haben.

Fragen

  • Gibt es eine praktische Beschränkung für die Anzahl der Mikrodatenbanken, die Sie auf einem SQL Server haben können / sollten?
  • Kann sich dies auf die Leistung des Servers auswirken?
  • Ist es besser, 10.000 Datenbanken mit jeweils 100 MB oder eine Datenbank mit 1 TB zu haben?

Zusätzliche Information

Wenn ich "Mikro-Datenbanken" sage, meine ich nicht wirklich "Mikro"; Ich meine nur, dass wir Tausende von Kunden anstreben, sodass jede einzelne Datenbank nur ein Tausendstel oder weniger des gesamten Datenspeichers ausmacht. In der Realität würde jede Datenbank etwa 100 MB groß sein, je nachdem, wie viel davon genutzt wird.

Der Hauptgrund für die Verwendung von 10.000 Datenbanken liegt in der Skalierbarkeit. Fakt ist, V1 des Systems hat eine Datenbank, und wir hatten einige unangenehme Momente, als die DB unter der Last belastet war.

CPU, Arbeitsspeicher, E / A waren überlastet - all das oben Genannte. Obwohl wir diese Probleme behoben haben, haben sie uns bewusst gemacht, dass wir trotz der besten Indizierung der Welt nicht alle Daten in einem großen Hönkin zusammenfassen können, wenn wir so erfolgreich sind, wie wir es uns erhoffen 'Datenbank. Für V2 werden wir also sharden, damit wir die Last auf mehrere DB-Server aufteilen können.

Ich habe das letzte Jahr damit verbracht, diese Lösung zu entwickeln. Es ist eine Lizenz pro Server, aber das ist in jedem Fall erledigt, da wir VMs auf Azure verwenden. Der Grund, warum die Frage jetzt auftaucht, ist, dass wir früher nur großen Institutionen angeboten und jede einzelne von ihnen selbst gegründet haben. Unsere nächste Aufgabe ist ein Self-Service-Modell, bei dem sich jeder mit einem Browser anmelden und eine eigene Datenbank erstellen kann. Ihre Datenbanken werden viel kleiner und zahlreicher sein als die der großen Institutionen.

Wir haben versucht, elastische Azure SQL-Datenbankpools zu erstellen . Die Leistung war sehr enttäuschend, daher haben wir wieder auf reguläre VMs umgestellt.

Shaul Behr
quelle

Antworten:

80

Ich habe an SQL Servern mit 8 bis 10 Tausend Datenbanken in einer einzelnen Instanz gearbeitet. Es ist nicht hübsch.

Das Neustarten des Servers kann bis zu einer Stunde oder länger dauern. Denken Sie an den Wiederherstellungsprozess für 10.000 Datenbanken.

Sie können SQL Server Management Studio nicht verwenden, um eine Datenbank im Objekt-Explorer zuverlässig zu finden.

Backups sind ein Albtraum, denn damit sich Backups lohnen, müssen Sie über eine funktionsfähige Disaster Recovery-Lösung verfügen. Hoffentlich ist Ihr Team großartig darin, alles zu schreiben .

Sie beginnen damit, Datenbanken mit Zahlen wie M01022und zu benennen T9945. Der Versuch, sicherzustellen, dass Sie in der richtigen Datenbank arbeiten, z. B. M001022statt M01022, kann verrückt sein.

Das Zuweisen von Speicher für so viele Datenbanken kann unerträglich sein. SQL Server führt am Ende eine Menge E / A aus, was die Leistung erheblich beeinträchtigen kann. Stellen Sie sich ein System vor, das die Kohlenstoffverbrauchsdaten für 10.000 Unternehmen in 4 Tabellen aufzeichnet. Wenn Sie dies in einer Datenbank tun, benötigen Sie nur 4 Tabellen. Wenn Sie dies in 10.000 Datenbanken tun, benötigen Sie plötzlich 40.000 Tabellen im Speicher. Der Aufwand für den Umgang mit dieser Anzahl von Tabellen im Speicher ist erheblich. Für jede Abfrage, die Sie für diese Tabellen entwerfen, sind mindestens 10.000 Pläne im Plan-Cache erforderlich, wenn 10.000 Datenbanken verwendet werden.

Die obige Liste ist nur eine kleine Auswahl von Problemen, die Sie einplanen müssen, wenn Sie in einem solchen Maßstab arbeiten.

Wahrscheinlich wird es sehr lange dauern, bis der SQL Server-Dienst gestartet wird, was zu Service Controller-Fehlern führen kann. Sie können die Startzeit des Dienstes selbst erhöhen, indem Sie den folgenden Registrierungseintrag erstellen:

Unterschlüssel: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control
Name: ServicesPipeTimeout
Typ: REG_DWORD
Daten: Die Anzahl der Millisekunden vor dem Timeout während des Dienststarts

Geben Sie 600000 ein, um beispielsweise 600 Sekunden (10 Minuten) zu warten, bevor das Zeitlimit für den Dienst überschritten wird.


Seit ich meine Antwort geschrieben habe, ist mir klar geworden, dass die Frage über Azure spricht. Möglicherweise ist dies in der SQL-Datenbank nicht so problematisch. vielleicht ist es problematischer. Persönlich würde ich wahrscheinlich ein System entwerfen, das eine einzige Datenbank verwendet, die möglicherweise vertikal über mehrere Server verteilt ist, aber sicherlich nicht eine Datenbank pro Kunde.

Max Vernon
quelle
3
Gutes Zeug. Im Poster wird möglicherweise eine Methode zur Verwendung mehrerer Datenbanken, jedoch mehrerer Kunden pro Datenbank in Betracht gezogen, damit diese die Anzahl der Datenbanken begrenzen können, aber dennoch auf mehrere Server skalieren können.
Tony Hinkle
5
Ich verwalte derzeit eine Instanz mit einer DB-Anzahl in den oberen 4 Ziffern und kann so ziemlich alles wiedergeben. Ein weiteres Problem, das bei Betrieb in dieser Größenordnung auftritt, ist die Unfähigkeit, Ausführungspläne für einen langen Zeitraum zwischenzuspeichern. Das Ergebnis ist eine Menge von Abfrageplänen, die beim Neukompilieren des CPU-Brennens anfallen.
Alroc
19

Beide Methoden haben also Vor- und Nachteile. Ohne mehr über Ihre Bewerbung oder die Dienste zu wissen, die Sie anbieten möchten, kann ich keine endgültige Antwort geben, aber ich werde einige meiner Überlegungen zu diesem Thema verwerfen.

Mein Fall, warum Sie 1 Datenbank für alle Kunden verwenden sollten.

Vorteile

  • Einfache Wartung Ein einziger DB bedeutet, dass Sie Ihre Wartungsaufgabe nur an einem Ort anstatt an vielen erledigen müssen. Stellen Sie sich den Albtraum vor, 1000 verschiedene Datenbanken zu sichern. Wie wäre es mit dem Aktualisieren von Statistiken zu 1000 DBs oder dem Neuerstellen von Indizes oder DBCC CHECKDB?

  • Code bereitstellen. Angenommen, Sie haben ein Problem mit einer gespeicherten Prozedur in Ihrem Anwendungscode oder in der Berichterstellung. Sie müssen eine schnelle Änderung vornehmen ... Jetzt müssen Sie diese Änderung in mehr als 1000 DBs implementieren. Nein, danke, ich möchte lieber nicht.

  • Leichte Sichtbarkeit. Stellen Sie sich SSMS vor, das versucht, mehr als 1000 DBs zu öffnen (Schauer) . Es würde das Problem praktisch unbrauchbar machen und überraschend viel Zeit in Anspruch nehmen, nur SSMS zu öffnen und zu rendern. Denken Sie daran, wenn Sie in der Lage sind, eine anständige Namenskonvention zu finden.

Nachteile

  • Sicherheit. Es wäre einfacher zu verhindern, dass andere Benutzer die Kundendaten einsehen, wenn Sie sie als separate Datenbanken hätten. Es gibt jedoch einige sehr einfache Dinge, die Sie tun können, um dies zu verhindern.

  • Performance. Man könnte argumentieren, dass die Beschränkung auf eine Datenbank pro Kunde bedeutet, dass der SQL Server weniger Daten scannen muss, um die von Ihnen abgefragten Informationen zu erhalten. Bei richtiger Datenstruktur und guter Indizierung (und möglicher Partitionierung) können Sie dieses Problem jedoch wahrscheinlich beseitigen, wenn Sie dies sorgfältig tun. Ich würde empfehlen, jeder Tabelle, die kundenspezifische Daten enthält, eine Art Hinweis CompanyIDzu geben, um diesen Aufwand zu verringern.

Letztendlich denke ich, dass Sie am besten eine Datenbank für Ihre Anwendung haben und nur Kundendaten in der Datenbank selbst aufteilen. Die Probleme, die es Ihnen bereiten wird, sind nichts im Vergleich zu dem Albtraum, über 1000 Datenbanken zu verwalten.

Zane
quelle
17

Die maximalen Kapazitätsspezifikationen für SQL Server geben an , dass es ein Limit von 32.767 gibt.

Ob sich dies auf die Leistung auswirkt, ist die Antwort "Ja", aber die Art und Weise, wie sich dies auf die Leistung auswirkt, und ob dies erheblich ist, hängt von einer Vielzahl von Faktoren ab.

Ich würde mich für eine Datenbank entscheiden, es sei denn, es gibt einen guten Grund, sie auf 10.000 Datenbanken aufzuteilen. Ein Backup oder 10.000 Backups? Eine Integritätsprüfung oder 10.000? Es mag einen guten Grund geben, 10.000 kleine DBs zu verwenden, aber Sie haben nicht genug Details angegeben, um dies festzustellen. Die Frage, die Sie gestellt haben, ist ziemlich weit gefasst, und es gibt einfach nicht genug Informationen, um die beste Antwort zu finden.

Tony Hinkle
quelle
7

Sie sprechen hier von einer Architektur mit mehreren Mandanten und Instanzen . Ich spreche nur diese Begriffe an, da Sie sie in Ihrer Frage nicht verwenden, aber das, worüber Sie sprechen, heißt. Wenn Sie nur die "Multi-Tenant-Architektur" in Google einbinden, werden Sie eine Fülle von Ressourcen und Diskussionen finden Darüber sind ganze Bücher geschrieben worden.

Einige gute Ressourcen zu SQL Server speziell hier:

https://msdn.microsoft.com/en-us/library/ff966499.aspx

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-patterns-multi-tenancy-saas-applications

Ich würde mich mit anderen Antworten dahingehend engagieren, dass ich mich standardmäßig stark an Mandanten orientiere, es sei denn, Sie haben zwingende Gründe, die Multiinstanz zu bevorzugen.

Sie müssen zum Skalieren nicht in Tausende einzelne Client-Datenbanken aufteilen, es gibt viele andere Möglichkeiten, die wahrscheinlich vorzuziehen sind. Wie Clustering, Replikation, Sharding, Partitionierung usw. Das Rad nicht neu erfinden. Es gibt nichts, was besagt, dass Sie dies manuell auf einzelne Kundenebene aufteilen müssen, und in der Tat wird dies wahrscheinlich die Kosten für das Hinzufügen jedes neuen Kunden erheblich erhöhen.

Sie sprechen von "Millionen" Kunden. Stellen Sie sich eine große Cloud-basierte Software als Service vor. Gmail. Was auch immer. Sie glauben kaum, dass sie für jede neue Anmeldung eine völlig neue Datenbank erstellen.

Es kann Gründe geben, warum Sie dies vereinfachen möchten, zum Beispiel, wenn Sie Ihr Produkt an einen Kunden verkaufen, der MUSS, dass es intern auf seiner eigenen Infrastruktur gehostet wird. Als allgemeine SAAS-Regel sollten Sie jedoch standardmäßig eine mandantenfähige Architektur verwenden.

Ivan McA
quelle
7

Einer der Nachteile des Vorschlags für eine einzelne Datenbank ist das Zurücksetzen von Daten. Wenn Sie eine Datenbank pro Mandant eingerichtet haben, können Sie die Daten jedes Clients unabhängig (und zu einem bestimmten Zeitpunkt) wiederherstellen. Wenn sich alle in einer Datenbank befinden, wird dies sehr viel schwieriger (und fehleranfälliger, da dies wahrscheinlich über INSERT / UPDATE / DELETE-Anweisungen erfolgen müsste).

Darshan
quelle
+1 - Dies ist einer der wenigen äußerst wünschenswerten Vorteile eines Mandanten mit einer Datenbank.
Max Vernon
6

Vielen Dank an alle, die geantwortet haben - schätzen Sie wirklich die Punkte, die Sie mir gegeben haben, um darüber nachzudenken. Ich hatte das allgemeine Gefühl, dass eine einzelne Datenbank vorzuziehen ist, möchte jedoch einige Gegenmaßnahmen zugunsten der Sharded-Architektur ergreifen und auf einige der Bedenken eingehen, die andere angesprochen haben.

Motivation zum Scherben

Wie in der (aktualisierten) Frage erwähnt, streben wir weltweit massive Umsätze mit buchstäblich Millionen von Nutzern an. Mit der weltweit besten Hardware und Indizierung übernimmt kein einziger DB-Server die Last, sodass wir in der Lage sein müssen, auf mehrere Server zu verteilen. Und wenn Sie einmal nachsehen müssen, auf welchem ​​Server sich die Daten eines Kunden befinden, ist es nicht viel mühsamer, ihm eine dedizierte Datenbank zuzuweisen, was die Arbeit vereinfacht, da die Daten der Benutzer sauber voneinander getrennt werden.

Reaktion auf Bedenken

  • Das Neustarten des Servers dauert sehr lange: OK, aber im normalen Betrieb ist kein Neustart von Servern geplant. Das System muss letztendlich rund um die Uhr online sein. Wenn wir also Ausfallzeiten haben, muss dies trotzdem geplant werden.
  • Backups / Disaster Recovery: Wir verwenden CloudBerry, das alles automatisiert. Kein Problem.
  • Benennen von Datenbanken / Auffinden in SSMS: Die Namenskonvention ist einfach und basiert nur auf dem Kundennamen. Fügen Sie Seriennummern hinzu, wenn Namen geteilt werden.
  • Wartung: Wenn jede Datenbank so klein ist, wie ich es mir vorgestellt habe, sollte es nicht erforderlich sein, Indizes manuell neu zu erstellen.
  • Bereitstellen von Code: Wir verwenden Entity Framework, sodass jede Schemaänderung mit neuen Releases automatisch auf jede Datenbank übertragen wird. Es ist jedoch richtig, dass es nicht so einfach ist, ein Leistungsproblem in der Produktion zu beheben, das durch eine einfache Indexoptimierung behoben werden kann. Andererseits ist es unwahrscheinlich, dass es bei einer so kleinen Datenbank zu Problemen mit der Showstopper-Leistung auf den Produktionsshards kommt. Und die gemeinsame Datenbank bleibt eine einzelne Datenbank, für die diese Bedenken nicht gelten.

Ich freue mich, von Ihnen in den Kommentaren zu hören, wenn Sie denken, ich vermisse etwas!

Shaul Behr
quelle
3
Wenn Sie rund um die Uhr arbeiten, müssen Sie sich mit dem Clustering Ihrer Datenbanken befassen. Das bloße Anwenden von Patches führt zu zumindest einigen Ausfallzeiten. Ich bin mir nicht sicher, wie dies für Cloud-basierte Lösungen wie Azure zutrifft. Ich hoffe, es ist für Sie erledigt.
Jay Zelos
Ich glaube, dass mit der heutigen DB-Technologie fast alle Gründe für "Scherben" nicht mehr gültig sind. Ich glaube, Sie werden es entweder später bereuen oder vielleicht gar nicht merken, wie schlecht es Ihnen im Vergleich geht, und es daher nicht aus Unwissenheit bereuen. Ich stimme der Antwort von Max zu und könnte es nicht besser erklären.
Joe