Erklären Sie Merkle Trees für die spätere Konsistenz


79

Merkle Trees werden als Anti-Entropie-Mechanismus in mehreren verteilten, replizierten Schlüssel- / Wertspeichern verwendet:

Zweifellos ist ein Anti-Entropie-Mechanismus eine gute Sache - vorübergehende Fehler treten einfach in der Produktion auf. Ich bin mir nur nicht sicher, warum Merkle Trees der beliebte Ansatz sind.

  • Das Senden eines vollständigen Merkle-Baums an einen Peer umfasst das Senden des lokalen Schlüsselraums an diesen Peer zusammen mit Hashes jedes Schlüsselwerts, die in den untersten Ebenen des Baums gespeichert sind.

  • Um einen von einem Kollegen gesendeten Merkle-Baum zu unterscheiden, muss ein eigener Merkle-Baum vorhanden sein.

Da beide Peers bereits über einen sortierten Schlüssel- / Wert-Hash-Bereich verfügen müssen, können Sie eine lineare Zusammenführung durchführen, um Diskrepanzen zu erkennen.

Ich bin einfach nicht davon überzeugt, dass die Baumstruktur Einsparungen bietet, wenn Sie die Unterhaltskosten berücksichtigen, und die Tatsache, dass lineare Übergänge über die Baumblätter bereits durchgeführt werden, um die Darstellung über den Draht zu serialisieren .

Um dies zu begründen, könnte eine Strohmann-Alternative darin bestehen, dass Knoten Arrays von Hash-Digests austauschen, die schrittweise aktualisiert und durch die Modulo-Ringposition eingeteilt werden.

Was vermisse ich?


2
Merkle-Bäume haben jetzt ein eigenes Thema auf Wikipedia: en.wikipedia.org/wiki/Merkle_tree
Trenton

Antworten:


88

Merkle-Bäume begrenzen die beim Synchronisieren übertragene Datenmenge. Die allgemeinen Annahmen sind:

  1. Netzwerk-E / A ist teurer als lokale E / A +, die die Hashes berechnen.
  2. Das Übertragen des gesamten sortierten Schlüsselbereichs ist teurer als das schrittweise Einschränken des Vergleichs über mehrere Schritte.
  3. Die Schlüsselräume weisen weniger Diskrepanzen als Ähnlichkeiten auf.

Ein Merkle Tree Austausch würde so aussehen:

  1. Beginnen Sie mit der Wurzel des Baums (eine Liste mit einem Hashwert).
  2. Der Ursprung sendet die Liste der Hashes auf der aktuellen Ebene.
  3. Das Ziel unterscheidet die Liste der Hashes von seiner eigenen und fordert dann unterschiedliche Teilbäume an. Wenn es keine Unterschiede gibt, kann die Anforderung beendet werden.
  4. Wiederholen Sie die Schritte 2 und 3, bis die Blattknoten erreicht sind.
  5. Der Ursprung sendet die Werte der Schlüssel in der resultierenden Menge.

Im typischen Fall ist die Komplexität der Synchronisierung der Schlüsselräume log (N). Ja, im Extremfall, wenn keine Schlüssel gemeinsam sind, entspricht die Operation dem Senden der gesamten sortierten Liste von Hashes, O (N). Man könnte die Kosten für das Erstellen von Merkle-Bäumen amortisieren, indem man sie dynamisch erstellt, wenn Schreibvorgänge eingehen, und das serialisierte Formular auf der Festplatte belässt.

Ich kann nicht darüber sprechen, wie Dynamo oder Cassandra Merkle-Bäume verwenden, aber Riak hat sie nicht mehr für die Synchronisation innerhalb des Clusters verwendet (in den meisten Fällen sind angedeutete Übergabe und Lesereparatur ausreichend). Wir haben vor, sie später wieder hinzuzufügen, nachdem sich einige interne Architekturelemente geändert haben.

Für weitere Informationen über Riak empfehlen wir Ihnen, sich der Mailingliste anzuschließen: http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com


1
Ahh, der Hin- und Her-Austausch war das, was mir fehlte. Vielen Dank.
Johnny Graettinger

4
Sie wurden in der AAE-Implementierung von Riak 1.3 wieder eingeführt.
Coderoshi
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.