Wo steht Mongodb im CAP-Theorem?


121

Ü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?

Antworten:


104

MongoDB ist standardmäßig stark konsistent. Wenn Sie schreiben und dann lesen, können Sie das Ergebnis des gerade gelesenen Schreibvorgangs immer lesen, sofern der Schreibvorgang erfolgreich war. Dies liegt daran, dass MongoDB ein Single-Master-System ist und alle Lesevorgänge standardmäßig an das primäre System gesendet werden. Wenn Sie optional das Lesen aus den Sekundärdateien aktivieren, wird MongoDB schließlich konsistent, wenn es möglich ist, veraltete Ergebnisse zu lesen.

MongoDB wird auch durch automatisches Failover in Replikatsätzen hochverfügbar: http://www.mongodb.org/display/DOCS/Replica+Sets


13
Laut aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads können veraltete oder verschmutzte Daten auftreten, selbst wenn Sie vom primären Knoten im Replikatsatz lesen. Also ist MongoDB stark konsistent?
Mike Argyriou

3
Tolle Experimente von Kyle. Es jagt wirklich Mongo. Ich frage mich, ob es Produktionssysteme gibt, die beispielsweise MongoDB für Zahlungsvorgänge verwenden. Wenn es sich nur um eine persönliche Website handelt, wen interessiert dann eine starke Konsistenz?
Xin

5
Nur zur Veranschaulichung, MongoDB v3.4 hat den von Kyle entworfenen Test bestanden. Ja, MongoDB ist selbst mit ReplicaSet und Sharding stark konsistent: mongodb.com/mongodb-3.4-passes-jepsen-test
Maxime Beugnet

2
Diese Antwort ist möglicherweise etwas zu einfach, da MongoDB die Verfügbarkeit je nach Konfiguration von Zeit zu Zeit opfern kann. JoCa erklärt besser die Situationen, in denen es sich CA / CP / AP
PaoloC

36

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.

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

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.


Wenn ich also die richtige Schreib- / Lesebedenkenstufe verwende, bedeutet dies, dass alle Schreib- und Lesevorgänge an die Primärdaten gesendet werden (wenn ich das richtig verstanden habe). Was genau machen die Sekundärdateien? Sitzen Sie einfach im Standby-Modus, falls die Primärdatenbank ausfällt?
Tomer.z

@ tomer.z Vielleicht möchten Sie diesen Abschnitt des Handbuchs lesen : Sie können Secondaries zum Lesen verwenden. Wenn Sie die Leseebene "Mehrheit" verwenden, ist der Lesevorgang gültig, sobald die Mehrheit der Mitglieder den Lesevorgang bestätigt hat. Gleiches gilt für die Schreibstufe "Mehrheit". Wenn Sie für beide die "Mehrheit" Concern-Level verwenden, verfügen Sie über eine konsistente Datenbank. Vielleicht möchten Sie mehr darüber im Handbuch lesen .
JoCa

18

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.


10

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.


3

Ich bin mir bei P für Mongo nicht sicher. Stellen Sie sich die Situation vor:

  • Ihr Replikat wird in zwei Partitionen aufgeteilt.
  • Die Schriften gehen an beide Seiten weiter, als neue Meister gewählt wurden
  • Die Partition wurde aufgelöst - alle Server sind jetzt wieder verbunden
  • Was passiert, ist, dass ein neuer Master gewählt wird - derjenige mit dem höchsten Oplog, aber die Daten des anderen Masters werden vor der Partition in den allgemeinen Zustand zurückgesetzt und zur manuellen Wiederherstellung in eine Datei kopiert
  • Alle Secondaries holen den neuen Master ein

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.)


2
Das Wahlprotokoll von MongoDB soll (höchstens) eine einzige Grundschule haben. Ein Primärer kann nur mit einer strengen Mehrheit der konfigurierten stimmberechtigten Mitglieder (n / 2 +1) gewählt (und aufrechterhalten) werden. Im Falle einer Netzwerkpartition kann nur eine Partition (mit der Mehrheit der stimmberechtigten Mitglieder) eine primäre Partition wählen. Eine vorherige primäre in einer Minderheitspartition wird zurücktreten und eine sekundäre werden. So haben Replikatsätze immer funktioniert. Falls eine frühere Primärdatenbank Schreibvorgänge akzeptiert hat, die nicht repliziert wurden, werden sie zurückgesetzt (auf der Festplatte gespeichert), wenn dieses Mitglied wieder dem Replikatsatz beitritt.
Stennie

2

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.


2

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:

  • Wenn der Primärknoten ausfällt: Das System ist nicht mehr verfügbar, bis ein neuer Primärknoten ausgewählt wird.
  • Wenn der Primärknoten die Verbindung von zu vielen Sekundärknoten verliert: Das System ist nicht mehr verfügbar. Andere Secondaries werden versuchen, eine neue Primary zu wählen, und die aktuelle Primary wird zurücktreten.

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.


"Es wird aufhören , Schreibvorgänge in das System zu akzeptieren , bis es glaubt, dass es diese Schreibvorgänge sicher abschließen kann. " Was ist mit Lesevorgängen ? Würde es während dieser Zeit lesbar bleiben?
Josh

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.