Überall, wo ich hinschaue, sehe ich, dass MongoDB CP ist. Aber wenn ich mich vertiefe, sehe ich, dass es irgendwann konsistent ist. Ist es CP, wenn Sie safe = true verwenden? Wenn ja, bedeutet dies, dass beim Schreiben mit safe = true alle Replikate aktualisiert werden, bevor das Ergebnis angezeigt wird?
121
Ich stimme Luccas Post zu. Sie können nicht einfach sagen, dass MongoDB CP / AP / CA ist, da es sich tatsächlich um einen Kompromiss zwischen C, A und P handelt, abhängig von der Datenbank- / Treiberkonfiguration und der Art der Katastrophe : Hier eine visuelle Zusammenfassung und unter a detailliertere Erklärung.
Konsistenz:
MongoDB ist stark konsistent, wenn Sie eine einzelne Verbindung oder die richtige Schreib- / Lesebedenken-Ebene verwenden ( was Ihre Ausführungsgeschwindigkeit kostet ). Sobald Sie diese Bedingungen nicht erfüllen (insbesondere wenn Sie von einem sekundären Replikat lesen), wird MongoDB schließlich konsistent.
Verfügbarkeit:
MongoDB erhält hohe Verfügbarkeit durch Replica-Sets . Sobald die Primärdatenbank ausfällt oder anderweitig nicht mehr verfügbar ist, bestimmen die Sekundärdaten eine neue Primärdatenbank, die wieder verfügbar sein soll. Dies hat einen Nachteil: Jeder Schreibvorgang, der von der alten Primärdatenbank ausgeführt, aber nicht mit den Sekundärdateien synchronisiert wurde, wird zurückgesetzt und in einer Rollback-Datei gespeichert, sobald die Verbindung zum Set wiederhergestellt wird (die alte Primärdatenbank ist eine Sekundärdatei jetzt). In diesem Fall wird also aus Gründen der Verfügbarkeit eine gewisse Konsistenz geopfert.
Partitionstoleranz:
Durch die Verwendung dieser Replikatsätze erreicht MongoDB auch die Partitionstoleranz: Solange mehr als die Hälfte der Server eines Replikatsatzes miteinander verbunden sind, kann ein neuer Primärserver ausgewählt werden . Warum? Um sicherzustellen, dass zwei getrennte Netzwerke nicht beide eine neue primäre auswählen können. Wenn nicht genügend Sekundärdateien miteinander verbunden sind, können Sie immer noch von ihnen lesen (aber die Konsistenz ist nicht gewährleistet), aber nicht schreiben. Das Set ist aus Gründen der Konsistenz praktisch nicht verfügbar.
quelle
Da ein brillanter neuer Artikel und einige großartige Experimente von Kyle auf diesem Gebiet aufgetaucht sind, sollten Sie vorsichtig sein, wenn Sie MongoDB und andere Datenbanken als C oder A kennzeichnen.
Natürlich hilft CAP dabei, ohne viele Worte herauszufinden, was in der Datenbank vorherrscht, aber die Leute vergessen oft, dass C in CAP beispielsweise atomare Konsistenz (Linearisierbarkeit) bedeutet. Und das verursachte mir große Schmerzen beim Verstehen. Abgesehen davon, dass MongoDB eine starke Konsistenz aufweist, bedeutet dies nicht, dass dies C ist. Auf diese Weise empfehle ich, wenn man diese Klassifizierungen vornimmt, auch mehr Tiefe in die Funktionsweise zu geben, um keine Zweifel zu hinterlassen.
quelle
Ja, es ist CP bei der Verwendung
safe=true
. Dies bedeutet einfach, dass die Daten auf die Master-Festplatte gelangt sind. Wenn Sie sicherstellen möchten, dass es auch auf einem Replikat angekommen ist, überprüfen Sie den Parameter 'w = N', wobei N die Anzahl der Replikate ist, auf denen die Daten gespeichert werden müssen.sehen dies und dies für weitere Informationen.
quelle
Ich bin mir bei P für Mongo nicht sicher. Stellen Sie sich die Situation vor:
Das Problem hierbei ist, dass die Größe der Speicherauszugsdatei begrenzt ist und Sie Ihre Daten für immer verlieren können, wenn Sie lange Zeit eine Partition hatten.
Man kann sagen, dass es unwahrscheinlich ist - ja, es sei denn, in der Cloud ist es häufiger als man denkt.
In diesem Beispiel würde ich sehr vorsichtig sein, bevor ich einer Datenbank einen Brief zuweise. Es gibt so viele Szenarien und Implementierungen sind nicht perfekt.
Wenn jemand weiß, ob dieses Szenario in späteren Versionen von Mongo behoben wurde, kommentieren Sie bitte! (Ich habe seit einiger Zeit nicht mehr alles verfolgt, was passiert ist.)
quelle
Mongodb erlaubt niemals das Schreiben in die Sekundarstufe. Es erlaubt optionale Lesevorgänge von sekundären, aber keine Schreibvorgänge. Wenn Ihre Primärdatenbank ausfällt, können Sie erst schreiben, wenn eine Sekundärseite wieder zur Primärseite wird. Auf diese Weise opfern Sie die Hochverfügbarkeit im CAP-Theorem. Indem Sie Ihre Lesevorgänge nur von der primären Seite halten, können Sie eine starke Konsistenz erzielen.
quelle
MongoDB wählt Konsistenz über Verfügbarkeit aus, wenn eine Partition vorhanden ist. Dies bedeutet, dass bei einer Partition (P) Konsistenz (C) anstelle von Verfügbarkeit (A) ausgewählt wird.
Um dies zu verstehen, wollen wir verstehen, wie MongoDB das Replikatset funktioniert. Ein Replikatsatz hat einen einzelnen Primärknoten. Die einzige "sichere" Möglichkeit, Daten festzuschreiben, besteht darin, auf diesen Knoten zu schreiben und dann darauf zu warten, dass diese Daten auf eine Mehrheit der Knoten in der Gruppe festgeschrieben werden. (Sie werden dieses Flag für w = Mehrheit sehen, wenn Sie Schreibvorgänge senden)
Die Partitionierung kann in zwei Szenarien wie folgt erfolgen:
Grundsätzlich wählt MongoDB immer dann, wenn eine Partition ausgeführt wird und MongoDB entscheiden muss, was zu tun ist, Konsistenz statt Verfügbarkeit. Es werden keine Schreibvorgänge mehr in das System akzeptiert, bis es glaubt, dass es diese Schreibvorgänge sicher abschließen kann.
quelle
Mongodb bietet Konsistenz und Partitionstoleranz .
Im Kontext verteilter (NoSQL) Datenbanken bedeutet dies, dass es immer einen Kompromiss zwischen Konsistenz und Verfügbarkeit geben wird. Dies liegt daran, dass verteilte Systeme immer notwendigerweise partitionstolerant sind (dh es wäre einfach keine verteilte Datenbank, wenn sie nicht partitionstolerant wäre).
Konsistenz - Das System wird schließlich konsistent. Die Daten werden früher oder später an jeden Ort weitergegeben, an dem sie sich befinden sollten. Das System empfängt jedoch weiterhin Eingaben und überprüft nicht die Konsistenz jeder Transaktion, bevor es zur nächsten übergeht.
Verfügbarkeit - Standardmäßig sendet der Mongo DB-Client (MongoDB-Treiber) alle Lese- / Schreibanforderungen an den Leader / Primärknoten. Es macht das System konsistent, aber nicht verfügbar aufgrund von - Wenn ein Leiter die Verbindung zum Cluster trennt, dauert es einige Sekunden, einen neuen Leiter zu wählen. Daher ist es für Schreib- und Lesevorgänge in dieser Dauer nicht verfügbar.
quelle