Ich habe keine Erfahrung in der Architektur von Datenbanken und habe mir jeden Tag neue Sachen beigebracht. Ich möchte eine Internetanwendung mit SQL Server als Datenspeicher erstellen. Ich habe online keine guten Informationen zum Skalieren von SQL Server gefunden.
Ich verstehe, dass das Skalieren für den Schreibdurchsatz großartig ist, aber nicht unbedingt das Lesen skaliert. Ein einfaches Beispiel (das in meinem Fall relevant ist) ist, dass, wenn Daten durch die Veröffentlichung der Benutzer-ID gesplittert werden, Status 1, der von Benutzer X gepostet wird, der in Shard A lebt, alle seine Vorlieben und Kommentare im gesamten Verband hat. Wenn ich also die Kommentare zu diesem Status abrufen muss, muss ich jede Datenbank treffen und die Ergebnisse im Anwendungsspeicher zusammenführen und sortieren / filtern. Dies ist schlecht für die Datenbanken, da sie beschäftigt sind, und schlecht für die Webserver, da ich CPU und RAM für die Nachbearbeitung der Objekte verwenden werde. Idealerweise möchte ich für maximale Skalierbarkeit in eine Datenbank schreiben und aus einer Datenbank lesen.
Was ich jetzt vorhabe, ist, anstatt durch Posten der Benutzer-ID zu sharden, durch Empfangen der Benutzer-ID zu shardieren. Wenn Benutzer X den Status 1 veröffentlicht, kann Benutzer Y, der in Shard B lebt, einen Kommentar in Shard A einfügen, und ich kann eine Eltern-Kind-Beziehung zwischen dem Status und dem Kommentar erzwingen. Benutzer Z, der in Shard C lebt, kann ein Like in Shard A für den Kommentar einfügen, sodass der Kommentar und dergleichen eine Eltern-Kind-Beziehung darstellen können. Der Vorteil dieses Ansatzes besteht darin, dass ich nur eine Datenbank abfrage, um alle Kommentare und Likes für einen bestimmten Status abzurufen, anstatt jeden einzelnen Shard naiv abzufragen.
Ich muss jedoch Ergebnisse wie "Kommentare zu Status 1 von Personen, die männlich oder über 18 Jahre alt sind" erhalten. Dies ist eine wichtige Funktionalität, die ich implementieren möchte. Ich muss noch auf andere Datenbanken zugreifen, um Informationen über die Benutzer zu erhalten. Um dies zu vermeiden, denke ich darüber nach, eine Synchronisierungsgruppe zu erstellen, in der eine Datenbank (Hub) alle Benutzerdeltas mit allen Shards synchronisiert (alle 5 Minuten). Ich bin mit der eventuellen Konsistenz einverstanden, obwohl sie ihre eigenen Probleme hat. Wenn beispielsweise ein Benutzer sein Konto löscht, sehen andere Benutzer die Änderung möglicherweise nicht, wenn das Konto gelöscht wird, bis das Delta für einen Shard beibehalten wird untergeordnete Objekte zu Objekten, die von diesem Benutzer erstellt wurden. Dies scheint mir ein Problem der Datenintegrität zu sein.
Ich bin mir auch der Replikation und des Caching bewusst, um den Lesedurchsatz zu erhöhen.
Meine Frage ist, welchen Ansatz soll ich verfolgen? Wenn ich den zweiten auswähle, habe ich dann Probleme beim Synchronisieren von Daten auf möglicherweise Hunderten oder Tausenden von Servern? Ganz zu schweigen davon, dass der Hub im Wesentlichen eine einzige Fehlerquelle ist.