最近、私はCassandraに慣れようとしていますが、データが削除された後にいつディスクからデータが削除されるのかはよく分かりません。私が特に興味を持っているユースケースは、DTCSで時系列データを期限切れにすることです。例として、以下の表を考えてみます。カッサンドラはいつ削除された後にデータを削除しますか?
CREATE TABLE metrics (
metric_id text,
time timestamp,
value double,
PRIMARY KEY (metric_id, time),
) WITH CLUSTERING ORDER BY (time DESC) AND
default_time_to_live = 86400 AND
gc_grace_seconds = 3600 AND
compaction = {
'class': 'DateTieredCompactionStrategy',
'timestamp_resolution':'MICROSECONDS',
'base_time_seconds':'3600',
'max_sstable_age_days':'365',
'min_threshold':'4'
};
私はカサンドラは、24時間(86400秒)の後に、このテーブルに挿入されたすべての行のための墓石を作成することを理解しています。これらの墓石は、まずメモリ内のMemtableに書き込まれ、Memtableが特定のサイズに達するとSSTableとしてディスクにフラッシュされます。私の質問は、現在期限切れになっているデータをいつディスクから削除するのかということです。データを含むSSTableが次に圧縮されるのはいつですか?したがって、DTCSとmin_threshold
が4に設定されている場合、少なくとも3つの他のSSTableが期限切れのデータと同じ時間枠になるまで待ってから、それらのSSTablesはSSTableに圧縮されます。この圧縮中にデータが削除されますか?これは、カサンドラが、新しい墓石が圧縮されている古いSSTablesにはない可能性が高いため、行が削除されたメタデータを維持することを要求しているようです。
また、削除するデータの有効期限切れのデータを含むSSTablesで廃棄記号を含むSSTablesを圧縮する必要がありますか?これは、古い賞味期限のデータで新しい墓石が圧縮されるのを待っているので、期限切れのデータを保持しているカサンドラに帰結する可能性があります。
最後に、私はまた、墓石自体が取り除かれたときには不安でした。私はCassandraがgc_grace_seconds
の後までそれらを削除しないことを知っていますが、期限切れのデータが削除されたことを確かめるまで、墓石は削除できません。そうしないと、有効期限切れのデータが有効であると見なされます。その結果、墓石が削除される時の問題は、上記の質問に密接に結びついているように思えます。ありがとう!
私はバージョン2.0.15を自分で試してみました。
ありがとう、ウィル!2番目の点を明確にするために、期限切れのデータは、それが圧縮されている他のSSTablesに廃棄墓石が含まれているかどうかにかかわらず、その中のSSTableが圧縮されると削除されますか?その場合、Cassandraは削除するデータを知るためにSSTableの外で削除された行を追跡する必要があります。また、DTCSでは、他の3つのSSTableがSSTableと同じ時間枠内にあり、期限切れのデータが圧縮されるまで待つ必要がありますか?もしそうなら、24時間以上かかることがあるようです。 – jeromefroe
あなたの2つのケースは実際には1つです。大きな圧縮は 'gc_grace_seconds'を超えたすべての削除されたデータを削除します。 [このスレッド](http://stackoverflow.com/questions/23346698/should-compaction-within-gc-grace-seconds-preserve-tombstones/23361873#23361873)も参照してください。 – Ralf
こんにちはラルフ、助けてくれてありがとう!私は、しかし、マイナーコンパクションにもっと関心があります。大きな圧縮では、Cassandraはすべてのデータを圧縮しているため、期限切れのデータを含むSSTableと、墓石を持つSSTableは必然的に圧縮されます。ただし、小さな圧縮では、SSTablesがDTCSがそれらをまとめてコンパイルするのと同じ時間ウィンドウにない可能性があるため、これは当てはまりません。 – jeromefroe