2017-03-15 7 views
2

残りのapiを使用して、cassandraでクエリを実行しています。カウントをフェッチすると、問題が発生しています。cassandraから矛盾したカウントを受け取る

私たちはcassandraクラスタを構築しました。最近、バックアップと復元を行い、すべてのデータを新しいクラスタにコピーしました。 テーブルに対してnodetoolを更新し、nodetoolの修復も行いました。

ただし、API呼び出しの一部が失敗し、矛盾した結果が返されています。

1)カウントクエリにはパーティションキーが含まれています。読んだタイムアウトやAPI呼び出しからのエラーは見られませんでした。

2)セッションを作成するコードがどのようになっているかを示します。

val poolingOptions = new PoolingOptions 
    poolingOptions 
     .setCoreConnectionsPerHost(HostDistance.LOCAL, 4) 
     .setMaxConnectionsPerHost(HostDistance.LOCAL, 10) 
     .setCoreConnectionsPerHost(HostDistance.REMOTE, 4) 
     .setMaxConnectionsPerHost(HostDistance.REMOTE, 10) 

val builtCluster = clusterBuilder.withCredentials(username, password) 
     .withPoolingOptions(poolingOptions) 
     .build() 
val cassandraSession = builtCluster.get.connect() 
val preparedStatement = cassandraSession.prepare(statement).setConsistencyLevel(ConsistencyLevel.QUORUM) 
cassandraSession.execute(preparedStatement.bind(args :_*)) 

クラスタ構成:

6台のマシン:3種

はカサンドラは、我々はApacheのカサンドラにcassandra-を使用して3.9バージョン

を使用している任意のマシン

を下になることはありません3.1.1バージョンのドライバコアアーティファクト

3)nodetoop tpstatsはエラーを表示しません。

4)cassandraのsystem.logに他の問題はありません。我々は、以下のような警告をほとんど見ない。

Maximum memory usage reached (512.000MiB), cannot allocate chunk of 1.000MiB 
WARN [ScheduledTasks:1] 2017-03-14 14:58:37,141 QueryProcessor.java:103 - 88 prepared statements discarded in the last minute because cache limit reached (32 MB) 

最初のapi呼び出しは0を返し、後でapi呼び出しが正しい値を返します。

他の詳細が必要な場合はお知らせください。

+0

あなたのテーブル構造とあなたは何のクエリを実行しているが何ですか? –

+0

私たちは4つの列を持つテーブルを持っています。そのうちの1つはパーティションキーであり、いくつかの列(日付列+テキスト列)がクラスタリングキーとして選択されています。クエリは次のようになります。 SELECT count(*)FROM table_name WHERE parition_column =? AND text_column_of_clustering_key =? AND date_column_of_clustering_key <=? AND date_column_of_clustering_key> =? – Srini

+0

あなたの複製戦略/要因は何ですか?そのテーブルへの書き込みにはどのような一貫性レベルが入りますか? –

答えて

1

は、使用カウンタ
count(*)は非常に非効率的である、COUNT(*)を使用しないでください。カッサンドラはあなたにカウントを与えるためにすべての行をスキャンする必要があります。巨大な量のデータを持っていれば、あなたはタイムアウト例外をスローすることができます。代わり

使用カウンタ:

カウンタが増分で変化する数を格納するために使用される特殊なカラムです。たとえば、カウンタ列を使用してページの表示回数をカウントすることができます。

のは、テーブルを定義してみましょう:

CREATE TABLE counter_test (
    pk int, 
    ctkey text, 
    cdkey date, 
    count counter, 
    PRIMARY KEY (pk, ctkey, cdkey) 
); 

は、カウンタの値を増やし:

UPDATE counter_test SET count = count + 10 WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

は、カウンタの値を小さく:

UPDATE counter_test SET count = count - 5 WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

は、の値を選択しますカウンタ:

SELECT * FROM counter_test WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

あなたが得るだろう:

pk | ctkey | cdkey  | count 
----+-------+------------+------- 
    1 | hi | 2017-03-16 |  5 

出典:https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

+0

このシナリオではカウンタが機能しないと思います。ダンプデータを更新するときに、データ量も非常に多くなります。毎回カウンタを更新するとパフォーマンスが低下し、実際には問題は解決されません。 – Srini