DS201: Foundations of Apache Cassandra™ and DataStax Enterprise の学習記録です。
Ringとは
Cassandraのアーキテクチャは、複数のノードで形成されるクラスターを基盤としています。その中心にあるデータ構造が**リング(Ring)**です。リングは、クラスター内でデータがどのように各ノード間で分散されるかを管理する役割を担っています。
データの分散と配置
Cassandraは、全てのデータをパーティションに分割し、それぞれのパーティションに一意のトークンを割り当てます。これらのトークンは、リングと呼ばれる仮想的な円周上に配置されます。リングは、全ての可能なトークン値の範囲を視覚化したものと考えることができます。
各ノードは、このリング上の特定の範囲のトークンを「所有」しています。ノードが所有するトークン範囲に対応するデータの一部を格納することにより、どのデータがどのノードに存在するかが決定され、データがクラスター全体に均等に分散されます。
スケーラビリティと耐障害性
リング構造は、ノードの追加や削除が行われた際にも、データの再分配を最小限に抑えるように設計されています。
- ノードの追加: 新しいノードが追加されると、そのノードはリング上の特定の位置を占め、既存の隣接するノードからデータの一部を引き継ぎます。これにより、新規に追加されたノードが新たなデータの保存場所として機能し、クラスター全体の容量とパフォーマンスが向上します。
- ノードの削除/故障: リング構造は単一障害点を持たないため、1つのノードが故障またはダウンしても、他のノードがその役割を引き継ぎ、システムは正常に動作し続けます。これは、各ノードがデータの一部を保有し、それぞれが特定のトークン範囲を所有しているためです。
レプリケーション
Cassandraのリング構造は、データの一貫性と高可用性を保証するための**レプリケーション(複製)**としても機能します。各パーティションのデータは、リング上の複数のノードに複製されます。通常、これはリング上で隣接するノードに対して行われます。この複製プロセスにより、ノードが故障してもデータが失われることがなく、また必要なデータが常に読み出せる状態が保たれます。
このように、Cassandraのリングは、データの配置、スケーラビリティ、耐障害性、および一貫性という、分散データベースの主要な課題を管理するための強力な仕組みです。
演習
SELECT token(tag), tag FROM videos_by_tag;
の結果
cqlsh
で videos_by_tag
テーブルから token(tag)
と tag
を選択した結果です。
cqlsh:killrvideo> SELECT token(tag), tag
... FROM videos_by_tag;
system.token(tag) | tag
----------------------+-----------
-1651127669401031945 | datastax
-1651127669401031945 | datastax
356242581507269238 | cassandra
356242581507269238 | cassandra
356242581507269238 | cassandra
この結果は、"datastax"
と "cassandra"
の2つのタグがそれぞれ異なるパーティションを形成していることを示しています。system.token(tag)
の値は、各タグに対応するトークン値であり、このトークン値に基づいてデータがクラスター内のノードに分散されます。
nodetool ring
の出力
nodetool ring
コマンドは、Cassandraクラスター内のノードの情報を表示します。各行は1つのノードを表し、そのノードが担当するトークン範囲の開始トークンが表示されます。
$ nodetool ring
Datacenter: datacenter1
==========
Address Rack Status State Load Owns Token
8495111347830785616
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -9107256078387604241
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -7666987848485021001
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -6595487232144988189
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -5577635827402561173
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -4759963894790210379
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -3684208013564630839
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -2948292320853737199
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -1868919513406135542
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% -625399507725543569
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 341964735352991929
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 1931969287866890567
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 3550992583563933864
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 4529138036080047940
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 6307772336903635068
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 7403814237138573357
127.0.0.1 rack1 Up Normal 12.04 MiB 100.00% 8495111347830785616
Warning: "nodetool ring" is used to output all the tokens of a node.
To view status related info of a node use "nodetool status" instead.
この出力は、単一ノードのCassandraクラスター(127.0.0.1
)が、リング上の全てのトークン範囲を所有していることを示しています。各行の Token
列は、そのノードが担当するデータの範囲の開始トークンです。