2008-11-29 8 views
6

Ich möchte wirklich SimpleDB verwenden, aber ich mache mir Sorgen, dass ohne echte Sperren und Transaktionen das gesamte System tödlich fehlerhaft ist. Ich verstehe, dass es für High-Read/Low-Write-Anwendungen sinnvoll ist, schließlich wird das System konsistent, aber was ist mit dieser Zeit dazwischen? Scheint so, als würde die richtige Abfrage in einer inkonsistenten Datenbank Chaos in der gesamten Datenbank auf eine Art verewigen, die sehr schwer aufzuspüren ist. Hoffentlich bin ich nur ein Sorgenwarzen ...Wie weit können Sie wirklich mit "eventueller" Konsistenz und ohne Transaktionen (alias SimpleDB) gehen?

+1

Diese Frage und Antworten sind nicht mehr aktuell, da SimpleDB konsistente Lesevorgänge und bedingte Puts unterstützt. Siehe http://developer.amazonwebservices.com/connect/ann.jspa?annID=611 –

Antwort

4

Dies ist der ziemlich klassische Kampf zwischen Konsistenz und Skalierbarkeit und - bis zu einem gewissen Grad - Verfügbarkeit. Einige Daten müssen nicht immer konsistent sein. Schauen Sie sich zum Beispiel digg.com an und die Anzahl der Digg's gegen eine Geschichte. Es besteht eine gute Chance, dass der Wert im Datensatz "digg" dupliziert wird, anstatt die Datenbank dazu zu zwingen, einen Join mit der Tabelle "user_digg" durchzuführen. Spielt es eine Rolle, ob diese Zahl nicht genau stimmt? Wahrscheinlich nicht. Dann könnte etwas wie SimpleDB gut passen. Wenn Sie jedoch ein Banking-System schreiben, sollten Sie Konsistenz vor allem schätzen. :)

Wenn Sie nicht von Tag 1 wissen, dass Sie mit massiven Maßstab beschäftigen müssen, würde ich zu einfacheren konventionellen Systemen wie RDBMS bleiben. Wenn Sie irgendwo mit einem vernünftigen Geschäftsmodell arbeiten, werden Sie hoffentlich einen großen Umsatzanstieg sehen, wenn der Traffic stark ansteigt. Dann können Sie dieses Geld verwenden, um die Skalierungsprobleme zu lösen. Skalierung ist schwierig und Skalierung ist schwer vorherzusagen. Die meisten Skalierungsprobleme, die Sie verletzen, werden Sie niemals erwarten.

Ich würde viel lieber eine Website auf den Boden bringen und ein paar Wochen damit verbringen, Skalenprobleme zu beheben, wenn der Verkehr auffährt, dann so viel Zeit damit zu verbringen, sich Sorgen zu machen, dass wir es nie zur Produktion schaffen, weil uns das Geld ausgeht. :)

0

Angenommen, Sie sprechen über this SimpleDB, Sie sind kein Sorgenwart; Es gibt echte Gründe, es nicht als echtes Welt-DBMS zu benutzen.

Die Eigenschaften, die Sie von Transaktionsunterstützung in einem DBMS erhalten, können mit dem Akronym "A.C.I.D." abgekürzt werden: Atomarität, Konsistenz, Isolation und Haltbarkeit. Das A und D haben hauptsächlich mit Systemabstürzen zu tun, und das C und ich haben mit regulärem Betrieb zu tun. Es sind alles Dinge, die bei der Arbeit mit kommerziellen Datenbanken völlig selbstverständlich sind. Wenn Sie also mit einer Datenbank arbeiten, die nicht über eine oder mehrere dieser Datenbanken verfügt, können Sie viele unangenehme Überraschungen erleben.

Atomarität: Jede Transaktion wird entweder vollständig oder gar nicht abgeschlossen (d. H. Wird entweder sauber ausgeführt oder abgebrochen). Dies gilt für einzelne Anweisungen (wie "UPDATE-Tabelle ...") sowie für längere, kompliziertere Transaktionen. Wenn Sie das nicht haben, dann kann alles, was schief läuft (wie zB die Festplatte voll wird, der Computer abstürzt usw.), etwas Halbfertiges hinterlassen. Mit anderen Worten, Sie können sich niemals darauf verlassen, dass das DBMS wirklich die Dinge tut, die Sie ihm mitteilen, weil eine beliebige Anzahl von realen Problemen in die Quere kommen kann und sogar eine einfache UPDATE-Anweisung unvollständig ausgeführt wird.

Konsistenz: Alle Regeln, die Sie für die Datenbank eingerichtet haben, werden immer erzwungen. Wenn Sie zum Beispiel eine Regel haben, die besagt, dass A immer gleich B ist, dann kann nichts, was jemand mit dem Datenbanksystem tut, diese Regel brechen - es wird jede Operation versagen, die es versucht. Das ist nicht ganz so wichtig, wenn der ganze Code perfekt ist ... aber wirklich, wann ist das überhaupt der Fall? Plus, wenn Sie dieses Sicherheitsnetz vermissen, werden die Dinge wirklich eklig, wenn Sie verlieren ...

Isolation: Alle Aktionen auf der Datenbank ausgeführt werden, als ob sie seriell (eins nach dem anderen) passiert, sogar wenn sie in Wirklichkeit gleichzeitig stattfinden (verschachtelt).Wenn mehr als ein Benutzer gleichzeitig diese Datenbank antrifft und Sie dies nicht haben, dann werden Dinge, die Sie sich nicht einmal vorstellen können, schief gehen; Selbst atomare Aussagen können auf unvorhergesehene Weise miteinander interagieren und Dinge vermasseln.

Haltbarkeit: Wenn Sie die Stromversorgung verlieren oder die Software abstürzt, was passiert dann mit laufenden Datenbanktransaktionen? Wenn Sie Haltbarkeit haben, ist die Antwort "nichts - sie sind alle sicher". Datenbanken tun dies, indem sie etwas verwenden, das "Undo/Redo Logging" genannt wird, wo jede kleine Sache, die Sie mit der Datenbank machen, zuerst protokolliert wird (normalerweise auf einer separaten Festplatte zur Sicherheit), so dass Sie den aktuellen Zustand nach einem Fehler rekonstruieren können. Ohne das sind die anderen oben genannten Eigenschaften nutzlos, weil Sie nie hundertprozentig sicher sein können, dass die Dinge nach einem Absturz konsistent bleiben.

Ist Ihnen eines dieser Dinge wichtig? Die Antwort hat alles mit den Arten von Transaktionen zu tun, die Sie tun, und was garantiert Sie in einer Fehlersituation wollen. Es kann durchaus Fälle geben (wie eine schreibgeschützte Datenbank), wo Sie diese nicht benötigen, aber sobald Sie anfangen, etwas nicht-triviales zu tun, und etwas Schlimmes passiert, werden Sie wünschen, dass Sie sie hatten. Vielleicht ist es in Ordnung, wenn Sie zu einem Backup zurückkehren, sobald etwas Unerwartetes passiert, aber ich vermute, dass es nicht ist.

Beachten Sie auch, dass das Ablegen all dieser Schutzmaßnahmen nicht dazu führt, dass Ihre Datenbank besser funktioniert. In der Tat ist es wahrscheinlich das Gegenteil. Das ist, weil echte DBMS-Software auch Tonnen von Code Abfrage Leistung optimieren. Wenn Sie also eine Abfrage schreiben, die 6 Tabellen in SimpleDB verbindet, gehen Sie nicht davon aus, dass sie die optimale Möglichkeit zum Ausführen dieser Abfrage herausfinden wird - Sie könnten Stunden warten, bis ein kommerzielles DBMS verwendet werden kann indexierter Hash-Join und erhalten Sie in .5 Sekunden. Es gibt eine Unmenge kleiner Tricks, die Sie tun können, um die Abfrageleistung zu optimieren, und glauben Sie mir, Sie werden sie wirklich vermissen, wenn sie weg sind.

Nichts davon ist als ein Schlag auf SimpleDB gemeint; Nimm es von der author of the software: "Obwohl es ein großartiges Lehrmittel ist, kann ich mir nicht vorstellen, dass jemand es für irgendetwas anderes verwenden möchte."

+0

Es ist unwahrscheinlich, dass jcapote über dieses Thema spricht. –

+0

Aha, richtig du bist - ich nehme an, er spricht tatsächlich über Amazon SimpleDB. Ich denke, die meisten meiner Punkte gelten trotzdem. –

+0

Außer für den Lehrerteil. :) – Gyuri