DS201の実施_Ring

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

Ringとは

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

Cassandraは全てのデータをパーティションに分割し、それぞれのパーティションに一意のトークンを割り当てる。これらのトークンは、Ringのデータ構造の中に配列される。Ringとは、全ての可能なトークンの値の範囲を視覚化したものといえる。

各ノードは、Ring上の特定の範囲のトークンを所有している。その所有するトークン範囲に対応するデータの一部を格納することにより、どのデータがどのノードに存在するかが決定され、データがノード間で分散される。

リングの構造は、ノードが追加または削除されたときにも、データの再分配を最小限に抑える役割も果たす。新たなノードが追加された際には、そのノードはリング上の特定の位置を占め、既存の隣接するノードからデータの一部を引き継ぐ。これにより、新規に追加されたノードが新たなデータの保存場所として機能する。

Ringの構造は単一障害点を排除する役割も果たす。1つのノードが故障またはダウンしても、他のノードがその役割を引き継ぎ、システムは正常に動作し続ける。これは各ノードがデータの一部を保有し、それぞれが特定のトークン範囲を所有しているためである。

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

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

演習

「datastax」と「cassandra」の2つのタグがそれぞれ1つのパーティションを形成している。 cqlshクエリの結果である"system.token(tag)“の値は、各タグ(“datastax"および"cassandra”)に対応するトークンの値を示している。

cqlsh:killrvideo> SELECT token(tag), tag
              ... FROM videos_by_tag;

 system.token(tag)    | tag
----------------------+-----------
 -1651127669401031945 |  datastax
 -1651127669401031945 |  datastax
   356242581507269238 | cassandra
   356242581507269238 | cassandra
   356242581507269238 | cassandra

nodetool ringの出力は、Cassandraクラスタ内のノードの情報を示している。各行は1つのノードを表し、そのノードが保持しているトークンの値が表示している。nodetool コマンドによって表示されるトークンは、ノードが担当するデータの範囲の開始トークンである。

$ 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.
Tags: