5

現在、100,000 を超える大量のデータ行を持つ cassandra 列ファミリがあります。ここで、この列ファミリーのすべてのデータを削除したいのですが、問題が発生しました:

すべてのデータが削除された後、この列ファミリーで検索クエリを実行すると、cassandra が空のクエリ結果を返すのに数十秒かかります。また、元のデータが大きいほど、時間コストは直線的に増加します

これは、Cassandra データベースからデータを削除する際のトゥームストーン機能が原因です。ルックアップ速度は、次の GC が起動されるまで通常に回復しません。Cassandra Distributed Deletesを参照してください。

私のシステムではこのようなクエリ操作が頻繁に使用されるため、最大数秒の巨大な遅延に耐えられません。

この問題の解決策を教えてください。

4

2 に答える 2

3

これは、データベースを使用する非常に悪い方法のように思えます。入れて、空にして、繰り返す。問題を解決する 1 つの方法は、毎回異なる CF 名を使用することです。たとえば、データを空にして再作成を開始し、新しい列ファミリーを作成してそれを使用し、他の列ファミリーを削除するだけですが、これはハッキーです。

問題を解決するには、コンパクション (検出できるすべてのトゥームストーンを削除する) を使用することをお勧めします。CPU を集中的に使用しますが、クエリが応答するまで数十秒待つよりはましです。圧縮したい特定の ks と cf を提供することで、マシンでのタスクの負荷を軽減できます。

./nodetool compact <ks_name> <cf_name>

Ritchard の指摘は良い点です。gc_grace_secondsはデフォルトで 10 日に設定されているため、おそらくこれを微調整して、トゥームストーンを削除する圧縮を可能にする必要があります。

于 2013-09-26T08:34:00.790 に答える
0

@ファイファイ

列ファミリーが頻繁に変更される場合(読み取り、更新、更新の再読み取り...)、レベル化された圧縮戦略を使用する必要があります。

削除された列をより迅速に削除するには、列ファミリーのプロパティgc_grace_secondsを変更します

于 2013-09-26T10:42:55.193 に答える