1

Cassandra 2.2.3 で SELECT を実行するときの不可解な動作に対処しています。リングに 4 つのノードがあり、次のキースペース、テーブル、およびインデックスを作成します。

CREATE KEYSPACE IF NOT EXISTS my_keyspace
    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};

CREATE TABLE my_keyspace.my_table (
    id text,
    some_text text,
    code text,
    some_set set<int>,
    a_float float,
    name text,
    type int,
    a_double double,
    another_set set<int>,
    another_float float,
    yet_another_set set<text>,
    PRIMARY KEY (id, some_text, code)
) WITH read_repair_chance = 0.0
   AND dclocal_read_repair_chance = 0.1
   AND gc_grace_seconds = 864000
   AND bloom_filter_fp_chance = 0.01
   AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }
   AND comment = ''
   AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy' }
   AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
   AND default_time_to_live = 0
   AND speculative_retry = '99.0PERCENTILE'
   AND min_index_interval = 128
   AND max_index_interval = 2048;

CREATE INDEX idx_my_table_code ON my_keyspace.my_table (code);

次に、テーブルにいくつかの行を挿入します。それらのいくつかは空のセットを持っています。デフォルトの CQL クライアントを介してこのクエリを実行し、期待どおりの行を取得します。

SELECT * FROM my_table WHERE code = 'test';

次に、制御できないいくつかのテストを実行します。彼らが何をしているのかはわかりませんが、いくつかの行を読み取り、おそらく挿入/更新/削除すると思います。インデックス、テーブル、またはキースペースの設定を削除または変更しないと確信しています。

テストの後、デフォルトの CQL クライアントを介して再度ログインし、次のクエリを実行します。

SELECT * FROM my_table WHERE code = 'test';
SELECT * FROM my_table;
SELECT * FROM my_table WHERE id = 'my_id' AND some_text = 'whatever' AND code = 'test';

最初のものは何も返しません。2 番目の行は、code = 'test' の行を含むすべての行を返します。3 番目のクエリは、最初のクエリで取得できなかった予想される行を返します。

この行と他の行との唯一の違いは、前に説明したように、いくつかの空のセットを含む行の 1 つであるということです。いくつかの空のセットも含む別の行を照会すると、同じ動作が得られます。

問題はセカンダリインデックスに関連していると思います。どういうわけか、テスト中に実行された操作によって、インデックスが特定の行を表示できない状態のままになります。

私は明らかに何かが欠けています。この動作の原因について何か考えはありますか?

前もって感謝します。

アップデート:

問題を回避しましたが、別の場所で同じ問題を見つけました。問題が最初に発生したため、エラーの前に実行された操作について詳しく知りました。その列に TTL を設定する特定の列の更新です。いくつかの調査の結果、この問題に関連している可能性のある Jira の問題がいくつか見つかりました。

https://issues.apache.org/jira/browse/CASSANDRA-6782 https://issues.apache.org/jira/browse/CASSANDRA-8206

しかし、これらの問題は 2.0 と 2.1 では解決されているようで、私は 2.2 を使用しています。これらの変更は 2.2 に含まれていると思いますが、間違っている可能性があります。

4

2 に答える 2

1

主な問題は、Cassandra で実行しているクエリの種類です。Cassadra データ モデルはクエリ ドリブンであり、クエリを提供するためにテーブルが再計算されます。

テーブルは、明確に定義された主キー (パーティション キーとクラスタリング キー) を使用して作成されます。Cassandra は、全テーブル スキャン タイプのクエリには適していません。

今、あなたの質問に来ます。

  1. SELECT * FROM my_table WHERE code = 'test';

ここで使用される列は clustring 列であり、等値検索列はパーティション キーの一部である必要があります。Clustring キーは異なるパーティションに存在するため、読み取り整合性レベルが 1 の場合、空の結果が返される可能性があります。

  1. SELECT * FROM my_table;

Cassandra は、この種のテーブル スキャン クエリには適していません。ここでは、すべてのテーブルを検索し、すべての行を取得します (クエリが不十分です)。

  1. SELECT * FROM my_table WHERE id = 'my_id' AND some_text = 'whatever' AND code = 'test';

ここですべてを言及したので、正しい結果が返されました。

于 2016-08-08T10:07:48.680 に答える