2017-12-07 13 views
2

デザイン上の理由からTTLがカウンターで利用できないことを知っています。これについてはhttps://issues.apache.org/jira/browse/CASSANDRA-2103とその他のよくある質問がありますが、私は完全にもっともらしいものを紛失しています):カッサンドラとカウンタータイプで古いデータをクリーニングする

カサンドラのカウンターの有効期限はどのようにエレガントに扱いますか?

例の使用例:特定の日のページビュー。我々は

がTABLEのページビュー(ページvarchar型、日付varchar型、カウンタビュー、PRIMARY KEY(ページ、日付))CREATEのようなテーブルがあるかもしれません。このため

1年後に私たちが特定の1日に持っていたビューの数はそれほど関連性がありません(代わりにビュー/月テーブルなどに集約されている可能性があります)私たちのデータベースに何の理由もありません。通常、これにTTLを入れて、Cassandraが私たちのためにそれを扱えるようにします - エレガント!しかし、カウンターテーブルにTTLを使用することはできません。これはオプションではありません。

whereキーで両方のキーを定義する必要があるため、pageviewsからdate> 'xxxx'のdeleteを実行することはできません。 最初にすべてのページを照会してから、個々の削除を発行する必要があります。これはスケーラブルではありません。 これを達成するための適切な方法はありますか?

答えて

1

その大幅遅くなりますが、thatsのちょっと価格あなたは期限を自分で管理したい場合はいけない - あなたはLWTsを使用して、実際にカウンタを更新するのではなく、TTL'd列を挿入することができます。すなわち:

UPDATE pageviews USING TTL 604800 
    SET views = *12* 
    WHERE page = '/home' AND date = YYYY-MM-DD 
    IF views = *11* 

それが失敗した場合は、再読み込みして、もう一度試してください:

CREATE TABLE pageviews (
    page varchar, 
    date timestamp, 
    views int, 
    PRIMARY KEY(page, date)) 
WITH compaction = {'class': 'LeveledCompactionStrategy'}; 

は、ページビューを更新します。これは競合が高ければ非常に遅くなる可能性がありますが、アプリごとにバッチ処理を行うことができます.10秒ごとに更新を更新し、一度に1つずつ増やします。

合計の日付範囲を表示するには:

SELECT sum(views) FROM pageviews WHERE page='/home' and date >= '2017-01-01 00:00:00+0200' AND date <= '2017-01-13 23:59:00+0200' 

最も速いアプローチは、カウンターを使用し、あまりビジー状態ではなく、X日より古いものを削除するジョブを使用することです。

%エラーが発生した場合は、1ページあたり1つのカウンタを使用し、forward decayを使用して古いビューの増分を「有効期限切れにする」ことができます。ただし、定期的にランドマークを調整するジョブが必要です。これは範囲を見るのに有用ではないでしょう、そして、あなたに "これまでの合計"の見積りだけを与えます。

+0

ありがとうございます。まあ、私が言及したように仕事の清掃の問題は、ページIDを知っていなければならないということです。つまり、それらをすべて覚えておく必要があります。私の場合はどれが巨大なことができますか?あなたは、日付> = 'xxx'のページビューから削除するだけではいけません。私はこれがcassandraに対する厳しい制限であり、ttlとcounterの行を使用する正当なユースケースがあるように感じます。いくつかのテストを実行した後、プライマリキーでdistinctを選択すると、実際にはかなり速くなります。一定期間にわたって発行されるdelete文の量が指数関数的に増加するだけです。 – asteck007

0

日付範囲クエリを必要としない場合は、page % X, dateのパーティションキーとpageのクラスタリングキーを使用できます。

次に、破棄する日付ごとに、X delete文でパーティション0からX-1を削除できます。

関連する問題