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