2017-12-05 12 views
1

Cassandraがデータの完全性チェックを行っているとき、検証コンパクションを行いますが、これはどういう意味ですか?私は、修復が完了するまで一時的に保存される単一のSSTableを作成し、その単一のSSTableからMerkleツリーを生成することを理解しています。 Merkleツリーのいずれかが妥当性検査に失敗した場合、(妥当性検査圧縮中に作成されたSSTableからの)その葉を作成するために使用されたパーティションは、他のノードにストリーミングされます。 しかし、友人はMerkleの木はそれぞれ(以前から存在していた)SSTableから生成されたと私に言った。1つのSSTableからMerkleツリーが生成されていますか?

したがって、いくつのMerkleツリーがSSTableの1つまたはいくつか生成されますか?

答えて

3

この検証コンパクションは、範囲に含まれるすべてのステーブルを反復して、マーズツリーを構築します。それは実際に新しいsstableを書くのではないが、コンパクションインターフェースは同じタイプのタスク(データを繰り返す)を実行して再利用される。圧縮マネージャは、クリーンアップ、セカンダリインデックスの再構築、MVビルド、スクラビング、およびプロセスの検証にも使用されます。

単一のマーズツリーが生成されます。ノードの各ノードは、トークン範囲内のすべてのデータのハッシュを表し、ノードの各子はトークン範囲の半分です。ツリーの深さは動的です。理想的には、リーフはそれぞれ1つのパーティションを表しますが、ルートノードが多くのパーティションを含む広い範囲を表す場合は、さらに多くを表現できます。 Merkleツリーの深さは20に制限されているので(それ以外の場合は大きすぎて転送問題が発生する)、通常2^20または100万ものパーティションがある範囲を修復したくない。サブレンジ修復の範囲を細分する方法を選択するときに、これを決定するために、getsplitsまたはsize_estimatesテーブルを使用できます。

修理は多くのサブ修理を開始することができますが、それぞれは独自の検証コンパクション/メークルツリー/ストリーミングセッションを持ちます。

+0

したがって、リーフが検証に失敗した場合、ノードはストリーミングする必要があるデータをどこで読み取りますか?そのリーフを生成するために使用されたパーティションを見つけるためにすべてのSSTableを再読しますか? –

+1

これは、リーフが表す範囲のすべての現在のステーブルを取得し、それをストリームします。偶発的で不変なデータの性質のために、新しいsstablesがある場合。 sstablesはトークン順に並べ替えられているため、範囲の開始位置に右にジャンプすることができます。 –

+0

乾杯!最後の質問:)それは、SSTables自体をストリームしないのですか?私はそれが葉の範囲のすべてのSSTablesを読んで、データを(通常の読取り操作のように)クランチしてから、それを送信すると思いますか? –

関連する問題