Sperren in MongoDB

Bilal Shahid 20 Juni 2023
  1. Sperren in MongoDB
  2. Sperrebenen in MongoDB
  3. Sperrmodi in MongoDB
  4. Überprüfen Sie den Sperrstatus in MongoDB
  5. Abschluss
Sperren in MongoDB

In Datenbankverwaltungssystemen stellt der Sperrmechanismus die Konsistenz der Ergebnisse sicher.

Beispielsweise kann ein Lese-Befehl nicht gleichzeitig ausgeführt werden, wenn eine Schreib-Prozedur an den Daten durchgeführt wird. Die Datenbankressourcen werden gesperrt, um zu verhindern, dass Daten aufgrund solcher Situationen ungenau werden.

MongoDB verwendet auch Sperren, um die Datenkonsistenz sicherzustellen, da mehrere Clients gleichzeitig auf dieselben Daten zugreifen oder diese ändern können. In diesem Artikel erklären wir das Konzept des Sperrens in MongoDB.

Sperren in MongoDB

Das Sperren in MongoDB funktioniert anders als das Sperren in anderen Verwaltungssystemen für relationale Datenbanken. Lassen Sie uns Ihnen beschreiben, wie das Sperren in MongoDB funktioniert.

MongoDB nutzt multi-granularity locking. Das bedeutet, dass die Prozesse auf globaler, Datenbank- oder Sammlungsebene oder sogar auf Dokumentebene für einzelne Speicher-Engines gesperrt werden können.

Diese Sperrebenen werden in diesem Artikel weiter beschrieben. In den neueren Versionen von MongoDB, beginnend mit v2.2, gibt es einen Lese-/Schreib-Latch für jede Datenbank.

Aufgrund dieser Lese-/Schreibverriegelungen ist ein gleichzeitiger Zugriff auf die Datenbankressourcen möglich. Lassen Sie uns erklären, wie diese funktionieren.

Lese-/Schreibverriegelung

Der Reader/Writer-Latch von MongoDB lässt sich am besten mit den folgenden Eigenschaften erklären:

  1. Es ist ein Mehrfachleser. Das bedeutet, dass beliebig viele Leser gleichzeitig auf die Sammlungen zugreifen können, ohne die Konsistenz der Daten zu beeinträchtigen, da die Daten nicht verändert, sondern nur gelesen werden.

  2. Es ist ein single-writer. Das bedeutet, dass es immer nur einen Schreiber geben kann, um die Datenkonsistenz zu gewährleisten.

  3. Es ist schreibergierig. Schreibgierig zu sein bedeutet, dass Autoren Vorrang vor Lesern haben.

    Wenn daher ein Autor die Verwendung der Datenbank anfordert, werden alle eingehenden Leser vorübergehend blockiert (oder gesperrt), bis sie ihre Arbeit abgeschlossen haben.

    Der Autor wartet jedoch, bis die aktuellen Leser gehen. Diese Implementierung verhindert, dass die Schreiber auf unbestimmte Zeit ausgehungert werden.

Hinweis: Die Lese-/Schreibverriegelung wird als Lese-/Schreibsperre bezeichnet. Es ist jedoch angemessener, es als Riegel zu bezeichnen, da es leicht ist.

Aufgrund des Vorhandenseins dieses Latches in MongoDB können alle gleichzeitigen Abfragen ohne größere Sperrkonflikte ausgeführt werden.

Hier wird der Writer-Latch interessant, da in MongoDB jeder Schreibvorgang in ein einzelnes Dokument als atomar betrachtet wird. Da die write-Operation atomar ist, wird der Writer-Latch vom MongoDB-Kernel nur für die Zeit gehalten, die zum Aktualisieren eines einzelnen Dokuments benötigt wird.

Wenn daher eine langsam laufende Schreiboperation ausgeführt wird (z. B. aufgrund eines schlechten Schemadesigns oder des Paging eines Dokuments von der Festplatte), soll dies den Latch ergeben haben.

Beachten Sie außerdem, dass MongoDB, wie bereits erwähnt, für jede Datenbank einen separaten Lese-/Schreib-Latch hat. Um dies zu erklären, nehmen wir an, wir haben zwei Datenbanken, A und B.

Für eine write-Operation in Datenbank A erhält der Writer einen separaten Latch im Vergleich zu den write-Operationen in Datenbank B.

Wenn mehrere Verbindungen zur Datenbank gleichzeitig Schreibvorgänge ausführen, werden die Latches auf Datenbankbasis gehalten. Außerdem werden diese gleichzeitigen Verbindungen verschachtelt.

Hinweis: Es kann vorkommen, dass durch das Sperren die Leistung und Geschwindigkeit des Datenbanksystems beeinträchtigt werden. In Wirklichkeit ist dies kein großes Problem, da MongoDB für die durchschnittliche Last die E/A-Kapazität der Festplatte oder SSD sättigt, bevor der Sperrprozentsatz für eine Datenbank größer als 50 % wird.

Daher sagen wir, dass das Sperren in MongoDB nicht pro Verbindung erfolgt. Vielmehr ist es pro mongod.

mongod bezieht sich auf den primären Hintergrundprozess des MongoDB-Systems, der Datenanforderungen, Datenzugriff und andere Hintergrundvorgänge verwaltet.

Sperrebenen in MongoDB

In MongoDB gibt es vier Sperrebenen:

  1. Global-level Locking: Dies wird auch als Sperren auf Instanzebene bezeichnet. Dies impliziert, dass alle Datenbanken gesperrt werden.
  2. Database-level Locking: Bei dieser Sperrart wird nur die angegebene Datenbank gesperrt.
  3. Sperren auf Sammlungsebene: In MongoDB ist eine Sammlung eine Gruppe zusammengehöriger Dokumente (ähnlich einer Tabelle in traditionellen RDBMS). Verriegelungsgriffe auf Sammlungsebene verriegeln einzelne Sammlungen.
  4. Document-level Locking: Ein Dokument in MongoDB kann als Datensatz mit Feld- und Wertepaaren bezeichnet werden. Diese Art der Sperrung sperrt nur das jeweilige Dokument.

Sperrmodi in MongoDB

In MongoDB gibt es vier Sperrmodi, die unten erläutert werden.

  1. R: Dies repräsentiert ein Shared (S)-Schloss. Dieser Sperrmodus wird für Leser verwendet.

    Die Ressourcen werden von den Lesern gemeinsam genutzt, die in diesem Modus gleichzeitig auf sie zugreifen.

  2. W: Dies repräsentiert ein Exklusiv (X)-Schloss. Dieser Sperrmodus wird für Schreiber verwendet.

    In diesem Modus sind die Ressourcen für andere gleichzeitige Leser oder Schreiber nicht verfügbar.

  3. r: Dies repräsentiert eine Sperre Intent Shared (IS). Es ist eine Absichtssperre auf höherer Ebene.

    Solche Sperren werden erworben, bevor sie zu Sperren niedrigerer Ebene verschoben werden. Wenn zum Beispiel eine r-Sperre auf Datenbankebene erworben wird, bedeutet dies, dass nun eine R-Sperre auf der Sammlungs- und Dokumentenebene (niedrigere) erworben werden kann.

  4. w: Dies repräsentiert eine Sperre Intent Exclusive (IX). Es ist auch eine Absichtssperre auf höherer Ebene.

    Ähnlich wie eine r-Sperre funktioniert, wenn eine w-Sperre auf Datenbankebene erworben wird, bedeutet dies, dass nun eine W-Sperre auf der Sammlungs- und Dokumentenebene (niedrigere) erworben werden kann.

Überprüfen Sie den Sperrstatus in MongoDB

Gibt es also eine Möglichkeit, den Status der Sperren auf Ihrer mongod-Instanz zu überprüfen? Ja, Sie können dies tun, indem Sie die folgende Methode verwenden:

db.serverStatus()

Mit dieser Methode können Sie die Sperren auf verschiedenen Ebenen überwachen, zum Beispiel:

  1. Verwenden Sie für die globale Ebene diesen Code db.serverStatus().globalLock.
  2. Verwenden Sie für die Datenbankebene diesen Code db.serverStatus().locks.Database.
  3. Verwenden Sie für die Sammlungsebene diesen Code db.serverStatus().locks.Collection.
  4. Verwenden Sie zur Überwachung von Sperren in oplog (Operations Log) diesen Code db.serverStatus().locks.oplog.

Sie können auch die folgende Methode verwenden:

db.currentOp()

Abschluss

In diesem Artikel wurde das Konzept des Sperrens in MongoDB erläutert, gefolgt von den verschiedenen Ebenen und Modi. Wir hoffen, dass Sie diese Konzepte verstehen konnten.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub