1

Cassandra での次のクエリの実行パスは何ですか: - トークン 1 (Node1) を持つ 1 つの Cassandra ノードから 5 行 - トークン 2 (Node2) を持つ 1 つの Cassandra ノードから 5 行 - トークン 3 (Node3) を持つ 1 つの Cassandra ノードから 5 行)

クライアントがクエリを Node1 に送信します。- このクエリが 3 つのノードで実行される順序は? - Node1 はこのクエリを node2 と node3 にどのように伝達しますか? - ノード 1 は、ノード 2 とノード 3 の行をマージして、完全なクエリ結果を提供しますか?

4

1 に答える 1

4

複数のパーティションからデータを取得するために発行できるクエリには 2 種類あります (ここでは CQL 用語を使用します。パーティションは以前は行と呼ばれていました)。どちらを使用するかは、パーティション キーを知っているかどうかによって異なります。

クラスタリング キーを持たない単純なスキーマを想定します。

CREATE TABLE mytable (key text PRIMARY KEY, field text);

パーティションキーがわからない場合は、発行できます

SELECT * FROM mytable LIMIT 15;

これにより、パーティションのハッシュ順に並べられた最初の 15 行が返されます。ハッシュによって順序付けられるため、このようなクエリは通常、すべてのデータをページングする場合にのみ役立ちます。

クエリを受信したノード (このクエリのコーディネーター) は、まずトークンとレプリカが最も低いノードにクエリを転送します。最大 15 行が返されます。少ない場合、コーディネーターは 2 番目に低いトークンとレプリカを持つノードに転送します。これは、15 行が見つかるまで、またはすべてのノードに接続されるまで発生します。したがって、このクエリは、クラスター内のすべてのノードに接続する可能性があります。

複製係数が 1 より大きい場合、矛盾する結果が返される可能性があります。コーディネーターはタイムスタンプを見て結果をマージし、最新のものだけをクライアントに返します。

パーティションキーがわかっている場合は、使用できます

SELECT * FROM mytable WHERE key in ('key1', 'key2');

コーディネーターは、これを別のクエリを受け取るのと同じように扱います。

SELECT * FROM mytable WHERE key = 'key1';
SELECT * FROM mytable WHERE key = 'key2';

各キーのデータを保持するノードにメッセージを転送します。キーごとに 1 つあるため、これらのクエリは並行して実行されます。応答はコーディネーターで収集され、最新のものだけが残るようにマージされ、クライアントに送信されます。

于 2013-09-05T09:10:30.717 に答える