ブルームフィルター
読み取りパスでは、Cassandra はディスク上のデータ(SSTable 内)と RAM 内のデータ(memtable 内)をマージします。要求されたパーティションについてすべての SSTable データファイルをチェックすることを避けるために、Cassandra はブルームフィルターとして知られるデータ構造を採用しています。
ブルームフィルターは、Cassandra が次の 2 つの可能性のある状態のいずれかを判断できる確率的データ構造です。- データは指定されたファイルには絶対に存在しない、または - データはおそらく指定されたファイルに存在する。
ブルームフィルターは、データが指定された SSTable に存在することを保証することはできませんが、より多くの RAM を消費できるようにすることで、より正確にすることができます。演算子は、bloom_filter_fp_chance
を 0 から 1 の間の浮動小数点数に調整することにより、テーブルごとにこの動作を調整できます。
bloom_filter_fp_chance
のデフォルト値は、LeveledCompactionStrategy を使用するテーブルの場合は 0.1 であり、それ以外の場合は 0.01 です。
ブルームフィルターは RAM に格納されますが、オフヒープに格納されるため、演算者は最大ヒープサイズを選択する際にブルームフィルターを考慮すべきではありません。精度が向上するにつれて (bloom_filter_fp_chance
が 0 に近づくにつれて)、メモリ使用量は非線形に増加します。bloom_filter_fp_chance = 0.01
のブルームフィルターは、bloom_filter_fp_chance = 0.1
の同じテーブルよりも約 3 倍のメモリを必要とします。
bloom_filter_fp_chance
の一般的な値は、通常、0.01 (1%) から 0.1 (10%) の偽陽性率の間です。これは、Cassandra が行の SSTable をスキャンし、ディスクに存在しないことが判明する可能性があることを意味します。パラメーターはユースケースによって調整する必要があります。
-
より多くの RAM と低速なディスクを使用するユーザーは、過剰な IO 操作を避けるために、
bloom_filter_fp_chance
を数値的に低い値 (0.01 など) に設定するとメリットがある可能性があります。 -
RAM が少なく、ノード密度が高い、または非常に高速なディスクを使用するユーザーは、過剰な IO 操作を犠牲にして RAM を節約するために、より高い
bloom_filter_fp_chance
を許容できる場合があります。 -
読み取りがほとんどない、またはデータセット全体をスキャンすることによってのみ読み取りを実行するワークロード (分析ワークロードなど) では、
bloom_filter_fp_chance
を大幅に高い数値に設定しても問題ありません。
変更
ブルームフィルターの偽陽性率は、DESCRIBE TABLE
出力に bloom_filter_fp_chance
フィールドとして表示されます。演算子は、ALTER TABLE
ステートメントを使用して値を変更できます。
ALTER TABLE keyspace.table WITH bloom_filter_fp_chance=0.01
ただし、この変更はすぐには適用されないことに注意する必要があります。ブルームフィルターはファイルが書き込まれるときに計算され、SSTable のフィルターコンポーネントとしてディスクに永続化されます。ALTER TABLE
ステートメントを発行すると、ディスク上の新しいファイルは新しい bloom_filter_fp_chance
で書き込まれますが、既存の sstable はコンパクションされるまで変更されません。演算子が bloom_filter_fp_chance
の変更を有効にする必要がある場合は、nodetool scrub
または nodetool upgradesstables -a
を使用して SSTable の書き換えをトリガーできます。どちらもディスク上の sstable を再構築し、その過程でブルームフィルターを再生成します。