Skalieren von SQL Server und Synchronisieren von Daten auf mehreren Computern


7

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.


Müssen Sie Ihre Datenbank wirklich sharden? Wie groß erwarten Sie Ihre Datenbank? Das Skalieren unserer Lesevorgänge ist relativ einfach (z. B. mithilfe von Verfügbarkeitsgruppen), das Schreiben ist viel schwieriger. Geben Sie an, wie viel Sie auf einer Azure- und AWS-Infrastruktur skalieren können. Warum nicht skalieren statt verkleinern?
Greg

Antworten:


3

Das Erstellen einer Scale-Out-Datenbank im Internet ist ein ziemlich großer Schritt. Sie werden mit vielen Problemen konfrontiert sein, die für eine einzelne große Datenbank nicht kritisch sind. Aus Ihren Notizen geht hervor, dass Sie einige der grundlegenden Probleme verstehen, mit denen Sie konfrontiert sind.

Da Microsoft über Dokumente zur Verwendung von SQL Server zum Skalieren verfügt, empfehle ich, diese zuerst zu studieren. Ihre Scale-Out-Strategie muss den von Ihnen ausgewählten Datenbankserver berücksichtigen.

Für Microsoft SQL Server sollten Sie zuerst Folgendes studieren: http://msdn.microsoft.com/en-us/library/aa479364.aspx

In diesem Dokument werden die Entscheidungen erläutert, die Sie treffen müssen, und warum sie wichtig sind. Es bietet 5 SQL Server-Strategien für das Scaleout:

• Skalierbare gemeinsam genutzte Datenbanken

• Peer-to-Peer-Replikation

• Verbindungsserver

• Verteilte partitionierte Ansichten

• Datenabhängiges Routing

Wenn Sie den Stapel hinuntergehen, werden die Dinge komplizierter, bieten aber auch leistungsfähigere Möglichkeiten zum Skalieren.


0

Da in der Vergangenheit Anwendungen fehlgeschlagen sind, würde ich zwei Dinge vorschlagen. Zum einen würde ich mir keine Gedanken über die Skalierung machen, bis Sie näher an einer Live-Anwendung sind und die Geschäftsregeln herausgefunden sind. Es scheint, als würden Sie ein Problem lösen, das Sie möglicherweise nicht wirklich haben. Was in den zweiten Punkt geht, nämlich, dass Ihre Daten nicht so ausgereift aussehen, dass sie eine Entscheidung über Sharding treffen können. Beim Sharding benötigen Sie im Allgemeinen ein umfassendes Verständnis Ihrer Daten, um zu entscheiden, wie Sharding ausgeführt werden soll.

In einem Projekt haben wir versucht, Best Practices für die horizontale Skalierung unserer Datenbank anzuwenden. Wir haben uns für das Sharding durch den Mieter entschieden. Später stellten wir aufgrund sich entwickelnder geschäftlicher Änderungen fest, dass die Sharding-Mieter nicht die besten waren, da die Mieter anfingen, Daten auszutauschen, und Shards gemischt wurden und gleichzeitig auf Hotspots zugegriffen wurde. Es ist eines von Microsoft, auf das Sie hier achten sollten: https://msdn.microsoft.com/en-us/library/dn589797.aspx

Ich schlage vor, Sie erstellen Ihre Anwendung und finden heraus, wie Ihre Anwendung tatsächlich funktionieren würde, bevor Sie mit dem Sharding beginnen. Eine einzelne Datenbank kann ziemlich weit gehen, bevor eine horizontale Skalierung erforderlich ist, wenn sie richtig erstellt wird.

Andere Optionen können Lese- / Schreib-Slaves sein. Lesen von einem Schreibvorgang zum anderen, Hochverfügbarkeitsgruppen und Lastausgleich.

Viel Glück,


-2

Ich habe gestern PartitionDB * ausprobiert . Nach meinem Verständnis benötigt DPV (Distributed Partitioned Views) die Arbeit für Sie. Vielleicht funktioniert eines ihrer Gewerkschaftsbeispiele für Sie.

Beachten Sie, dass Sie dieses Shard- / Partitionsfeld in allen Ihren Shard- / partitionierten Tabellen sammeln müssen.

* Ich bin ein Beta-Benutzer, aber ansonsten nicht mit diesem Produkt verbunden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.