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.
quelle
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
CompanyID
zu 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.
quelle
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.
quelle
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.
quelle
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).
quelle
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
Ich freue mich, von Ihnen in den Kommentaren zu hören, wenn Sie denken, ich vermisse etwas!
quelle