Ich suche in NoSQL nach Skalierungsalternativen für eine Datenbank. Was mache ich, wenn ich transaktionsbasierte Dinge möchte, die für diese Art von Dingen empfindlich sind?
Ich suche in NoSQL nach Skalierungsalternativen für eine Datenbank. Was mache ich, wenn ich transaktionsbasierte Dinge möchte, die für diese Art von Dingen empfindlich sind?
Antworten:
Im Allgemeinen haben NoSQL-Lösungen eine geringere Transaktionssemantik als relationale Datenbanken, verfügen jedoch auf einer bestimmten Ebene über Funktionen für atomare Operationen.
Im Allgemeinen bieten diejenigen, die eine Master-Master-Replikation durchführen, weniger Konsistenz und mehr Verfügbarkeit. Man sollte also das richtige Werkzeug für das richtige Problem wählen.
Viele bieten Transaktionen auf der Ebene einzelner Dokumente (oder Zeilen usw.) an. Zum Beispiel gibt es bei MongoDB Atomizität im einzelnen Dokument - aber Dokumente können ziemlich umfangreich sein, so dass dies normalerweise ziemlich gut funktioniert - mehr Infos hier .
Dies ist die nächste Antwort, die ich gefunden habe und die für jede NoSQL-Datenbank gelten würde. Es ist in einem Blog-Beitrag von 2007 von Adam Wiggins von Heroku.com:
Das alte Beispiel für die Verwendung einer Datenbanktransaktion, um die Überweisung von Geld von einem Bankkonto auf ein anderes zu verpacken, ist Total Bull. Die richtige Lösung besteht darin, eine Liste der Ledger-Ereignisse (Übertragungen zwischen Konten) zu speichern und den aktuellen Saldo als Summe des Ledgers anzuzeigen. Wenn Sie in einer funktionalen Sprache programmieren (oder so denken), ist dies offensichtlich.
Von: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (Seine Website eignet sich hervorragend für Ideen zur Skalierbarkeit.)
Ich habe den obigen Absatz wie folgt interpretiert:
Mehr Info. zu Warteschlangen / Hintergrundarbeitern: http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/
Der Kunde (auch bekannt als Mitglied oder Kunde) führt die folgenden Schritte aus, um Geld herauszunehmen:
Sie können Heroku.com verwenden, um schnell ein kleines Modell zu erstellen, wenn Sie mit Node.js oder Ruby / Rack vertraut sind.
Die allgemeine Idee scheint ziemlich einfach und viel besser zu sein als die Verwendung von in die Datenbank eingebrannten Transaktionen, die die Skalierung sehr schwierig machen.
Haftungsausschluss: Ich habe dies noch nicht implementiert. Ich habe aus Neugier über diese Dinge gelesen, obwohl ich sie praktisch nicht brauche. Ja, @gbn hat Recht, dass ein RDBMS mit Transaktionen wahrscheinlich für die Bedürfnisse von Timmy und mir ausreichen würde. Trotzdem würde es Spaß machen zu sehen, wie weit Sie NoSQL-Datenbanken mit Open-Source-Tools und einer How-to-Website namens " A Tornado of Razorblades " bringen können.
NoSQL deckt eine Vielzahl von Tools und Diensten ab, darunter Schlüsselwert-, Dokument-, Grafik- und Breitspaltenspeicher. Sie versuchen normalerweise, die Skalierbarkeit des Datenspeichers zu verbessern, indem sie normalerweise die Datenverarbeitung verteilen. Transaktionen erfordern ACID- Eigenschaften für die Ausführung von Benutzeroperationen durch DBs. ACID schränkt ein, wie die Skalierbarkeit verbessert werden kann: Die meisten NoSQL-Tools lockern die Konsistenzkriterien der Operationen, um Fehlertoleranz und Verfügbarkeit für die Skalierung zu erhalten, was die Implementierung von ACID-Transaktionen sehr schwierig macht.
Eine häufig zitierte theoretische Argumentation für verteilte Datenspeicher ist das CAP-Theorem : Konsistenz, Verfügbarkeit und Partitionstoleranz können nicht gleichzeitig erreicht werden. SQL-, NoSQL- und NewSQL-Tools können nach dem, was sie aufgeben, klassifiziert werden. Eine gute Figur könnte hier gefunden werden .
Eine neue, schwächere Reihe von Anforderungen, die ACID ersetzen, ist BASE ("grundsätzlich verfügbar, weicher Zustand, eventuelle Konsistenz"). Eventuell konsistente Tools ("eventuell geben alle Zugriffe auf einen Artikel den zuletzt aktualisierten Wert zurück") sind in Transaktionsanwendungen wie dem Bankgeschäft jedoch kaum akzeptabel. Hier wäre eine gute Idee, speicherinterne, spaltenorientierte und verteilte SQL / ACID-Datenbanken zu verwenden, zum Beispiel VoltDB ; Ich schlage vor, sich diese "NewSQL" -Lösungen anzusehen.
Ich wollte nur zu Geldtransaktionsratschlägen zu diesem Thread Stellung nehmen. Transaktionen sind etwas, das Sie wirklich für Geldtransfers verwenden möchten.
Das Beispiel, wie die Überweisungen durchgeführt werden, ist sehr schön und ordentlich.
Im wirklichen Leben kann die Überweisung von Geld jedoch Gebühren oder Zahlungen auf andere Konten beinhalten. Personen erhalten Boni für die Verwendung bestimmter Karten, die von einem anderen Konto stammen, oder sie erhalten Gebühren von ihrem Konto auf ein anderes Konto im selben System. Die Gebühren oder Zahlungen können je nach Finanztransaktion variieren, und Sie müssen möglicherweise ein Buchhaltungssystem einrichten, das die Gutschrift und Belastung jeder Transaktion sofort anzeigt.
Dies bedeutet, dass Sie mehr als eine Zeile gleichzeitig aktualisieren möchten, da das Guthaben auf einem Konto auf einem oder mehreren Konten abgebucht werden kann. Zuerst sperren Sie die Zeilen, damit sich vor dem Update nichts ändern kann, und stellen dann sicher, dass die geschriebenen Daten mit der Transaktion übereinstimmen.
Deshalb möchten Sie wirklich Transaktionen verwenden. Wenn beim Schreiben in eine Zeile etwas schief geht, können Sie eine ganze Reihe von Aktualisierungen rückgängig machen, ohne dass die Finanztransaktionsdaten inkonsistent enden.
Das Problem bei einer Transaktion und zwei Vorgängen (z. B. einer zahlt 5.000 USD, der zweite erhält 5.000 USD) besteht darin, dass Sie zwei Konten mit derselben Priorität haben. Sie können nicht ein Konto verwenden, um das zweite zu bestätigen (oder in umgekehrter Reihenfolge). In diesem Fall können Sie garantieren, dass nur ein Konto korrekt ist (das bestätigt wird), das zweite (das bestätigt) möglicherweise fehlgeschlagen ist. Schauen wir uns an, warum es fehlschlagen kann (mit der Nachricht aproatch wird der Absender vom Empfänger bestätigt):
Es wird garantiert, bis auf # 1. Aber wer garantiert, wenn # 2 fehlschlägt? Gleiches gilt in umgekehrter Reihenfolge.
Dies ist jedoch möglich, um ohne Transaktionen und mit NoSQL sicher zu sein. Sie dürfen immer eine dritte Entität verwenden, die von Sender- und Empfängerseite bestätigt wird, und garantieren, dass Ihre Operation ausgeführt wurde:
Dieser Transaktionsdatensatz garantiert, dass das Senden / Empfangen von Massagen in Ordnung war. Jetzt können Sie jede Nachricht anhand der Transaktions-ID überprüfen. Wenn der Status empfangen oder abgeschlossen wurde, berücksichtigen Sie dies für das Benutzerguthaben.
Hängt von Ihrer Datenbank ab , aber ... Ich würde allgemein sagen, dass Sie 'Optimistische Transaktionen' verwenden können , um dies zu erreichen, aber ich denke, man sollte sicherstellen, dass man die Atomizität der Datenbankimplementierung versteht (z. B. welche Art von Schreib- und Leseoperationen atomar sind ).
Es scheint im Internet einige Diskussionen über HBase- Transaktionen zu geben, wenn dies hilfreich ist.
Sie können in einer SQL-Datenbank immer einen NoSQL-Ansatz verwenden. NoSQL scheint im Allgemeinen "Schlüssel- / Wertdatenspeicher" zu verwenden: Sie können dies jederzeit in Ihrem bevorzugten RDBMS implementieren und somit die guten Dinge wie Transaktionen, ACID-Eigenschaften, Unterstützung durch Ihren benutzerfreundlichen DBA usw. beibehalten, während Sie die Vorteile von NoSQL-Leistung und Flexibilität realisieren zB über eine Tabelle wie
CREATE TABLE MY_KEY_VALUE_DATA
(
id_content INTEGER PRIMARY KEY,
b_content BLOB
);
Der Bonus ist, dass Sie hier zusätzliche Felder hinzufügen können, um Ihren Inhalt in andere, ordnungsgemäß relationale Tabellen zu verlinken, während Ihr umfangreicher Inhalt weiterhin im Hauptfeld BLOB (oder TEXT, falls zutreffend) verbleibt.
Persönlich bevorzuge ich eine TEXT-Darstellung, damit Sie nicht an eine Sprache für die Arbeit mit den Daten gebunden sind. Wenn Sie beispielsweise serialisiertes Java verwenden, können Sie beispielsweise von Perl aus auf den Inhalt zugreifen, um Berichte zu erstellen. TEXT ist auch einfacher zu debuggen und arbeitet im Allgemeinen als Entwickler.
Werfen Sie einen Blick auf Scalaris, eine No-SQL-Datenbank mit starker Konsistenz und implementierten Transaktionen.
Aus diesem Grund erstelle ich eine NoSQL Document Store-Lösung, um "echte" Transaktionen in Unternehmensanwendungen mit der Kraft eines unstrukturierten Datenansatzes verwenden zu können. Werfen Sie einen Blick auf http://djondb.com und fügen Sie jede Funktion hinzu, die Sie für nützlich halten.
sicherlich gibt es noch andere
Sie können optimistische Transaktionen zusätzlich zur NoSQL-Lösung implementieren, wenn sie Compare-and-Set unterstützt. Ich habe ein Beispiel und eine Erklärung auf einer GitHub- Seite geschrieben, wie es in MongoDB gemacht wird, aber Sie können es in jeder geeigneten NoSQL-Lösung wiederholen.