DS201学習記録:Cassandraのパーティションについて

DS201: Foundations of Apache Cassandra™ and DataStax Enterprise の学習記録です。

パーティション (Partition)

Cassandraにおけるパーティションは、データを分散して格納するための基本的な概念です。Cassandraのテーブルは、1つまたは複数のパーティションで構成されており、各パーティションは一意のパーティションキーによって識別されます。

パーティションキーは、データをクラスター内のどのノードに配置するかを決定するための基準となります。パーティションキーの値に基づいてデータが物理的に分散されるため、適切なパーティションキーの設計は、Cassandraのパフォーマンスとスケーラビリティに直結します。

PRIMARY KEY とパーティションキー

CQL(Cassandra Query Language)でテーブルを定義する際、PRIMARY KEY を指定します。このプライマリキーの最初の列がパーティションキーとなります。

例: videos テーブルの定義例です。

cqlsh:killrvideo> DESCRIBE TABLE videos;

CREATE TABLE killrvideo.videos (
    video_id timeuuid PRIMARY KEY,
    added_date timestamp,
    title text
) WITH additional_write_policy = '99p'
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND memtable = 'default'
    AND crc_check_chance = 1.0
    AND default_time_to_live = 0
    AND extensions = {}
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair = 'BLOCKING'
    AND speculative_retry = '99p';

上記のテーブル定義では、PRIMARY KEY (video_id) と宣言されています。これにより、video_id 列がこのテーブルのパーティションキーとなります。

トークン (Token)

Cassandraは、パーティションキーのハッシュ値を計算し、そのハッシュ値(トークン)に基づいてデータをクラスター内のどのノードに配置するかを決定します。このプロセスは、パーティショナーによって管理されます。

token() 関数を使用すると、特定のパーティションキーのトークン値を確認できます。

cqlsh:killrvideo> SELECT token(video_id), video_id FROM videos;

 system.token(video_id) | video_id
------------------------+--------------------------------------
   -7805440677194688247 | 245e8024-14bd-11e5-9743-8238354b7e32

(1 rows)

クエリ結果の最初の列 "system.token(video_id)" は、video_id のトークン値を表しています。このトークン値は、Cassandra内部で使用されるパーティションキーのハッシュ値であり、データがどのノードに配置されるかを決定するために使われます。

適切なパーティションキーの設計

適切なパーティションキーの設計は、Cassandraの性能を最大限に引き出す上で非常に重要です。

  • 均等なデータ分散: データがクラスター全体に均等に分散されるように、カーディナリティ(値の種類)が高く、アクセスパターンが均一な列をパーティションキーに選ぶべきです。
  • ホットスポットの回避: 特定のパーティションにアクセスが集中する「ホットスポット」を避けるように設計する必要があります。
  • クエリの効率: ほとんどのクエリはパーティションキーを指定して行われるため、クエリパターンを考慮してパーティションキーを決定します。