将来的には、質問ごとに 1 つの質問に制限するようにしてください。これらのほとんどすべてが、1 つの質問として独立している可能性があります。
- memtable の行は行キーで並べられているという記事がありますが、ハッシュテーブルのようなものであると書かれている記事がありますが、どちらが正しいですか?
Cassandra は、そのデータを (Strickland、2014 年) 「分散ハッシュ テーブル データ構造」に格納します。これにより、データをクラスター全体に均等に格納および分散しながら、すばやくクエリを実行できます。行キー (別名パーティション キー) の値は、Consitent Hashingと呼ばれるプロセスを使用してハッシュされます。その後、キーのハッシュ値を含むトークン範囲を担当するノードのクラスターにデータが保存されます。関数を使用して、句を指定せずに CQL クエリを実行するWHERE
と、結果セットの順序がハッシュされた行キー値の影響を受けることがわかりtoken()
ます。
> SELECT userid, token(userid), posttime FROM postsbyuser;
userid | token(userid) | posttime
--------+----------------------+--------------------------
1 | -4069959284402364209 | 2015-01-25 13:25:00-0600
1 | -4069959284402364209 | 2015-01-25 13:22:00-0600
0 | -3485513579396041028 | 2015-01-25 13:21:00-0600
2 | -3248873570005575792 | 2015-01-25 13:28:00-0600
2 | -3248873570005575792 | 2015-01-25 13:27:00-0600
2 | -3248873570005575792 | 2015-01-25 13:26:00-0600
- パーティショナーについて: cassandra には基本的に 2 つのパーティショナー (RandomPartitioner と ByteOrderedPartitioner) があるため、選択したパーティショナーに関連する memtable の行の順序はありますか? (たとえば、RP を選択した場合、行はハッシュテーブルのように格納され、BOP を選択した場合、行はキー順に並べ替えられますか?)
最終的には、はい、Random パーティショナーと Byte Ordered パーティショナーはリング上でデータを異なる方法で分散します。実際、Murmur3Partitioner であるデフォルトのパーティショナーがありません。Murmur3 パーティショナーには、Random パーティショナーと同じ目的があります。これは、データを均等に分散させることです。新しいクラスターでは、Murmur3 パーティショナーを使用する必要があります。この 2 つの違いについては、こちらで回答されています。スループットの観点からcassandraのランダムまたはMurmur3と、それらの違いは何ですか?
BOP は下位互換性のためにまだ含まれており、実際にはもう使用しないでください。BOP を避けるべき理由についても詳しく説明されています: Cassandra ByteOrderedPartitioner
- 行がキー順に並べられている場合、memtable は挿入をどのように処理しますか? (挿入により行が移動しますか?)
この DataStax ドキュメントからの抜粋更新の書き込みパス は、これを非常によく説明しています。タイトルは気にしないでください...挿入と更新は基本的に Cassandra と同じです。
更新はシーケンシャル I/O を使用してディスクにストリーミングされ、新しい SSTable に保存されます。更新中、Cassandra は書き込みパスを使用して列にタイムスタンプを付け、ディスクに書き込みます。更新中に memtable に列の複数のバージョンが存在する場合、Cassandra は新しいバージョンの列のみをディスクにフラッシュします。
ドキュメントThe Write Path to Compactionからのこの最後の抜粋は、この質問の最後の部分に答えます:
データをフラッシュするために、Cassandra は memtable をトークンでソートし、データをディスクに順番に書き込みます。
- Cassandra によって暗黙的に維持されるプライマリ インデックス (行キー インデックス) と何か関係がありますか?
私が質問を理解している場合、この Cassandra 1.1 ドキュメント ( About Indexes in Cassandra ) は少し古いかもしれませんが、RDBMS の対応物との比較とともにこれを説明しています。
Cassandra では、列ファミリーのプライマリ インデックスはその行キーのインデックスです。各ノードは、管理するデータのこのインデックスを維持します。
行は、クラスター構成のパーティショナーとキースペース構成のレプリカ配置戦略によってノードに割り当てられます。Cassandra のプライマリ インデックスを使用すると、行キーで行を検索できます。各ノードは、各ノードが管理するキーの範囲を認識しているため、関連するレプリカでのみ行インデックスをスキャンすることで、要求された行を効率的に見つけることができます。
これがあなたの質問に答えることを願っています。
参考文献:
Strickland R. (2014)。 カサンドラの高可用性。Packt Publishing Ltd. バーミンガム、英国。(pp. 19-24)。