Eventuelle Konsistenz im Klartext


130

In verschiedenen Reden über NoSQL, Datenraster usw. höre ich oft von eventueller Konsistenz. Es scheint, dass die Definition von eventueller Konsistenz in vielen Quellen variiert (und möglicherweise sogar von einer konkreten Datenspeicherung abhängt).

Kann jemand eine einfache Erklärung geben, was eventuelle Konsistenz im Allgemeinen ist und nicht mit einer konkreten Datenspeicherung zusammenhängt?



21
@OliCharlesworth: Nein. Vielleicht bin ich es nur, aber es ist absolut unklar, auch wenn ich zweimal gelesen habe.
Roman

Antworten:


226

Eventuelle Konsistenz:

  1. Ich schaue mir den Wetterbericht an und erfahre, dass es morgen regnen wird.
  2. Ich sage dir, dass es morgen regnen wird.
  3. Ihr Nachbar sagt seiner Frau, dass es morgen sonnig sein wird.
  4. Sie sagen Ihrem Nachbarn, dass es morgen regnen wird.

Schließlich wissen alle Server (Sie, ich, Ihr Nachbar) die Wahrheit (dass es morgen regnen wird), aber in der Zwischenzeit kam der Kunde (seine Frau) weg und dachte, es würde sonnig werden, obwohl sie gefragt hat nachdem einer oder mehrere der Server (Sie und ich) einen aktuelleren Wert hatten.

Im Gegensatz zu strikter Konsistenz / ACID-Konformität:

  1. Ihr Bankguthaben beträgt 50 USD.
  2. Sie zahlen 100 $ ein.
  3. Ihr Bankguthaben, das an jedem Geldautomaten abgefragt wird, beträgt 150 US-Dollar.
  4. Ihre Tochter zieht mit Ihrer Geldautomatenkarte 40 US-Dollar ab.
  5. Ihr Kontostand, der an jedem Geldautomaten abgefragt wird, beträgt 110 US-Dollar.

Zu keinem Zeitpunkt kann Ihr Guthaben etwas anderes als die tatsächliche Summe aller auf Ihrem Konto getätigten Transaktionen bis zu diesem Zeitpunkt widerspiegeln.

Der Grund, warum so viele NoSQL-Systeme letztendlich konsistent sind, besteht darin, dass praktisch alle von ihnen für die Verteilung ausgelegt sind. Bei vollständig verteilten Systemen ist die Aufrechterhaltung einer strengen Konsistenz mit einem superlinearen Aufwand verbunden (dh Sie können nur so weit skalieren, bevor sich die Dinge verlangsamen Wenn dies der Fall ist, müssen Sie exponentiell mehr Hardware auf das Problem werfen, um die Skalierung fortzusetzen.


Ich verstehe nicht. Ist das Wachstum linear oder exponentiell?
Maciek Kreft

4
Das Wachstum des Kommunikationsaufwands eines Systems von N streng konsistenten Knoten wird allgemein als superlinear (dh mehr als linear) verstanden. Könnte exponentiell sein, könnte kubisch sein ... Abhängig vom Kommunikationsprotokoll usw.
Chris Shain

1
Gute Antwort. Einige Anschlussfragen: Ist es nicht "schlecht", dass Anfragen an einen Server zu falschen / veralteten Informationen führen können? Sind die Leute damit einverstanden oder gibt es eine Lösung dafür? Wie werden die Daten schließlich auf verschiedenen Servern repliziert? Wenn einer der Server ausfällt und die Daten auf den Servern repliziert werden, wenn dieser Server wieder hochgefahren wird, wie werden dann seine Daten auf den neuesten Stand gebracht?
Noblerare

5
@noblerare es ist "schlecht" für verschiedene Grade der Schlechtigkeit. Es wäre sehr schlecht, wenn mein Geldautomatenguthaben nicht mehr aktuell wäre. Es ist weniger schlimm, wenn meine Protokolldatenbank nicht ganz aufgeholt ist oder wenn mein Facebook-Feed einige Sekunden zurückliegt. Datenreplikations- und Haltbarkeitsmechanismen sind sehr unterschiedlich und hängen von der jeweiligen Plattform ab. Für Cassandra (als Beispiel) kann der Verfasser entscheiden, ob ein bestimmter Schreibvorgang, um erfolgreich zu sein, auf einem, allen oder einem Quorum (einer Mehrheit) von Knoten festgeschrieben werden muss. HBase verfolgt einen anderen Ansatz, bei dem ein bestimmter Knoten der "Master" für jede Datenzeile ist.
Chris Shain

Tatsächlich sind die meisten Bankensysteme letztendlich konsistent.
Chaos

105

Eventuelle Konsistenz:

  1. Ihre Daten werden auf mehreren Servern repliziert
  2. Ihre Clients können auf jeden der Server zugreifen, um die Daten abzurufen
  3. Jemand schreibt ein Datenelement auf einen der Server, aber es wurde noch nicht auf den Rest kopiert
  4. Ein Client greift mit den Daten auf den Server zu und erhält die aktuellste Kopie
  5. Ein anderer Client (oder sogar derselbe Client) greift auf einen anderen Server zu (einer, der die neue Kopie noch nicht erhalten hat) und erhält die alte Kopie

Da das Replizieren der Daten auf mehreren Servern einige Zeit in Anspruch nimmt, werden Anforderungen zum Lesen der Daten möglicherweise an einen Server mit einer neuen Kopie und dann an einen Server mit einer alten Kopie gesendet. Der Begriff "eventuell" bedeutet, dass die Daten schließlich auf alle Server repliziert werden und somit alle über die aktuelle Kopie verfügen.

Eine eventuelle Konsistenz ist ein Muss, wenn Sie Lesevorgänge mit geringer Latenz wünschen, da der antwortende Server seine eigene Kopie der Daten zurückgeben muss und keine Zeit hat, andere Server zu konsultieren und eine gegenseitige Einigung über den Inhalt der Daten zu erzielen. Ich habe einen Blog-Beitrag geschrieben , der dies ausführlicher erklärt.


2
Schöner Blogbeitrag. Es lohnt sich zu lesen für jemanden, der neu in der Idee der eventuellen Konsistenz ist. Diese Antwort wäre besser, wenn sie umgeschrieben würde, um mehr von dem zu erklären, was im Blog-Beitrag steht.
Axiopistie

1
Gut erklärt in Ihrem Blog. Danke für das Teilen.
Ataur Rahman Munna

12

Denken Sie, Sie haben eine Anwendung und ihre Replik. Dann müssen Sie der Anwendung ein neues Datenelement hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Anschließend synchronisiert die Anwendung die Daten mit anderen unten gezeigten Replikaten

Geben Sie hier die Bildbeschreibung ein

In der Zwischenzeit erhält ein neuer Client Daten von einem Replikat, das noch nicht aktualisiert wurde. In diesem Fall kann er keine korrekten Aktualisierungsdaten erhalten. Weil die Synchronisation etwas Zeit bekommt. In diesem Fall hat es letztendlich keine Konsistenz

Problem ist, wie können wir schließlich Konsistenz ?

Dazu verwenden wir die Mediator-Anwendung zum Aktualisieren / Erstellen / Löschen von Daten und verwenden die direkte Abfrage zum Lesen von Daten. das hilft, irgendwann Konsistenz zu machen

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein


3

Wenn eine Anwendung eine Änderung an einem Datenelement auf einem Computer vornimmt, muss diese Änderung an die anderen Replikate weitergegeben werden. Da die Weitergabe der Änderungen nicht sofort erfolgt, gibt es ein Zeitintervall, in dem einige der Kopien die letzte Änderung aufweisen, andere jedoch nicht. Mit anderen Worten, die Kopien sind inkonsistent. Die Änderung wird jedoch schließlich auf alle Kopien übertragen, und daher der Begriff „eventuelle Konsistenz“. Der Begriff "eventuelle Konsistenz" ist lediglich eine Bestätigung dafür, dass die Weitergabe einer auf einem Computer vorgenommenen Änderung an alle anderen Kopien unbegrenzt verzögert ist. Eine eventuelle Konsistenz ist in zentralisierten Systemen (Einzelkopie) nicht sinnvoll oder relevant, da keine Weitergabe erforderlich ist.

Quelle: http://www.oracle.com/technetwork/products/nosqldb/documentation/consistency-explained-1659908.pdf


1

In einfachem Englisch können wir sagen: Obwohl sich Ihr System in einem inkonsistenten Zustand befindet, besteht das Ziel immer darin, für jedes Datenelement irgendwann eine Konsistenz zu erreichen.


1

Konsistenz bedeutet letztendlich, dass die Weitergabe von Änderungen einige Zeit in Anspruch nimmt und die Daten möglicherweise nicht nach jeder Aktion im selben Zustand sind, selbst bei identischen Aktionen oder Transformationen der Daten. Dies kann dazu führen, dass sehr schlimme Dinge passieren, wenn die Leute nicht wissen, was sie tun, wenn sie mit einem solchen System interagieren.

Bitte implementieren Sie keine geschäftskritischen Dokumentendatenspeicher, bis Sie dieses Konzept gut verstanden haben. Das Versauen einer Implementierung eines Dokumentdatenspeichers ist viel schwieriger zu beheben als ein relationales Modell, da die grundlegenden Dinge, die vermasselt werden sollen, einfach nicht behoben werden können, da die Dinge, die zum Beheben erforderlich sind, im Ökosystem einfach nicht vorhanden sind. Das Refactoring der Daten eines Inflight-Speichers ist auch viel schwieriger als die einfachen ETL-Transformationen eines RDBMS.

Nicht alle Dokumentenspeicher sind gleich. Einige dieser Tage (MongoDB) unterstützen Transaktionen einer Art, aber die Migration von Datenspeichern ist wahrscheinlich mit den Kosten einer erneuten Implementierung vergleichbar.

WARNUNG: Entwickler und sogar Architekten, die die Technologie eines Dokumentendatenspeichers nicht kennen oder verstehen und Angst haben, dies zuzugeben, aus Angst, ihren Arbeitsplatz zu verlieren, aber klassisch in RDBMS geschult wurden und nur ACID-Systeme kennen (wie unterschiedlich kann es sein) ?) und wer die Technologie nicht kennt oder sich die Zeit nimmt, sie zu erlernen, wird das Entwerfen eines Dokumentdatenspeichers vermissen. Sie können auch versuchen, es als RDBMS oder für Dinge wie Caching zu verwenden. Sie werden atomare Transaktionen, die für ein gesamtes Dokument ausgeführt werden sollen, in „relationale“ Teile zerlegen, wobei vergessen wird, dass Replikation und Latenz Dinge sind oder noch schlimmer, Systeme von Drittanbietern in eine „Transaktion“ ziehen. Sie tun dies, damit ihr RDBMS ihren Datensee spiegeln kann, unabhängig davon, ob es funktioniert oder nicht, und ohne Tests, da sie wissen, was sie tun. Dann werden sie überrascht sein, wenn komplexe Objekte, die in separaten Dokumenten wie "Bestellungen" gespeichert sind, weniger "Bestellpositionen" haben als erwartet oder gar keine. Aber es wird nicht oft oder oft genug passieren, so dass sie einfach vorwärts marschieren. Sie treffen möglicherweise nicht einmal das Problem in der Entwicklung. Anstatt die Dinge neu zu gestalten, werden sie "Verzögerungen" und "Wiederholungsversuche" und "Einchecken" auslösen, um ein relationales Datenmodell zu fälschen, das nicht funktioniert, aber zusätzliche Komplexität ohne Nutzen hinzufügt. Aber jetzt ist es zu spät - das Ding wurde bereitgestellt und jetzt läuft das Geschäft darauf. Schließlich wird das gesamte System weggeworfen und die Abteilung wird ausgelagert und jemand anderes wird es warten. Es funktioniert immer noch nicht richtig, aber sie können weniger teuer ausfallen als der aktuelle Fehler.


0

Die eventuelle Konsistenz ähnelt eher einem Spektrum. Auf der einen Seite haben Sie eine starke Konsistenz und auf der anderen Seite haben Sie eine eventuelle Konsistenz. Dazwischen gibt es Levels wie Snapshot, lies meine Schriften, begrenzte Stalenität. Doug Terry hat eine schöne Erklärung in seiner Arbeit über mögliche Konsistenz durch Baseball .

Aus meiner Sicht ist eine eventuelle Konsistenz im Grunde genommen eine Toleranz gegenüber zufälligen Daten in zufälliger Reihenfolge, wenn Sie aus einem Datenspeicher lesen. Alles, was besser ist, ist ein stärkeres Konsistenzmodell. Ein Snapshot enthält beispielsweise veraltete Daten, gibt jedoch dieselben Daten zurück, wenn er erneut gelesen wird, damit er vorhersehbar ist. Manchmal kann die Anwendung Daten tolerieren, die für einen bestimmten Zeitraum veraltet sind und ab dem konsistente Daten erforderlich sind.

Wenn Sie die Bedeutung von Konsistenz betrachten, bezieht sich dies eher auf Gleichmäßigkeit oder mangelnde Abweichung. In Bezug auf Nicht-Computersysteme könnte dies eine Toleranz für unerwartete Abweichungen bedeuten. Es könnte sehr gut durch Geldautomaten erklärt werden. Ein Geldautomat kann offline sein und daher vom Kontostand der Kernsysteme abweichen. Es gibt jedoch eine Toleranz für die Anzeige unterschiedlicher Bilanzen für ein Zeitfenster. Sobald der Geldautomat online ist, kann er mit den Kernsystemen synchronisiert werden und das gleiche Gleichgewicht widerspiegeln. Man könnte also sagen, dass ein Geldautomat letztendlich konsistent ist.

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.