1. ホーム
  2. algorithm

最終整合性で使用するMerkle Treesの説明

2023-08-24 23:57:47

質問

メルクルの木 は、分散され複製されたキー/値ストアにおいて、アンチエントロピーのメカニズムとして使用されています。

アンチエントロピーのメカニズムが良いものであることは間違いありません。 ただ、なぜ Merkle ツリー が一般的なアプローチである理由がよくわかりません。

  • 完全な Merkle ツリーをピアに送信するには、ローカルのキー スペースをそのピアに送信し、ツリーの最下層に格納されている各キー値のハッシュも一緒に送信する必要があります。 ツリーの最下層に格納されている各キー値のハッシュとともに、ローカルのキー スペースをその相手に送信します。

  • ピアから送信されたMerkleツリーを差分するためには、自分自身のMerkleツリーを持つことが必要です。

両方のピアがすでにソートされたキー/値-ハッシュ空間を持っている必要があるので、不一致を検出するために線形マージを行うのはどうでしょうか?

私は、維持費を考慮すると、ツリー構造が何らかの節約になるということに納得がいきません。 それは ツリーの葉の上の線形通過は、ワイヤ上の表現を直列化するためだけにすでに行われているという事実を考慮すると、ツリー構造が何らかの節約になるとは思えません。 .

これを解決するために、ノードがハッシュダイジェストの配列を交換できるようにすることが、藁人形的な代替案です。 これは、増分更新され、モジュロリング位置によってバケット化されます。

私は何を見逃しているのでしょうか?

どのように解決するのですか?

メルクルツリーは、同期する際のデータ転送量を制限します。一般的な前提は

  1. ネットワーク I/O は、ローカル I/O + ハッシュの計算よりも高価である。
  2. ソートされたキー空間全体を転送することは、いくつかのステップに渡って徐々に比較を制限するよりも高価です。
  3. キースペースは類似性よりも不一致の方が少ない。

Merkle Treeの交換はこのようになります。

  1. ツリーのルート (1 つのハッシュ値のリスト) から開始します。
  2. オリジンは現在のレベルのハッシュのリストを送信します。
  3. デスティネーションはハッシュのリストを自分のと照らし合わせて差分を取り 異なるサブツリーを要求します。もし 差分がなければ、リクエストは終了します。
  4. リーフノードに到達するまで、ステップ2と3を繰り返す。
  5. オリジンは、結果として得られるセットのキーの値を送信します。

典型的なケースでは、キー空間を同期させる複雑さはlog(N)になります。そう、極端な話、共通のキーがない場合、この操作はハッシュのソートされたリスト全体を送信することと同じになり、O(N) になります。書き込みがあったときに動的に Merkle ツリーを構築し、ディスク上にシリアライズされたフォームを保持することで、Merkle ツリーの構築費用を償却することができます。

DynamoやCassandraがどのようにMerkleツリーを使用するかは言えませんが、Riakはクラスタ内同期のためにそれらを使用することを止めました(ほとんどの場合、ヒンテッドハンドオフとリードリペアで十分です)。私たちは、いくつかの内部アーキテクチャのビットが変更された後、それらを後で追加する計画を持っています。

Riakに関するより多くの情報については、メーリングリストに参加することをお勧めします。 http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com