Ist das eine gute Idee, eine Datenbank für mehr als 50.000 Geschäfte zu verwenden?

10

Ich weiß, dass Shopify nur eine Datenbank für alle Shops verwendet. Aber wie können sie mit so großen Datenmengen mit ihrer Datenbank umgehen? Ist das eine gute Idee, eine einzelne Datenbank für mehr als 50.000 Geschäfte zu verwenden?

Farid Movsumov
quelle
11
Moderne RDBMS können Hunderte von Milliarden Zeilen verarbeiten. Es ist wirklich kein Problem, wenn alles skaliert ist und geeignete Hardware vorhanden ist, um die Last zu bewältigen.
Philᵀᴹ

Antworten:

23

Bitte beachten Sie: Ich antworte aus einer SQL Server-Perspektive, daher erwähne ich einige Konzepte, die für SQL Server spezifisch sind, aber ich glaube, dass alle diese Konzepte Entsprechungen in anderen wichtigen RDBMS-Plattformen mit ähnlichen Vorteilen und Einschränkungen aufweisen.

Ich werde diese Antwort wahrscheinlich auch weiter bearbeiten, da ich an andere mögliche Vor- und Nachteile denke.

Nun, es hängt wirklich von Schema, Volumen usw. ab. Was genau speichert ein Geschäft? Wie unterscheidet es sich von der Speicherung von Daten über 50.000 Katzen oder 50.000 Produkte oder 50.000 Flügelnüsse?

Es gibt mehrere Gründe (außer nur den Größenaspekt für sich), warum Sie möglicherweise keine Daten für 50.000 verschiedene Kunden in einer einzigen Datenbank speichern möchten, wenn die Daten tatsächlich vollständig vom Kunden getrennt werden können (ohne Nachschlagetabellen wie Postleitzahlen oder anwendungsspezifische Tabellen, die in eine einzige zentrale Datenbank gelangen können):

  • Wenn ein Kunde aus der Anwendung herauswächst, gibt es keine einfache Möglichkeit, nur seine Daten zu extrahieren und auf eine andere Instanz, einen anderen Server usw. zu verschieben, um sie zu skalieren, es sei denn, Sie planen voraus und partitionieren auf so etwas wie CustomerID50.000 Dateigruppen (Sie sind begrenzt) ohnehin auf 15.000 Partitionen oder 1.000, wenn Sie eine ältere Version von SQL Server verwenden und zu viele Dateigruppen haben, kann katastrophal sein . Beachten Sie auch, dass für die Partitionierung die Enterprise Edition erforderlich ist.

  • Wenn sich herausstellt, dass alle Ihre Kunden für diese Instanz einfach zu groß sind, bedeutet Skalieren, dass Sie neue Hardware erwerben und die gesamte Datenbank dorthin verschieben (und dies möglicherweise später erneut tun).

  • Das Löschen eines Kunden kann ebenso schmerzhaft sein, da Sie einige Prozent der Zeilen aus sehr großen Tabellen löschen müssen, und das ist nicht billig.

  • Sie werden wahrscheinlich eine breite Verbreitung von Kundendaten haben (ein Kunde mit einer Milliarde Zeilen, ein anderer Kunde mit 5.000). Dies kann zu Parameter-Sniffing und einer nachteiligen Leistung führen, die Kardinalität und Planqualität betrifft (da Sie wahrscheinlich dieselben Pläne für dieselben Abfragen für sehr unterschiedliche Datensätze wiederverwenden werden).

  • Alle Ihre Kunden unterliegen genau den gleichen SLAs und HA / DR-Plänen. Sie haben entweder die gesamte Datenbank im vollständigen Wiederherstellungsmodus mit n-minütigen Protokollsicherungen oder Sie sind einfach und verlassen sich auf vollständige + diff-Sicherungen. Wenn Sie aufgrund eines Kundenfehlers zurücksetzen müssen oder die Datenbank zu einem bestimmten Zeitpunkt wiederherstellen müssen, betrifft dies jeden einzelnen Kunden.

  • Es besteht die Möglichkeit von Fehlern beim Abrufen von Daten - Fehler, bei denen Klauseln beispielsweise dazu führen können, dass ein Kunde die Daten eines anderen Kunden oder alle Daten des anderen Kunden sieht .

  • Dies kann rechtliche Auswirkungen haben (einige Unternehmen haben strenge Anforderungen, dass Sie ihre Daten nicht in derselben Datenbank wie andere Unternehmen und insbesondere die ihrer Konkurrenten ablegen).

  • Wenn die Sicherheit der Daten eines Kunden wichtig ist, ist dies mit der Datenbanktrennung viel einfacher als mit der Trennung innerhalb einer Tabelle.


Einige Vorteile, wenn jeder Kunde in einer separaten Datenbank gespeichert ist (oder zumindest mehrere Datenbanken, jeweils für eine Gruppe von Kunden):

  • In Bezug auf die Größe wird es ungefähr die gleiche Größe auf der Festplatte annehmen.
  • Das Skalieren ist einfacher, da Sie einfach eine Datenbank (oder viele) auf einen anderen Server verschieben können.
  • Das Löschen eines Kunden und aller seiner Daten entspricht in etwa DROP DATABASE.
  • Sie verwenden mehr Speicher für Pläne (oder Sie haben weniger Pläne im Cache pro Kunde), aber zumindest sind diese Pläne für die Daten in ihren jeweiligen Datenbanken relevant und weniger anfällig für Probleme mit Statistiken / Parameter-Sniffing.
  • Sie können problemlos verschiedene SLAs und DR-Pläne haben, indem Sie einige Datenbanken vollständig und andere einfach platzieren. Auch das Zurücksetzen oder Wiederherstellen zu einem bestimmten Zeitpunkt betrifft nur diesen Kunden.
  • Sie können problemlos verschiedene Datenbanken (z. B. Ihre Kunden mit hoher Priorität) auf schnelleren E / A platzieren. Sie könnten dies in einer einzelnen Datenbank mit Dateigruppen tun, aber das ist viel schwieriger zu verwalten (zumindest IMHO).

Einige Rückschläge:

  • Abgesehen von der Größe möchten Sie wahrscheinlich nicht 50.000 Datenbanken auf einer einzelnen Instanz von SQL Server haben. Dies bedeutet wahrscheinlich, dass Sie auf mehrere Server skalieren müssen.
  • Die Startzeit steigt, da das Starten jeder Datenbank mit einem gewissen Aufwand verbunden ist.
  • Die App muss etwas intelligenter sein - anstatt nur CustomerID in der where-Klausel zu haben, muss sie sich dynamisch mit der CustomerID-Datenbank verbinden. Dies ist mit einer richtigen Mittelschicht nicht schwer, aber es ist eine Veränderung.
  • Ja, Sie haben viele Kopien derselben Tabellen und Prozeduren, aber Code und Schema sind in allen Datenbanken identisch, nur die Daten sind unterschiedlich. Das Bereitstellen von Code- / Schemaänderungen ist jetzt nur noch eine Schleife anstelle einer einzelnen Ausführung.
  • Die Wartung ist etwas anders, wenn Sie 50.000 Datenbanken verwalten. Auch hier ist die Gesamtgröße ungefähr gleich, aber der Prozess muss sich ändern. Sie können nicht einfach alle 50.000 Datenbanken gleichzeitig defragmentieren / neu indizieren / sichern. Trotzdem habe ich bei meinem vorherigen Job Instanzen mit 500-1.000 identischen Datenbanken verwaltet, und der Unterschied zwischen der Verwaltung von 3 identischen Datenbanken und 750 identischen Datenbanken ist einfach die Zeit, die dafür benötigt wird.
Aaron Bertrand
quelle
2
+ 1. Jetzt lesen wir die Antwort :-).
Marian