Ich habe angefangen, Ansätze für die Datensynchronisation zwischen einer Reihe von Peers zu untersuchen. Die Peers müssen in der Lage sein, getrennt zu arbeiten und dann miteinander zu synchronisieren, um ihre lokalen Änderungen zusammenzuführen.
Peers sollten in der Lage sein, lokale Updates mit einem "Drei-Wege-Merge" zusammenzuführen . Bei der Synchronisation sollten Peers wissen, welche Fakten aktueller sind, aber wo es keine strikte Reihenfolge gibt, sollten sie in der Lage sein, die Fakten basierend auf der gemeinsamen Wurzel zusammenzuführen.
Wenn unabhängige Kollegen Änderungen vornehmen, können sie diese mit einer "Uhr" versehen. Ich benutze die Begriffe "Uhr" und "Zeitstempel", meine aber keine Wanduhr. Ich meine eine Art Teilordnung von Ereignissen, die die Kausalität klar macht. Es ist die Beziehung, die zwischen Ereignissen vorher stattgefunden hat , die einen gerichteten azyklischen Graphen (DAG) bildet.
Es scheint, als ob die "übliche" Art, diese Teilordnung aufzubauen, die Verwendung einer Vektoruhr ist . Diese können jedoch sehr groß werden. Neuere Entwicklungen wie Intervallbaumuhren ermöglichen eine kompaktere Speicherung von Zeitstempeln.
Was mir überhaupt nicht klar ist, warum Synchronisationsprotokolle die DAG anscheinend nicht "einfach" explizit speichern. (Oder doch?)
Peers können unabhängig voneinander einen Zeitstempel erstellen, indem sie eine UUID zufällig generieren (oder auf andere Weise, wie z. B. <peer-name> + <local-monotonically-increasing-counter>
). Die Reihenfolge dieses Zeitstempels ist für diesen Peer völlig klar.
Wenn zwei Peers miteinander synchronisiert sind, können sie sich auf einen neuen Zeitstempel einigen. Auch hier ist die Reihenfolge dieses Zeitstempels für beide Peers klar.
Es ist jetzt erforderlich, die vor der DAG erfolgte Weitergabe zwischen Peers durchzuführen, die Speicher- und Bandbreitenanforderungen hierfür sind jedoch gering. Zeitpunkte sind Diagrammscheitelpunkte. Als solche haben sie 1 oder 2 eingehende Kanten (1 für ein Ereignis auf einem Client und 2 für eine Synchronisierung zwischen Clients). Dies ist begrenzt und unabhängig von der Anzahl der Peers im Netzwerk.
Um einen einzelnen Zeitpunkt zu verwenden, benötigen Sie das Diagramm der Zeitpunkte, die dazu führen. Aber soweit ich sehen kann, jeder Peer die in der Lage ist , zu wissen , von einem Zeitpunkt (es hat sich selbst erzeugt, oder durch eine anderen Peer erzeugt, oder hat sie von einem anderen Peer gesagt worden , wenn sie mit ihm zu synchronisieren) hat auch hat eine Gelegenheit, etwas über die Geschichte zu erfahren, die bis zu diesem Zeitpunkt geführt hat. Ich denke, es gibt wahrscheinlich einen induktiven Beweis dafür.
Da das Speichern und Synchronisieren der DAG explizit einfach erscheint: Wird dies in der Praxis verwendet? Wenn nicht, warum werden Vektoruhren bevorzugt?
Anmerkungen
Peer-To-Peer
Ich würde eine Peer-to-Peer-Lösung einer Client-Server-Lösung vorziehen.
Die wahrscheinliche Endtopologie sind viele Clients, die eine Verbindung zu einer viel kleineren Gruppe von Servern herstellen, die sich untereinander replizieren. Es wäre jedoch schön, eine allgemeine Lösung zu haben, die diese spezielle Topologie unterstützt, und keine Lösung, die diese spezielle Topologie erfordert.
quelle
Antworten:
Soweit ich weiß, verwenden Versionskontrollsysteme wie Git und Mercurial den DAG-Ansatz anstelle von Vektoruhren.
quelle
Schauen Sie sich das Konsensproblem an . Abhängig von Ihren Aufgabenanforderungen (wie viele Daten haben Sie, wie viele Synchronisierungsknoten, wie oft usw.) sind möglicherweise vorhandene Lösungen für dieses Problem (wie "Raft") für Ihren Fall geeignet.
Ein anderer (möglicherweise tangentialer) Ansatz für dieses Problem ist das Entwerfen einer CRDT .
quelle