Mit unserer serverbasierten mssql-Lösung sind wir derzeit am Rande der Ressourcen.
Wir haben jetzt viele traditionelle Optionen für den nächsten Schritt, um die Last anzugehen:
- Kaufen Sie schnellere CPUs und E / A.
- Teilen Sie einige Kunden auf, um den Server zu trennen
- Verschieben Sie die Datenbank in den Cluster
Alle sind entweder in Bezug auf Lizenzierung und Hardware oder Zeit teuer. Daher möchte ich eine weitere Option hinzufügen, indem ich das gesamte System auf eine skalierbare Lösung umstelle, die die nosql-Engine Cassandra verspricht.
Ich bin mir jedoch nicht sicher und habe keine Erfahrung mit noSQL-Datenbanken. Daher muss ich die Struktur "unstrukturierter" Daten verstehen.
In unserer Anwendung speichern wir Daten, die von Benutzern auf verschiedene Weise eingegeben wurden, grundsätzlich als "Schlüsselwert" -Listen. Es gibt eine übergeordnete Tabelle, die das head-Element enthält (wie eine Bestellung), und es gibt eine untergeordnete Tabelle mit den Schlüssel-Wert-Paaren, die den Inhalt der Bestellung enthalten (wie Order_Lines).
In geschäftlicher Hinsicht sind Order und OrderLines eine Einheit. Aufgrund des RDBMS werden sie jedoch in Tabellen gespeichert und müssen ständig verbunden werden.
Während des Betriebs laden wir manchmal nur den oberen Teil, aber meistens laden wir die Kopfzeile + einige KVPs, um einige nützliche Informationen anzuzeigen.
In einer Übersichtsliste zeigen wir beispielsweise die Kopfkennung + einige Werte in Spalten für jede Zeile.
UPDATE: Wir speichern Formulare jeglicher Art. Im Grunde speichern wir also "Dokumente". Trotzdem müssen wir diese Formulare nach beliebigen Werten, Sortierungen usw. vorbereiten und durchsuchen. Die Datenzugriffskontrolle fügt der Datenbank eine weitere Ebene der Komplexität hinzu.
Wie Sie sich vorstellen können, variieren Menge und Verfügbarkeit bestimmter KVPs von Objekt zu Objekt. Es gibt keine gültige Möglichkeit, einzelne Tabellen für jede Art von Objekt zu erstellen, da wir Tausende von Tabellen für die verschiedenen Datenkombinationen erstellen müssten.
Wäre diese Art von "Dictionary" -ähnlichen Datensätzen besser in einer noSQL-Datenbank gespeichert? Und werden wir davon Leistungsvorteile haben? Würde Cassandra diese Head + KVPs als einen Datensatz modellieren? Wenn ich mir die Cassandra-Webseite und einige Tutorials anschaue, habe ich den Eindruck, dass es in Bezug auf die Datenorganisation keinen so großen Unterschied zwischen unserem RDBMS und Cassandra gibt. Wenn Sie also 5 KVPs auswählen möchten, haben wir die gleiche Anzahl an Joins für eine Liste für jede Zeile.
Aufklärung ist willkommen, auch Hinweise auf Papiere, die die Probleme erklären, sind in Ordnung.
Trotz des Mainstreams der noSQL-Datenbanken sollte meiner Meinung nach die Entscheidung über die Einführung einer solchen Technologie nach den Erfolgen getroffen werden, die gemäß den gespeicherten Informationen erforderlich sind, und nicht nur nach der Leistung, die Sie derzeit haben. Dies bedeutet, dass Sie möglicherweise am besten an der SQL-Datenbank festhalten und Ihre Hardware verbessern können.
Aber zusätzlich habe ich etwas in Ihrer Frage gelesen, das mich zum Nachdenken gebracht hat. Es gibt nicht viel über den aktuellen Status Ihrer Datenbank, aber Ihr Satz "Wir speichern Daten, die von Benutzern auf verschiedene Weise eingegeben wurden, als" Schlüsselwert "-Listen" lässt mich darüber nachdenken, ob das Problem nicht eher ein schlechtes Datenmodell als wäre der Mangel an physischen Ressourcen. Ich habe wirklich große Tabellen (+10 Milliarden Zeilen) mit unglaublicher Leistung in "traditionellen" SQL-Datenbanken verwaltet.
Ich sage nicht, dass es falsch ist, nur weil ich Sie natürlich nicht im richtigen Datenmodell mit so wenig Informationen über Ihre aktuelle Lösung bewerten kann, sondern nur daran denken, Ihr Datenmodell als zusätzliche Option zusammen mit dem Rest seit Ihnen erneut zu besuchen kann dort einen Hinweis finden, der kratzt.
Normalerweise sind Schlüsselwertlisten als Kompromiss in Ordnung, wenn Sie das Modell nicht im Endzustand implementieren können, weil Sie die verschiedenen Schlüssel, denen Sie gegenüberstehen müssen, nicht kennen oder wenn Sie die Werte eines der möglichen benötigen Schlüssel für ein bestimmtes Element. Aber wenn ich implementiert bin, denke ich normalerweise gerne nach einer Weile über solche Entscheidungen nach, wenn Sie genügend Informationen gesammelt haben, um den allgemeinen Anwendungsfall zu identifizieren und zu entscheiden, ob die Entscheidung für ein Datenmodell die beste ist. Wenn Sie wissen, dass Sie eine bestimmte Anzahl von Schlüsseln haben, versuchen Sie, einen Benchmark mit dem Design eines normalen Tisches auf herkömmliche Weise durchzuführen
... und Hinzufügen der entsprechenden Indizes. Probieren Sie es aus und messen Sie Ausführungspläne mit beiden Ansätzen. Sie können besonders überrascht sein, wenn Sie mehr als einen Schlüssel gleichzeitig erfassen, da unter anderem die Datenblockgröße reduziert werden sollte und somit die Leistung verbessert würde.
Ich hoffe, dies hilft oder erweitert zumindest die Möglichkeiten und eröffnet eine neue Untersuchungslinie.
quelle