DS201学習記録:Cassandraのリング(Ring)構造

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

Ringとは

Cassandraのアーキテクチャは、複数のノードで形成されるクラスターを基盤としています。その中心にあるデータ構造が**リング(Ring)**です。リングは、クラスター内でデータがどのように各ノード間で分散されるかを管理する役割を担っています。

データの分散と配置

Cassandraは、全てのデータをパーティションに分割し、それぞれのパーティションに一意のトークンを割り当てます。これらのトークンは、リングと呼ばれる仮想的な円周上に配置されます。リングは、全ての可能なトークン値の範囲を視覚化したものと考えることができます。

各ノードは、このリング上の特定の範囲のトークンを「所有」しています。ノードが所有するトークン範囲に対応するデータの一部を格納することにより、どのデータがどのノードに存在するかが決定され、データがクラスター全体に均等に分散されます。

スケーラビリティと耐障害性

リング構造は、ノードの追加や削除が行われた際にも、データの再分配を最小限に抑えるように設計されています。

  • ノードの追加: 新しいノードが追加されると、そのノードはリング上の特定の位置を占め、既存の隣接するノードからデータの一部を引き継ぎます。これにより、新規に追加されたノードが新たなデータの保存場所として機能し、クラスター全体の容量とパフォーマンスが向上します。
  • ノードの削除/故障: リング構造は単一障害点を持たないため、1つのノードが故障またはダウンしても、他のノードがその役割を引き継ぎ、システムは正常に動作し続けます。これは、各ノードがデータの一部を保有し、それぞれが特定のトークン範囲を所有しているためです。

レプリケーション

Cassandraのリング構造は、データの一貫性と高可用性を保証するための**レプリケーション(複製)**としても機能します。各パーティションのデータは、リング上の複数のノードに複製されます。通常、これはリング上で隣接するノードに対して行われます。この複製プロセスにより、ノードが故障してもデータが失われることがなく、また必要なデータが常に読み出せる状態が保たれます。

このように、Cassandraのリングは、データの配置、スケーラビリティ、耐障害性、および一貫性という、分散データベースの主要な課題を管理するための強力な仕組みです。

演習

SELECT token(tag), tag FROM videos_by_tag; の結果

cqlshvideos_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 列は、そのノードが担当するデータの範囲の開始トークンです。