論文 Merkle Search Trees Efficient State-Based CRDTs in Open Networks
- https://ieeexplore.ieee.org/document/9049566
- https://inria.hal.science/hal-02303490/document
- SRDS ‘2019
概要
-
State-based CRDTの状態を[Merkle Search Tree]で表現すると、キーの順序を維持しながら分散イベントストアを作れる
- 普通の2分木のMerkle Treeでは、木がうまくバランスするようにする再構築の過程で順序が破壊されるので、うまくいかない
- Vector Clock(Logical Clock)を使う方法では、線形に増えていってしまうので厳しい MSTのデータ構造
-
特徴
- アイテムの集合は、決定論的に一意な木の表現を持つ
- キーの順序は保持される
- ツリーは常にバランスが取れている(確率的) ←どういうこと?(kekeho)
-
Merkle Search Treeの構成
- MSTは、全順序の空間に含まれる要素の順序付き集合を作る
- 例: 連想配列
- 要素は、(値)に紐付けられたタグとなる。はキーの集合
- はデフォルト要素のを持つ。にキーが存在しないことを示すために用いられる。
- 予め、の順序が決定的に決まっているからできる。例えば、挿入時に順序付けをするような場合では一筋縄ではいかないんだろう(kekeho)
- 例: 連想配列
- MSTは、全順序の空間に含まれる要素の順序付き集合を作る
-
B-TreeライクなSearch Treeを作る(Fig. 1)
- Leafがレイヤ0
- レイヤにいるノードたちは、連続するアイテムのブロックであり、その境界はのアイテムに対応する
- MSTに格納される値は、そのハッシュを計算し、その値をベースレイヤに書き込む
- 書き込むレイヤは、のゼロのみで構成される最長の接頭辞の長さで決定される
- : Digestの空間サイズがとなるようなハッシュ関数
- SHA512ならBが512ということなんだと思う(kekeho)
- ポインタとして下レイヤのハッシュを書く
- 先頭ビットの0の数でレイヤを測る
- 各ノードのサイズは一定のサイズを持たない(普通のB-Treeはページサイズとかがあったはず?(kekeho))
-
操作の定義
- MSTをKVSとして扱うときの例
- : ツリーからキーに対応する値を読み取る
- : ツリーからキー範囲が ~ に含まれる値の集合を読み取る
- : ツリーのキーに値を書き込む
- : ツリーからキーを消す
- 非リーフ層で値の追加・削除が発生すると、Split・Mergeが発生する可能性がある。
- MSTをKVSとして扱うときの例
-
バランスと深さ
- あるアイテムがレイヤにある確率は
- レイヤのアイテム数は、レイヤの境界でSplitされるので、レイヤのノードは平均個の値が格納され、リーフでない層は個のノードを持つ
-
データセット比較の効率性
-
Merkle Search Trees as CRDT
- がCRDTであり、マージ操作( )を持つ
- 具体的にマージ操作をどう定義すればいいんだ? (kekeho)
- さすれば、で定義されるMSTはCRDTとなる
- 例: のG-set
- とすれば、OK
- たしかにねー(kekeho)
- がCRDTであり、マージ操作( )を持つ
アルゴリズム
- MSTはPersistent Data Structuresなので、分散MSTの構築もできる
アプリケーション: 分散イベントストア
- : イベント空間(Logical Clock or 実時間の近似値で並べられる)