web-dev-qa-db-ja.com

Cassandra ttl on a row

Cassandraの列にTTLがあることを知っています。しかし、行にTTLを設定することも可能ですか?各列にTTLを設定しても、次のように問題が解決しません。使用事例:

ある時点で、プロセスはTTL(TTL 1週間)の行 "A"としましょう)の完全な行を削除したいと考えています。既存のすべての列を同じコンテンツで置き換えますが、1週間のTTLです。

しかしその行「A」で同時に実行されている別のプロセスが存在する可能性があります。このプロセスは、新しい列を挿入するか、TTL)なしで既存の列を置き換えます。行は削除されます(同時に実行されます!)。したがって、1週間後に、行「A」のすべての列がTTL)のために削除されます。ただし、これらの新しく挿入された列は除きます。それらは削除されます。

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

敬具
ステファン

15
snd

現在、TTLの行にCassandraを設定する方法はありません。TTLは、書き込み時に存続期間がわかっている場合に、個々の列を削除するように設計されています。

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

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

11
Richard

Cassandra 3を使用して、行のttlを設定できます。

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;
7
Mahesh Reddy

私はそのようなことをお勧めしませんが、問題を解決するためにCassandra wayがあります:

_SELECT TTL(value) FROM table WHERE ...;
_

最初に値の現在のTTLを取得し、次にその結果を使用して、INSERTまたはUPDATEでTTLを設定します:

_INSERT ... USING TTL ttl-of-value;
_

だから...私はSELECT TTL()が遅いと思います(私のCQLコマンドのいくつかでのTTL()とWRITETIME()の経験から)。それだけでなく、TTLは、選択結果がCassandraノードで生成される時点で正しいだけでなく、挿入が行われるまでに、次のようになります。オフ。Cassandraは存続時間 ..ではなく削除する時間を提供する必要がありました。

したがって、リチャードが述べたように、1週間後にデータを削除する独自のプロセスを持つ方がおそらく安全です。作成日またはデータが廃止された日付を保存するには、1つの列が必要です。次に、バックグラウンドプロセスがその日付を読み取ることができ、データが廃止されたと見なされた場合は、行全体を削除します。

他のプロセスもその日付を使用して、その行が有効と見なされるかどうかを知ることができます。 (したがって、まだ削除されていない場合でも、日付が過ぎていれば、行を無効と見なすことができます。)

1
Alexis Wilke