MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

Hintergrundwissen Transaktionen: Retryable Writes

Marc-David Militz
Experte
  • Artikel von Dj Walker-Morgan

    • englischer Originalartikel
      https://www.mongodb.com/blog/post/transactions-background-part-6-retryable-writes
      Übersetzung mit freundlicher Genehmigung von MongoDB

      • Zusammenfassung

        • Indem man es dem Treiber ermöglicht eine exakt gleiche Schreiboperation widerholt zu senden, ohne dabei der Gefahr ausgesetzt zu sein dass diese auf dem Server mehrfach ausgeführt wird, ermöglichen wir es den Clients verlässlicher zu arbeiten, während wir die Menge des Codes reduzieren, den wir für die Fehlerbehandlung benötigen.

          • Hintergrund

            • Wenn ein Treiber eine Schreiboperation an den Server sendet und eine Fehlermeldung erzeugt wird, dann ist es nicht immer möglich festzustellen, ob der Fehler beim Schreiben auf dem Server oder beim Senden der Bestätigung an den Client aufgetreten ist. Das bedeutet, es ist für den Client auch nicht möglich festzustellen ob die Schreiboperation ausgeführt wurde oder nicht.

              Stellen wir uns, als Beispiel, eine Schreiboperation vor, die ein Feld inkrementiert. Der Treiber des Clients sendet diesen Request an den Server, dieser führt die Anweisung aus, aber bevor er die Antwort zurück senden kann kommt es zu einem Verbindungsabbruch. Der Wert des Feldes wurde auf dem Server erhöht, aber der Client hat davon keine Kenntnis. Wenn er nun die Anforderungen nochmal schickt, weil er annimmt, dass die Verbindung abgebrochen ist bevor die Anweisung ausgeführt werden konnte, so würde der Feldwert noch einmal erhöht werden. Der Client könnte auch versuchen festzustellen, ob die Anweisung ausgeführt wurde. Aber auch dabei gibt es zu viele Unwägbarkeiten.

              • Retryable Writes, auf dem Client

                • Kommen wir zu den Retryable Writes. Eine solche Schreiboperation kann mehrfach an den Server gesendet werden, wird aber nur genau einmal ausgeführt. Implantiert ist das auf Ebene des Treibers, über die Verbindungsoption "retryWrites" und mindestens den writeConcern "acknowledged".Nur ein bestimmtes Set an Operationen kann die Retryable Writes nutzen. Eine Übersicht dazu gibt es hier https://docs.mongodb.com/manual/core/retryable-writes/#retryable-write-operations
                  Seit MongoDB 4.0 sind auch die "commit" und "abort" Operationen einer Transaktion wiederholbar, diese tun das aber automatisch und unabhängig von den Verbindungsoptionen des Treibers. In allen Fällen gibt es nur einen Versuch der Wiederholung des Sendens einer Schreiboperation. Der Treiber wird nicht endlos immer wieder die gleiche Operation senden, weshalb damit lediglich Aussetzer der Netzwerkverbindung, oder die Wahl eines neuen Primaries, überbrückt werden kann, nicht aber andauernde Verbindungsprobleme. Eine Schreiboperation wird mit einer logischen "session id" und einer "transaction id" gesendet.

                  • Retryable Writes, auf dem Primary

                    • Wenn die Schreiboperation, auf dem Primary, eintrifft, dann wird diese gegen die Transaktionstabelle verglichen. Diese enthält eine Liste logischer "session ids" und Zeiger auf das Oplog, wo die dazugehörende Operation aufgezeichnet wurde. Wenn es nun eine Übereinstimmung zwischen der logischen "session id" und der "transaction id" gibt, dann besagt die Logik der "Retryable Writes" dass es sich um einen wiederholten Versuch handelt. Es wird eine Antwort erzeugt, die das Ergebnis des vorherigen Schreibversuchs, als Bestätigung, an den Client zurücksendet.

                      Gibt es in der Transaktionstabelle keine Übereinstimmung, dann wir die Schreiboperation als "neu" eingestuft. Sie wird ausgeführt und ein Eintrag im Oplog erzeugt, die Transaktionstabelle wird geupdated und die Bestätigung wird an den Client zurückgesendet.

                      • Retryable Writes, auf einem Secondary

                        • Secondary Nodes kümmern sich nicht um die Schreiboperationen bis es zu einem Failover kommt und ein Secondary, zum Primary, wird. Wenn dieser Fall eintritt, dann hätte der ehemalige Secondary eine leere Transaktionstabelle und kann nicht sagen ob es sich bei einer Schreiboperation um eine Wiederholung handelt. Die Lösung dafür ist eine Replikation der Transaktionstabelle. Im Gegensatz zu anderen Replikationsvorgängen wird dies in jeden Schreibvorgang integriert, der im Oplog aufgezeichnet wird. Jeder bekommt eine logische "session id" und eine "transaction id", damit ist der Secondary in der Lage eine eigene Transaktionstabelle zu erstellen, die bis zum jeweiligen Oplog Eintrag korrekt ist.

                          Wenn dann der Failover-Fall eintritt und der Secondary übernehmen muss, dann verfügt dieser nicht nur über ein Replikat der Daten, sondern auch über eine vollständige Transaktionstabelle.

                          • Retryable Writes und Transaktionen

                            • Retryable Writes sind ein Baustein desselben Wiederhol-Mechanismusses, den auch Transaktionen verwenden. Wie bereits erwähnt sind die "commit" und "abort" Operationen wiederholbar, allerdings wird die komplette Transaktion als eine Operation wiederholt. Das ist anders als der Retryable Write einer einzelnen Schreiboperation. Auf diese Weise ist MongoDB in der Lage, vorübergehende Netzwerkfehler oder die Election, eines Primaries, zu überbrücken.

                              Wenn sie sich zu den Qualiero Angeboten zum Thema MongoDB informieren wollen, so haben sie hier dazu die Möglichkeit
                              https://www.qualiero.com/glossar/mongodb.html

Neueste Mitgliederaktivitäten

Tags

Diesen Community Beitrag weiterempfehlen