Das Problem beim Sharding ist, dass die Anwendung wissen muss, welche Shards abgefragt werden sollen. Im Allgemeinen geschieht dies durch Splittern auf so etwas wie einem Client. Ich werde einen meiner alten Blog-Posts anpassen , um ihn als meine Antwort zu verwenden.
Wenn Sie eine Anwendung für viele Clients erstellen, gibt es zwei gängige Methoden zum Entwerfen der Datenbank (en):
- Option A: Legen Sie alle Clients in derselben Datenbank ab
- Option 2: Erstellen Sie eine Datenbank pro Client
Alle Clients in dieselbe Datenbank stellen
Es ist ganz einfach: Fügen Sie einfach eine Client-Tabelle am oberen Rand des Schemas hinzu, fügen Sie eine ClientUsers-Tabelle hinzu, um sicherzustellen, dass die Benutzer nur ihre eigenen Daten sehen.
Vorteile dieses Ansatzes:
Einfacheres Schema-Management. Wenn Entwickler eine neue Version der Anwendung bereitstellen, müssen sie nur Schemaänderungen in einer Datenbank vornehmen. Es besteht keine Gefahr, dass verschiedene Kunden nicht synchronisiert sind oder die falsche Version verwenden.
Einfachere Leistungsoptimierung. Wir können die Indexnutzung und Statistiken an nur einer Stelle überprüfen, Verbesserungen einfach implementieren und die Auswirkungen auf alle unsere Kunden sofort sehen. Bei Hunderten oder Tausenden von Datenbanken kann es schwierig sein, selbst kleinste Änderungen zu koordinieren. Wir können den Inhalt des Prozedurcaches überprüfen und feststellen, welche Abfragen oder gespeicherten Prozeduren in der gesamten Anwendung am intensivsten sind. Wenn wir jedoch separate Datenbanken pro Client verwenden, kann es zu einer härteren Zeit für die Aggregation der Abfragen in verschiedenen Ausführungsplänen kommen.
Einfacheres Erstellen einer externen API. Wenn wir Außenstehenden Zugriff auf unsere gesamte Datenbank gewähren müssen, um Produkte zu erstellen, können wir dies einfacher tun, wenn sich alle Daten in einer einzigen Datenbank befinden. Wenn die API Daten aus mehreren Datenbanken auf mehreren Servern gruppieren muss, verlängert sich die Entwicklungs- und Testzeit. (Auf der anderen Seite deutet diese Sache mit mehreren Servern auf eine Einschränkung für das Szenario mit einer Datenbank für alle Regeln hin: Eine Datenbank bedeutet normalerweise, dass sich unsere gesamte Auslastung nur auf einen Datenbankserver auswirkt.) In Ihrem Fall Mit PowerBI wird die Verwaltung von Verbindungen erheblich vereinfacht, wenn alle Benutzer in einer Datenbank sind.
Einfachere Hochverfügbarkeit und Notfallwiederherstellung. Es ist wirklich sehr einfach, die Datenbankspiegelung, den Protokollversand, die Replikation und das Clustering zu verwalten, wenn wir uns nur um eine einzige Datenbank kümmern müssen. Wir können schnell eine verdammte Infrastruktur aufbauen.
Platzieren jedes Clients in einer eigenen Datenbank oder einem eigenen Shard
Sie benötigen noch eine Client-Auflistung, die jetzt jedoch zu einem Verzeichnis wird. Sie verfolgen für jeden Client auch den Shard, in dem er sich befindet. Beim Start fragt Ihre App diese Tabelle ab und speichert sie im RAM zwischen. Wenn Daten für einen Client benötigt werden, wird eine direkte Verbindung zu diesem Shard (Datenbank und Server) hergestellt.
Vorteile dieses Ansatzes:
Einfachere Wiederherstellung auf einem einzelnen Client. Kunden sind unzuverlässige Fleischsäcke. (Außer meiner - sie sind verlässliche Fleischsäcke.) Sie haben alle möglichen Momente, in denen sie all ihre Daten zu einem bestimmten Zeitpunkt zurückholen möchten, und das ist ein großer Schmerz im Hintergrund, wenn sich ihre Daten mit denen vermischen andere Kundendaten in den gleichen Tabellen. Wiederherstellungen in einem Szenario mit einer einzelnen Client-Datenbank sind denkbar einfach: Stellen Sie einfach die Client-Datenbank wieder her. Sonst ist niemand betroffen.
Einfacherer Datenexport. Kunden lieben es, ihre Daten in den Griff zu bekommen. Sie möchten die Gewissheit haben, dass sie ihre Daten jederzeit abrufen können, um das gefürchtete Szenario der Lieferantenbindung zu vermeiden, und sie möchten ihre eigenen Berichte erstellen. Wenn die Daten jedes Kunden in seiner eigenen Datenbank isoliert sind, können wir ihnen einfach eine Kopie ihrer eigenen Datenbanksicherung geben. Wir müssen keine Datenexport-APIs erstellen.
Einfachere Skalierbarkeit für mehrere Server. Wenn unsere Anwendung mehr Leistung benötigt, als wir von einem einzelnen Server erhalten können, können wir die Datenbanken auf mehrere Server aufteilen. Wir können die Last auch geografisch verteilen, um Server in Asien oder Europa näher am Kunden zu platzieren.
Einfachere Leistungsoptimierung pro Client. Wenn einige Clients unterschiedliche Funktionen oder Berichte verwenden, können wir einen speziellen Satz von Indizes oder indizierten Ansichten nur für diese Clients erstellen, ohne die Datengröße aller zu erhöhen. Zugegeben, hier besteht ein gewisses Risiko: Indem wir Schemaunterschiede zwischen Clients zulassen, haben wir gerade unsere Code-Bereitstellungen etwas riskanter und unser Leistungsmanagement schwieriger gemacht.
Einfacheres Sicherheitsmanagement. Solange wir die Sicherheit mit einem Benutzer pro Datenbank ordnungsgemäß gesperrt haben, müssen wir uns keine Sorgen machen, dass Client X auf die Daten von Client Y zugreift. Wenn wir jedoch nur ein einziges Login für alle Benutzer verwenden, haben wir dieses Problem nicht wirklich gelöst.
Einfachere Wartungsfenster. In einer globalen Umgebung, in der Kunden auf der ganzen Welt verteilt sind, ist es einfacher, Kunden zur Wartung offline zu schalten, wenn dies in Gruppen oder Zonen möglich ist.
Welches ist das Richtige für Sie?
Es gibt keine richtige Wahl: Sie müssen die Stärken und Schwächen Ihres eigenen Unternehmens kennen. Nehmen wir zwei meiner Kunden als Beispiele.
Unternehmen A zeichnet sich durch Hardware-Leistungsoptimierung aus. Sie sind wirklich sehr, sehr gut darin, der Hardware das allerletzte Maß an Leistung zu entziehen, und es macht ihnen nichts aus, ihre SQL Server-Hardware in einem Zyklus von 12 bis 18 Monaten auszutauschen. (Sie aktualisieren die Webserver alle 4 bis 6 Monate!) Ihre Achillesferse stellt extreme Compliance- und Sicherheitsanforderungen. Sie haben einen unglaublichen Prüfbedarf und es ist für sie nur einfacher, kugelsichere Kontrollen auf einem einzigen Server und einer einzigen Datenbank zu implementieren, als diese Anforderungen auf Tausenden von Datenbanken auf Dutzenden von Servern zu verwalten. Sie wählten eine Datenbank, einen Server und viele Clients.
Unternehmen 2 zeichnet sich durch Entwicklungspraktiken aus. Das Verwalten von Schemaänderungen und Code-Bereitstellungen in Tausenden von Datenbanken ist für sie kein Problem. Sie haben Kunden auf der ganzen Welt und wickeln für diese Kunden rund um die Uhr Kreditkartentransaktionen ab. Sie müssen in der Lage sein, die Last geografisch zu verteilen, und sie möchten Server nicht alle 12 bis 18 Monate auf der ganzen Welt austauschen. Sie wählten eine Datenbank für jeden Client und es lohnt sich, wenn sie damit beginnen, SQL Server für ihre Offshore-Clients in Asien und Europa zu installieren.