2013-12-12 6 views
5

DynamoDB verwendet zwei unabhängige Clients, die gleichzeitig mithilfe von bedingten Schreibvorgängen zum selben Objekt schreiben und versuchen, den von der Bedingung referenzierten Wert zu ändern. Offensichtlich ist einer dieser Schreibvorgänge zum Scheitern verurteilt mit der Bedingungsprüfung; das ist ok.DynamoDB: Bedingte Schreibvorgänge im Vergleich zum CAP-Theorem

Angenommen, während des Schreibvorgangs passiert etwas Schlechtes und einige der verschiedenen DynamoDB-Knoten schlagen fehl oder verlieren ihre Verbindung zueinander. Was passiert mit meinen Schreibvorgängen?

Werden beide blockieren oder versagen (Opfer von "A" im CAP-Theorem)? Werden beide erfolgreich sein und erst später stellt sich heraus, dass einer von ihnen tatsächlich ignoriert wurde (Opfer von "C")? Oder werden sie irgendwie beide korrekt funktionieren, weil im DynamoDB-System etwas passiert ist (konsistentes Hashing?)?

Es scheint nur ein wirklich hartes Problem, aber ich kann nichts finden, das die Möglichkeit von Verfügbarkeitsproblemen mit bedingten Schreibvorgängen diskutiert (im Gegensatz zu beispielsweise konsistenten Lesevorgängen, wo die Möglichkeit der Verfügbarkeitsreduzierung explizit ist).

Antwort

8

Es gibt einen Mangel an klaren Informationen in diesem Bereich, aber wir können einige ziemlich starke Schlüsse ziehen. Viele Leute nehmen an, dass DynamoDB alle Ideen von seinem Vorgänger "Dynamo" implementiert, aber das scheint nicht der Fall zu sein, und es ist wichtig, die beiden getrennt in Ihrem Kopf zu halten. Das ursprüngliche Dynamo-System wurde von Amazon in der Dynamo Paper sorgfältig beschrieben. Wenn Sie darüber nachdenken, ist es auch hilfreich, wenn Sie mit den verteilten Datenbanken vertraut sind, die auf den Dynamo-Ideen basieren, wie Riak und Cassandra. Insbesondere Apache Cassandra, die eine ganze Reihe von Kompromissen in Bezug auf CAP bietet.

Durch den Vergleich von DynamoDB, der klar zu den verfügbaren Optionen in Cassandra verteilt ist, denke ich, können wir sehen, wo es im CAP-Raum platziert ist. Laut Amazon "DynamoDB verwaltet mehrere Kopien jedes Elements, um die Dauerhaftigkeit zu gewährleisten. Wenn Sie eine 'Operation erfolgreich' Antwort auf Ihre Schreibanforderung erhalten, stellt DynamoDB sicher, dass der Schreibvorgang auf mehreren Servern dauerhaft ist. Es dauert jedoch einige Zeit, bis sich das Update verbreitet zu allen Kopien. " (Data Read and Consistency Considerations). Außerdem muss DynamoDB die Anwendung nicht wie bei Dynamo zur Konfliktlösung verwenden. Vorausgesetzt, sie möchten so viel Verfügbarkeit wie möglich bereitstellen, da sie sagen, dass sie auf mehrere Server schreiben, entsprechen die Schreibvorgänge in DyanmoDB Cassandra QUORUM. Außerdem scheint es, dass DynamoDB hinted handoff nicht unterstützt, da dies zu Situationen führen kann, die eine Konfliktlösung erfordern. Um eine maximale Verfügbarkeit zu erreichen, müsste ein inkonsistentes Lesen nur dem Äquivalent von Cassandras ONE entsprechen. Um jedoch einen konsistenten Lesevorgang zu erhalten, würden die Quorum-Schreibvorgänge einen Pegelstand von QUORUM erfordern (der Konsistenz von R + W> N folgend). Weitere Informationen zu Ebenen in Cassandra finden Sie unter About Data Consistency in Cassandra.

Zusammenfassend stelle ich fest, dass:

  • Writes sind „Quorum“, so die Mehrheit der Knoten der Reihe zur Verfügung repliziert muss für die Schreib um erfolgreich zu sein
  • Uneinheitliche Liest sind „One "Daher muss nur ein einzelner Knoten mit der Zeile verfügbar sein, aber die zurückgegebenen Daten sind möglicherweise veraltet.
  • Konsistente Lesevorgänge sind" Quorum ". Daher muss die Mehrzahl der Knoten, auf die die Zeile repliziert wird, für das Lesen verfügbar sein um erfolgreich zu sein

So haben Schreibvorgänge die gleiche Verfügbarkeit wie ein konsistenter Lesevorgang.

Um speziell Ihre Frage zu zwei simultanen bedingten Schreibvorgängen zu beantworten, schlägt eine oder beide fehl, je nachdem wie viele Knoten ausgefallen sind. Es wird jedoch niemals eine Inkonsistenz geben. Die Verfügbarkeit der Schreibvorgänge hat wirklich nichts damit zu tun, ob sie bedingt sind oder nicht, denke ich.

Verwandte Themen