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: Logische Sessions in MongoDB

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

    • englischer Originalartikel
      https://www.mongodb.com/blog/post/transactions-background-part-2-logical-sessions-in-mongodb
      Übersetzung mit freundlicher Genehmigung von MongoDB


      Im ersten Teil dieser Serie haben wir einen Blick auf die Handhabung von Timestamps innerhalb des Servers und darauf, wie damit Multi-Document-Transactions realisiert werden. Dieses mal beschäftigen wir uns mit logischen Sessions und damit, wie diese genutzt werden können um Aktionen des Clients zusammenzufassen und durch einen MongoDB Cluster zu schicken.

      • Zusammenfassung

        • Mit dem Erstellen einer logischen Session ist es nun möglich Ressourcen, die in einer Transaktion mit einer einzelnen Aktion oder in einer Transaktion mit mehreren Aktionen vom System verarbeitet werden, zu tracken. Dies ermöglicht ein einfaches und präzises Abbrechen von Operationen und eine verteilte Garbage Collection.

          • Hintergrund

            • Aus historischer Sicht gab es viele Operationen in MongoDB, die davon profitiert hätten, wenn es möglich gewesen wäre sie zu verfolgen während sie vom Client, über den Abfrage Router und die Shards und Replica Sets die den Cluster bilden, verteilt werden. Da es aber solch einen Identifikator, zu tracken von Operationen, nicht gab, basierte das System auf einer Reihe von Heuristiken.

              • Logische Sessions

                • Die Lösung für MongoDB war es die "Logische Session" und "Identifikator für die Logische Session" einzuführen. Dieser kleine, eindeutige Identifikator, mit der Bezeichnung "lsid", kann von einem Client an seine Kommunikation mit dem Cluster angefügt werden. Im Gegenzug hängt der Cluster die "lsid" an jede Ressource an, die von dem jeweiligen Client verwendet wird.

                  Die "lsid" wird auf dem Client, vom MongoDB Treiber, automatisch generiert, ohne dafür einen zentralen Dienst anzufragen. Sie setzt sich aus einer, vom Client erstellten global eindeutigen id (GUID) und einer "uid", welche ein SHA256 Hash des Benutzernamens ist, zusammen.


                  Seit der Version 3.6 von MongoDB, wird jede Operation des Clients mit einer Logischen Session assoziiert. Der Logical Session Identifier (lsid) wird dann mit der Ausführung des Kommandos auf dem Cluster verknüpft.

                  • Logische Sessions und Abbrüche

                    • Das Ausführen einer Operation verbraucht Ressourcen. Eine find() Operation, zum Beispiel, erzeugt Cursor auf allen relevanten Shards eines Clusters. Jeder Cursor beginnt die Ergebnisse zur Abfrage zu sammeln und diese ein Chargen zurück zu liefern. Bevor es logische Sessions gab, bedeutete das Abbrechen dieser Operation, dass alle Shards mit Adminrechten traversiert werden mussten, die gesuchte Operation musste aufgespürt und abgebrochen werden.

                      Dieser Prozess verursachte weitere Komplexität.
                      Nehmen wir an der Mongos Prozess, der das Kommando abgesetzt hat, geht down. In diesem Fall ist das Abbrechen noch schwieriger, weil auf die erste Charge der Antworten gewartet werden muss und die Rückgabe mit einem Timeout beantwortet wird.

                      Mit einer logischen Session ist der gesamte Prozess ungleich einfacher. Damit ist es möglich einen Abbruch-Befehl für eine spezifische logische Session, an den Cluster, zu schicken. Alle Ressourcen, einschließlich der Cursor, werden mit dem Identifier der logischen Session versehen, was es zu einer relativ einfachen Sache macht alle Ressourcen, die mit der entsprechenden "lsid" versehen sind freizusetzen. Es ist auch möglich alle Operationen eines bestimmten Benutzers abzubrechen, da die User Id ja Teil der "lsid" ist.

                      • Logische Sessions und verteilte Garbage Collection

                        • Timeouts auf einer Ressource in MongoDB waren früher eine lokale Angelegenheit. Der Node, auf dem sich die entsprechende Ressource befand, hat entschieden ob die Ressource einen Timeout hat und von der Garbage Collection beseitigt werden sollte. Die Pläne für künftige MongoDB Features machten es notwendig, dass Timeouts und die Garbage Collection sich des Clusters bewusst wurden. Um das zu ermöglichen wurde die "lsid" als Basis für alle Änderungen verwendet.

                          In MongoDB 3.6 haben die Mongod und Mongos Prozesse angefangen zwei Dinge zu tun. Als erstes lief ein Kontroll-Prozess, der für das Management von Sessions zuständig ist, und ein zweiter Prozess verwaltete eine Liste von "lsid´s" die mit Prozessen im Controller verbunden sind. Alle 5 Minuten wird diese Liste, mit einer Collection von Sessions synchronisiert und der Zeitstempel, wann diese Session zuletzt verwendet wurde geupdated. Dieser Zeitpunkt, der letzten Nutzung, ist die Basis für einen TTL-Index der alle 30 Minuten auslöst. Dadurch wird eine Session, und alle damit verknüpften Ressourcen, freigesetzt und kann aufgeräumt werden.

                          • Logische Sessions und Transaktionen

                            • Dadurch, dass alle Operationen und Ressourcen mit einer logischen Session Id versehen werden ist es nun einfache langlebige und weit, im Cluster, verbreitete Operationen in MongoDB zu managen. Die "lsid" hat sofortigen Nutzen in Abbruchs- und Garbage-Collection-Szenarien und ist die Grundlage für andere Features in MongoDB ab der Version 4.0+. Indem man sichergeht, dass eine Transaktion innerhalb einer Session stattfindet, ist es möglich diese Transaktionen zu speichern oder aufzuräumen unabhängig davon ob sie erfolgreich ausgeführt oder abgebrochen wurde.

                              Die Dokumentation zu logischen Sessions findet sich hier
                              https://docs.mongodb.com/manual/reference/method/Session/index.html

                              Wer tiefer in das Thema MongoDB Transaktionen einsteigen will, für den hat Qualiero die Schulung MongoDB Datenbank-Entwickler-Kurs im Angebot
                              https://www.qualiero.com/lerninhalte/classroom-trainings/mongodb-datenbank-entwickler-kurs.html

Latest member activities

Recommend this community post