CRDTs Math verwendet Konsistenz in einem verteilten Cluster zu erzwingen, ohne sich um Konsens zu kümmern und ein assoziierte Latenz/Nichtverfügbarkeit. Die Menge der Werte, die eine CRDT jederzeit annehmen kann, fällt in die Kategorie eines Semi-Gitters (insbesondere eines Joins-Semi-Gitters), das ein POSET (partiell geordnete Menge) mit einer Funktion der kleinsten oberen Grenze ist (
). LUB).
In einfachen Worten, ein POSET ist eine Sammlung von Artikeln, in denen nicht alle vergleichbar sind. Z.B. in einem Array von Paaren: {(2,4), (4, 5), (2, 1), (6, 3)}
, (2,4)
ist < (4,5)
, kann aber nicht mit (6,3)
verglichen werden (da ein Element größer und das andere kleiner ist). Nun, ein Semi-Gitter ist ein POSET, in dem 2 Paare gegeben sind, auch wenn Sie die beiden nicht vergleichen können, können Sie ein Element finden, das größer als beides ist.
Eine weitere Bedingung ist, dass Aktualisierungen dieses Datentyps erhöht werden müssen. CRDTs haben einen monoton ansteigenden Status, in dem Clients nie einen Status-Rollback beobachten.
Diese excellent article verwendet das Array, das ich oben als ein Beispiel verwendet habe. Wenn ein CRDT diese Werte beibehält, wenn 2 Replikate versuchen, einen Konsens zwischen (4,5)
und (6,3)
zu erzielen, können sie eine LUB = (6,5)
als Konsens auswählen und ihr beide Replikate zuweisen. Da die Werte ansteigen, ist dies ein guter Wert, um sich festzulegen.
ist es 2 Möglichkeiten für CRDTs miteinander über Repliken synchron zu halten, können sie Zustand übertragen über periodisch (konvergente replizierten Datentyp), oder sie können Aktualisierungen (Deltas) übertragen über, wie sie sie erhalten (kommutativ replizierten Datentyp). Ersteres erfordert mehr Bandbreite.
SoundCloud Roshi ist ein gutes Beispiel (obwohl nicht mehr in der Entwicklung scheint es), sie speichern Daten mit einem Zeitstempel verbunden, wo der Zeitstempel ist offensichtlich inkrementieren. Alle Aktualisierungen, die mit einem Zeitstempel kommen, der kleiner oder gleich dem gespeicherten ist, werden verworfen, was Idempotenz (wiederholte Schreibvorgänge sind OK) und Kommutativität (Schreibzugriffe in Ordnung) gewährleistet. Kommutierbarkeit ist a=b means b=a
, was in diesem Fall update1 gefolgt von update2 bedeutet gleiche wie update2 von update1 gefolgt)
Writes werden an alle Cluster gesendet, und wenn bestimmte Knoten aufgrund eines Problems wie Langsamkeit oder Partition nicht reagieren, werden sie später über eine read-repair
, aufholen zu erwarten, die, dass die gewährleistet, Werte konvergieren. Die Konvergenz kann über 2 Protokolle erreicht werden, wie ich oben erwähnt habe, propagieren Zustand oder Updates für andere Replikate. Ich glaube, Roshi macht das erste. Als Teil der read-repair
tauschen Replikate Zustand, und da Daten an die Semi-Gitter-Eigenschaft haftet, konvergieren sie.
PS. Systeme, die CRDTs verwenden, sind schließlich konsistent, d. H. Sie nehmen AP (hochverfügbar und partitionstolerant) in CAP theorem an.
Another excellent read on the subject.
die akzeptierte Mark Antwort, wenn es Ihre Frage beantwortet. –