私のアクセスパターンはそれらを避けるべきであるが、なぜCassandra Tableの多くの墓石を読んでいますか
質問
私はこれがCassandraを使用するための最良の方法ではないことを知っていますが、私のデータの種類は先週からすべてのデータを読む必要があります。ただし、CQL3でコレクションタイプを使用する場合は、通常の日付範囲クエリを妨げる特定の制限になりました。
だから私は次の表
でCassandra(現在は単一のノード、おそらく将来もっと単一のノード)を設定しましたCREATE TABLE cache (tag text, id int, tags map<text,text>,
PRIMARY KEY (tag, id) );
ALTER TABLE cache WITH GC_GRACE_SECONDS = 0;
.
私は1週間のTTLを挿入してキャッシュからアイテムを自動的に削除しています。
私はこの記事古いデータの読みを避けることを避けるために他の場所で持続することによって多くの墓石を読むことを避けるために、多くの墓石を読むことを避けるために:
SELECT * FROM cache WHERE tag = ? AND id >= ?
.
IDは基本的には常に増加している、すなわち時間の経過とともに高い値を挿入し、テーブルから常に古いIDを削除します。
しかし、私はまだしきい値が到達している警告を受ける
WARN 08:59:06,286 Read 5001 live and 5702 tombstoned cells in cache (see tombstone_warn_threshold)
.
および私が手動圧縮/スクラブを定期的に実行しない場合は、例外やクエリが失敗します。
しかし、記事や文書からの私の理解に基づいて、ここですべての墓石がタグの平等を照会するのであれば、私はほとんどをタグのために照会することを避けてください。 Cassandraはほとんどの墓石の後に初めて読み始めるので、なぜまだ墓石の警告/例外が報告されているのですか?
解決
MAP K / V PAEは実際には列(名前、値、タイムスタンプ)です。そのため、Map要素の多くの削除を発行している場合(TTLによる有効期限も場合です) - これはこれのソースです。警告。まだ完全な地図を読んでいるので(それらの中にたくさんの墓石付き)。また、MAPのTTL設定は要素ごとに適用されます。
secondには、Selectクエリの>=述語を掛けます。
この場合、データアクセスパターンを改造してEQリレーションのみを使用して「クエリとバンプid
」をもっと頻繁に使用する必要があります。また、このアクセスパターンでは、主キーの一部をクラスタリングすることを取り除くことができます。
だから、そのマップでたくさんの削除を発行しない場合は、tag text, time timeuuid, name text, data text
モデルを使用して時間ごとに正確にスライスするようにしてください。