Wir haben eine sehr große Datenbank auf Unternehmensebene. Als Teil unseres Geschäftsmodells greifen alle Webbenutzer jeden Monat zur gleichen Zeit auf unsere Webserver zu, was wiederum unsere SQL-Box hämmert. Der Verkehr ist sehr stark und wächst weiter, je größer das Unternehmen wird. Die SQL Proc-Optimierung wurde durchgeführt und die Hardware wurde bereits auf ein sehr hohes Niveau skaliert.
Wir möchten die Datenbank jetzt aufteilen, um sicherzustellen, dass wir das Unternehmenswachstum und zukünftige Belastungen bewältigen können.
Wir haben entschieden, welche bestimmten Daten gespeichert werden sollen. Es ist eine Teilmenge unserer Datenbank, die stark genutzt wird.
Meine Frage bezieht sich jedoch auf die nicht gesplitteten Daten, die allgemein / universell sind. Ein Beispiel für solche Daten kann beispielsweise eine Inventartabelle oder möglicherweise eine Mitarbeitertabelle, eine Benutzertabelle usw. Sein.
Ich sehe zwei Möglichkeiten, um mit diesen gemeinsamen / universellen Daten umzugehen:
1) Design 1 - Platzieren Sie die gemeinsamen / universellen Daten in einer externen Datenbank. Alle Schreibvorgänge werden hier ausgeführt. Diese Daten werden dann auf jeden Shard repliziert, sodass jeder Shard diese Daten lesen und in t-sql procs mit diesen Daten verknüpfen kann.
2) Design 2 - Geben Sie jedem Shard eine eigene Kopie aller allgemeinen Daten. Lassen Sie jeden Shard lokal in diese Tabellen schreiben und verwenden Sie die SQL Merge-Replikation, um diese Daten auf allen anderen Shards zu aktualisieren / zu synchronisieren.
Bedenken hinsichtlich Design # 1
1) Transaktionsprobleme: Wenn Sie eine Situation haben, in der Sie Daten in einen Shard schreiben oder aktualisieren und dann beispielsweise eine gemeinsame / universelle Tabelle in 1 gespeicherten Prozess schreiben / aktualisieren müssen, können Sie dies nicht mehr einfach tun. Die Daten sind jetzt in separaten SQL-Instanzen und -Datenbanken vorhanden. Möglicherweise müssen Sie MS DTS einbeziehen, um festzustellen, ob Sie diese Schreibvorgänge in eine Transaktion einbinden können, da sie sich in einer separaten Datenbank befinden. Die Leistung ist hier ein Problem, und mögliche Umschreibungen können für Prozesse erforderlich sein, die in Sharded- und Common-Daten schreiben.
2) ein Verlust der referenziellen Integrität. Datenbankübergreifende referenzielle Integrität ist nicht möglich.
3) Neukodieren großer Bereiche des Systems, damit es gemeinsame Daten in die neue universelle Datenbank schreiben, aber gemeinsame Daten aus den Shards lesen kann.
4). erhöhte Datenbankfahrten. Wenn Sie wie oben beschrieben auf eine Situation stoßen, in der Sie Sharded-Daten und allgemeine Daten aktualisieren müssen, werden Sie mehrere Roundtrips durchführen, um dies zu erreichen, da sich die Daten jetzt in separaten Datenbanken befinden. Einige Netzwerklatenzzeiten hier, aber ich mache mir weniger Sorgen um dieses Problem als die oben genannten 3.
Bedenken bezüglich Design # 2
In Design Nr. 2 erhält jeder Shard eine eigene Instanz aller gemeinsamen / universellen Daten. Dies bedeutet, dass der gesamte Code, der mit allgemeinen Daten verknüpft oder diese aktualisiert, weiterhin wie heute funktioniert / ausgeführt wird. Das Entwicklungsteam benötigt nur sehr wenig Umcodierung / Umschreibung. Dieses Design hängt jedoch vollständig von der Zusammenführungsreplikation ab, um die Daten über alle Shards hinweg synchron zu halten. Die dbas sind hochqualifiziert und sehr besorgt darüber, dass die Zusammenführungsreplikation möglicherweise nicht in der Lage ist, dies zu handhaben. Sollte die Zusammenführungsreplikation fehlschlagen, ist die Wiederherstellung nach diesem Fehler nicht großartig und könnte sich sehr negativ auf uns auswirken.
Ich bin gespannt, ob sich jemand für Designoption 2 entschieden hat. Ich bin auch neugierig zu wissen, ob ich eine 3. oder 4. Designoption übersehen habe, die ich nicht sehe.
danke im Voraus.