Im Replikatmodus schreibt jede Schreiboperation in eine beliebige Sammlung in einer DB auch in die oplog-Sammlung.
Wenn nun in mehrere DBs parallel geschrieben wird, schreiben alle diese Schreiboperationen auch in den oplog. Meine Frage: Müssen diese Schreiboperationen den oplog sperren? (Ich benutze w: 1 schreibe Anliegen). Wenn dies der Fall ist, ist dies ähnlich wie eine globale Sperre zwischen allen Schreiboperationen für alle verschiedenen DBs, nicht wahr?
Ich würde mich freuen, Hinweise dazu zu bekommen.
Nach der Dokumentation in der Replikation, wenn MongoDB in eine Sammlung auf der primären schreibt, MongoDB schreibt auch in das Primärprotokoll, das eine spezielle Sammlung in der lokalen Datenbank ist. Daher muss MongoDB sowohl die Datenbank der Sammlung als auch die lokale Datenbank sperren. Der Mongod muss beide Datenbanken gleichzeitig sperren, um die Datenbank konsistent zu halten und sicherzustellen, dass Schreibvorgänge auch bei der Replikation "Alles-oder-Nichts" -Operationen sind.
Dies bedeutet, dass das gleichzeitige parallele Schreiben auf mehrere Datenbanken in der Primärdatenbank zu globalen Sperren zwischen allen Schreiboperationen führen kann. Dies gilt nicht für die sekundäre Klasse, da MongoDB Schreibvorgänge nicht seriell auf sekundäre Klassen anwendet, sondern stattdessen oplog-Einträge in Stapeln sammelt und diese Stapel dann parallel anwendet.
Haftungsausschluss Das ist alles von meinem Kopf, also bitte kreuzt mich nicht, wenn ich einen Fehler habe. Bitte korrigieren Sie mich jedoch.
Warum sollten sie?
Nehmen wir an, dass eine echte Parallelität von Abfragen angewendet wird. Also haben wir zwei Anfragen zur selben Zeit und wir müssen entscheiden, welche zuerst in das oplog eingefügt werden soll. Der Erste, der das Schloss nimmt, wird zuerst schreiben, oder? Außer, es gibt ein Problem. Nehmen wir an, die erste Abfrage ist eine einfache db.collection.update({_id:"foo"},{$set:{"bar":"baz"}})
, während die andere Abfrage komplizierter ist und daher länger braucht, um auf Korrektheit zu prüfen. Um dies zu verhindern, musste eine Sperre bei der Ankunft getroffen und nach dem Schreiben des idempotenten oplog-Eintrags wieder freigegeben werden.
Hier muss ich mich auf mein Gedächtnis verlassen
Abfragen werden jedoch nicht parallel angewendet. Abfragen werden in die Warteschlange gestellt und in der Reihenfolge ihrer Ankunft ausgewertet. Die Datenbank wird bei der Anwendung der Abfragen gesperrt, nachdem sie den Abfrageoptimierer durchlaufen haben. Während dieser Sperre werden die idempotenten oplog-Abfragen in das oplog geschrieben. Da Datenbanken nicht miteinander verbunden sind und zu einem bestimmten Zeitpunkt nur eine Abfrage auf eine Datenbank angewendet werden kann, ist die Sperre für die Datenbank ausreichend. Zwei Datenänderungsanfragen können nicht gleichzeitig auf dieselbe Datenbank angewendet werden. Warum sollte also eine Sperre für den oplog gesetzt werden?
Anscheinend wird eine Sperre für die lokale Datenbank übernommen. Da die Daten jedoch bereits gesperrt sind, sehe ich keinen Grund dafür. * scratchingMyHead *
Tags und Links mongodb replication replicaset wiredtiger