Cassandraにおけるパーティションキー、コンポジットキー、クラスタリングカラム

Cassandraにおけるパーティションキー、コンポジットキー、クラスタリングカラム

  • オーケストレーション
6分で読めます 更新日 Jan 21, 2019

ポイント: Cassandraにおけるパーティションキー、コンポジットキー、およびクラスタリングカラムの違いが説明されており、それぞれのデータ整理における役割が強調されています。パーティションキーはデータの保存場所を決定し、クラスタリングカラムはパーティション内のデータの順序を効率的にアクセスできるようにします。

  • パーティションキーは、ノード間のデータ分散に重要です。
  • コンポジットキーは、複数のカラムでパーティションを定義できます。
  • クラスタリングカラムは、パーティション内のデータ取得順序を最適化します。

ここでは、Cassandraにおけるパーティションキー、コンポジットキー、およびクラスタリングキーの違いを説明します。

簡単に言うと、各テーブルには一意のプライマリキーが必要です。最初にリストされるフィールドはパーティションキーであり、そのハッシュ値がデータを格納するノードを決定するために使用されます。それらのフィールドが括弧で囲まれている場合、パーティションキーはコンポジットです。そうでない場合、最初のフィールドがパーティションキーです。パーティションキーの後にリストされるフィールドはクラスタリングカラムと呼ばれます。これらは、類似の値を迅速に取得するために、パーティション内で昇順または降順にデータを格納します。すべてのフィールドを合わせてプライマリキーになります。

ここでデータのパーティショニングについて議論しました。

クラスタリングカラム

クラスタリングカラムは、パーティション内のデータの順序を決定します。

クラスタリングカラムを持つ理由は何ですか?Cassandraのようなカラム指向データベースの目的は、隣接するデータレコードを隣り合わせに配置して迅速な取得を実現することです。

通常のRDBMSデータベース(Oracleなど)では、各行がすべての値を格納します。空の値も含まれます。しかし、カラム指向データベースでは、1つの行にカラム(a,b,c)があり、別の行(a,b)や単独の行(a)を持つことができます。したがって、値aのみに興味がある場合、その値を同じデータセンター、ラック、またはドライブに格納して迅速に取得できるようにするのはなぜでしょうか?SQLの選択文は部分集合を作成することを忘れないでください。したがって、カラム指向のアプローチは、主要なデータ構造を部分集合の一種にします。

このアプローチは論理的です。なぜなら、通常、同時にデータの一部にのみ関心があるからです。たとえば、従業員の税ID、給与、マネージャーの名前を取得する必要がある場合、名前と電話番号のみを取得したいのです。

例

書籍を見てみましょう。ISBNは出版社によって使用される書籍のシリアル番号です。これらは一意であるべきです。しかし、これらの例のために一意である必要がないと仮定しましょう。

書籍のキースペース、テーブルを作成し、データをいくつか入れます。(キースペースについてはこちらで議論しました。)

プライマリキーはPRIMARY KEY (isbn, author, publisher)であることに注意してください。この場合、isbnはパーティションキーであり、著者と出版社はクラスタリングキーです。本のコレクションでは、著者ごとに保存し、その後出版社によって保存することが望ましいでしょう。

    CREATE KEYSPACE books
       WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1};

CREATE TABLE books (
   isbn text,
   title text,
   author text,
  publisher text,
   category text,
   PRIMARY KEY (isbn, author, publisher)
);

insert into books (isbn, title, author, publisher, category) values ('111', 'Fishing', 'Fred', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Sailing', 'Sally', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Archery', 'Fred', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Boating', 'Joe', 'Penguin Group', 'Sports');

プライマリキー内のすべての値は一意でなければならないため、著者のフレッドが出版したペンギングループで複数の本を書いたため、1つのレコードが削除されました。

次に、パーティションキーとプライマリキーを選択します。それらはすべて同じです。すべてを同じ仮想ノードに格納したいからです。

    select token(isbn), isbn from books;

 system.token(isbn)  | isbn
---------------------+------
 -175843201295106731 |  111
 -175843201295106731 |  111
 -175843201295106731 |  111

次に、すべてのレコードを選択し、データがパーティションキー111内で著者と出版社によってソートされていることに注意してください。

    select * from books;

 isbn | author | publisher     | category | title
------+--------+---------------+----------+---------
  111 |   Fred | Penguin Group |   Sports | Archery
  111 |    Joe | Penguin Group |   Sports | Boating
  111 |  Sally | Penguin Group |   Sports | Sailing

次に、別のレコードを追加しますが、別のプライマリキー値を与えます。これにより、異なるパーティションに格納される可能性があります。どの仮想ノードに格納されるかは、仮想ノードに割り当てられたトークン範囲によって異なります。

    insert into books (isbn, title, author, publisher, category) values ('333', 'Trees', 'Charles Darwin', 'Hachette', 'Nature');


insert into books (isbn, title, author, publisher, category) values ('333', 'Trees', 'Charles Darwin', 'Amazon', 'Nature');

再度、データがクラスタリングカラムの著者と出版社でソートされていることに注意してください。そして、トークンは333のプライマリキー値に対して異なります。

パーティショナは、cassandra.yamlで構成されている関数がハッシュ値を計算し、パーティショナに基づいてデータを分配することを思い出してください。デフォルトはorg.apache.cassandra.dht.Murmur3Partitionerです。

    select token(isbn), isbn, author, publisher from books;

 system.token(isbn)  | isbn | author         | publisher
---------------------+------+----------------+---------------
 -175843201295106731 |  111 |           Fred | Penguin Group
 -175843201295106731 |  111 |            Joe | Penguin Group
 -175843201295106731 |  111 |          Sally | Penguin Group
 7036029452358700311 |  333 | Charles Darwin |        Amazon
 7036029452358700311 |  333 | Charles Darwin |      Hachette

コンポジットキー

これは、パーティションキーの計算に使用される複数のカラムを持つテーブルです。これを次のように括弧で示します:PRIMARY KEY ((isbn, author), publisher)。この場合、isbnと著者がパーティションキーであり、出版社がクラスタリングキーです。

    drop table books;

CREATE TABLE books (
   isbn text,
   title text,
   author text,
  publisher text,
   category text,
   PRIMARY KEY ((isbn, author), publisher)
);

insert into books (isbn, title, author, publisher, category) values ('111', 'Fishing', 'Fred', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Sailing', 'Sally', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Archery', 'Fred', 'Penguin Group', 'Sports');

insert into books (isbn, title, author, publisher, category) values ('111', 'Boating', 'Joe', 'Penguin Group', 'Sports');

パーティションキー値を表示するには、SQLのtoken関数を使用し、isbnと著者の両方の値を与えます:

    select token(isbn,author), isbn from books;

 system.token(isbn, author) | isbn
----------------------------+------
         725505645253967381 |  111
         960809148155353310 |  111
        5462216525918432145 |  111

上記のデータを挿入SQL文で追加します。このデータを追加すると、一人の著者が同じISBNで複数の本を書いたため、1冊の本が削除されることにも注意してください。定義上、プライマリキーは一意でなければなりません。それにはクラスタリングカラムも含まれます。複合キーで変更したのは、パーティションキーの計算と、データが格納される場所だけです。

    select * from books;

 isbn | author | publisher     | category | title
------+--------+---------------+----------+---------
  111 |   Fred | Penguin Group |   Sports | Archery
  111 |    Joe | Penguin Group |   Sports | Boating
  111 |  Sally | Penguin Group |   Sports | Sailing

これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも表すものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。