2013-05-14 26 views
11

私はCassandraの列にTTLがあることを知っています。しかし、行にTTLを設定することも可能ですか?Cassandra ttl on row

ある時点で、プロセスはTTLを持つ完全な行を削除することを望んでいます(1行のTTLで行 "A"としましょう)。各行にTTLを設定しても問題は解決しません。 )。これは、既存のすべての列を同じ内容で置き換えて1週間のTTLで置き換えることで可能です。

しかしそのプロセスは、行が削除されることを知ることができないので、それが同時に実行されます(新しい列を挿入またはTTLせずに、既存のものを置き換え、その行「A」上で同時に実行している別のプロセスがあるかもしれません! )。したがって、1週間後、行「A」のすべての列は、これらの新たに挿入された列を除いてTTLのために削除されます。また、私はそれらを削除したい。

このケースではカサンドラのサポートがありますか、それとも自分で何かを実装する必要がありますか?

種類よろしく

ステファン
+0

を使用してカサンドラ3行のTTLを設定することができ、私たちは本当に行のすべてのデータのTTLは必要ありません。私たちの議論で分かるように、将来の所与のタイムスタンプ(すなわち1週間)まですべてのデータを削除し、1つの列にttlを有することで十分である。 – std

答えて

10

現在のCassandraの行にTTLを設定する方法はありません。 TTLは、書込み時の寿命がわかっている個々の列を削除するために設計されています。

1週間のTTLを挿入して1週間後に実行し、その行を削除するのではなく、プロセスを遅らせることで、必要なものを達成できます。行の削除には次の意味があります。直前に挿入された列は削除されますが、直後に挿入された列は削除されません。

将来挿入される列を削除する必要がある場合は、将来的にタイムスタンプ付きの行削除を挿入することができますが、これを確実にするためには注意してください。後でその行に挿入する場合その列に書き込まれると(墓石がガベージコレクションされるまで)列が消えてしまいます。

+0

今後のタイムスタンプでの削除の考え方は面白いです。しかし、悲しいことに私は挿入されるかもしれないすべての列の名前を知らない。 – std

+0

行の削除を使用する場合、列の名前を知る必要はありません。 – Richard

+0

Aaah、ok :)私はちょうどそれをチェックしました。私はこれがうまくいくかどうか分からなかった。 私たちはそれを次のように使用します: 将来(1週間)のタイムスタンプを持つ行を削除し、同じタイムスタンプとその直後に期限切れのTTLを持つDELETED-Markerを挿入します。 今後の削除でも、並行プロセスから更新が削除され、DELETED-Markerによって他のユーザーが削除された行に挿入されることはありません。 DELETED-Markerが期限切れになった後、その行を再度使用することができます。ニース。そのヒントをありがとう。 – std

1

私はカサンドラ方法は、問題を解決するために存在し、そのようお勧めしませんが:

SELECT TTL(value) FROM table WHERE ...; 

は、INSERTにTTLを設定するために、結果を使用し、その後、最初の値の現在のTTLを取得します。またはUPDATE:

INSERT ... USING TTL ttl-of-value; 

だから...私はSELECT TTL()は(TTL()と私のCQLコマンドの一部でWRITETIME()の経験から)遅いと思います。それだけでなく、選択結果がCassandraノードで生成された時点でTTLが正しいのですが、挿入が行われるまでにはTTLはオフになります。リチャードで述べたようにカサンドラだから...

をを削除するのではなくを生きる時間に時間を提供している必要があり、1週間後にデータを削除するために、独自のプロセスを持つことは、おそらく安全です。作成日またはデータが古くなった日付を保存する列が1つ必要です。その後、バックグラウンド・プロセスはその日付を読み取ることができ、データが古くなったと見なされる場合は、行全体をドロップします。

他のプロセスも、その行が有効かどうかを知るためにその日付を使用することができます。 (したがって、まだ削除されていなくても、日付が渡された場合でも行を無効として表示できます。リチャードへの答えで述べたように)

4

あなたは

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10; 
+1

質問者の利用事例には役立たない。列を更新すると、ttlが変更されます(更新クエリでttlを指定しない場合はnullになります)。その結果、ttlの満了後に列が更新された行が存在します。 –