1. 概要

この記事では、 ApacheCassandraがクラスター内のノード間でデータをパーティション分割および分散する方法について学習します。 さらに、Cassandraが複製されたデータを複数のノードに保存して高可用性を実現する方法を見ていきます。

2. ノード

Cassandraでは、単一ノードがサーバーまたは仮想マシン(VM)で実行されます。 CassandraはJava言語で記述されています。つまり、Cassandraの実行中のインスタンスはJava仮想マシン(JVM)プロセスです。 Cassandraノードは、クラウド、オンプレミスのデータセンター、または任意のディスクに存在できます。 データストレージについては、推奨事項に従って、ローカルストレージまたは直接接続ストレージを使用する必要がありますが、SANは使用しないでください。

Cassandraノードは、分散ハッシュテーブルの形式で格納するすべてのデータを担当します。 Cassandraは、ノードまたはクラスターのステータスを管理およびチェックするためのnodetoolと呼ばれるツールを提供します。

3. トークンリング

Cassandraは、クラスター内の各ノードを連続リング形式の1つ以上のトークンにマップします。 デフォルトでは、トークンは64ビット整数です。 したがって、トークンの可能な範囲は-2 63から263-1です。 コンシステントハッシュ法を使用して、ノードを1つ以上のトークンにマップします。

3.1. ノードごとの単一トークン

ノードごとに単一のトークンの場合、各ノードは、割り当てられたトークン以下で、前のノードの割り当てられたトークンよりも大きい値のトークン範囲を担当します。 リングを完了するために、最小のトークン値を持つ最初のノードは、割り当てられたトークン以下で、最大のトークン値を持つ最後のノードの割り当てられたトークンより大きい値の範囲を担当します。

データ書き込み時に、Cassandraはハッシュ関数を使用してパーティションキーからトークン値を計算します。 このトークン値は、各ノードのトークン範囲と比較され、データが属するノードを識別します。

例を見てみましょう。 次の図は、レプリケーション係数( RF )が3で、各ノードに1つのトークンが割り当てられている8ノードのクラスターを示しています。

RF = 3 のクラスターは、各ノードに3つのレプリカがあることを意味します。

上の図の最も内側のリングは、メインのデータトークン範囲を表しています。

ノードごとに単一のトークンがある場合の欠点は、ノードがクラスターに追加またはクラスターから削除されたときに作成されるトークンの不均衡です。

Nノードのハッシュリングで、各ノードが同数のトークン、たとえば100を所有していると仮定します。 さらに、トークン範囲100〜200を所有する既存のノードXがあると想定します。 ここで、ノードXの左側に新しいノードYを追加すると、この新しいノードYはノードXのトークンの半分を所有するようになります。

つまり、ノードXは100〜150のトークン範囲を所有し、ノードYは151〜200のトークン範囲を所有します。 ノードXからのデータの一部をノードYに移動する必要があります。 これにより、あるノードXから別のノードYにデータが移動します。

3.2. ノードごとの複数のトークン(vnodes)

Cassandra 2.0以降、仮想ノード(vnode)はデフォルトで有効になっています。 この場合、 Cassandraはトークン範囲をより小さな範囲に分割し、それらのより小さな範囲の複数をクラスター内の各ノードに割り当てます。デフォルトでは、ノードのトークン数は256です。これは次のように設定されます。 cassandra.yamlファイルのnum_tokensプロパティ–これはノード内に256個のvnodeがあることを意味します。

この構成により、さまざまなコンピューティングリソースのマシンでCassandraクラスターを保守しやすくなります。 これは、 num_tokens プロパティをより大きな値に設定することで、より多くのvnodeをより多くの計算能力を持つマシンに割り当てることができることを意味します。 一方、計算能力が少ないマシンの場合は、num_tokensをより低い数値に設定できます。

vnodeを使用する場合、トークン値を事前に計算する必要があります。 それ以外の場合は、各ノードのトークン値を事前に計算し、それをnum_tokensプロパティの値に設定する必要があります。

以下は、各ノードに2つのトークンが割り当てられた4ノードクラスターを示す図です。

この設定の利点は、新しいノードが追加されたとき、または既存のノードが削除されたときに、複数のノードとの間でデータの再配布が行われることです

ハッシュリングに新しいノードを追加すると、そのノードは複数のトークンを所有するようになります。 これらのトークン範囲は以前は複数のノードによって所有されていたため、追加後のデータ移動は複数のノードからのものです。

4. パーティショナー

パーティショナーは、Cassandraクラスター内のノード間でデータがどのように分散されるかを決定します。 基本的に、パーティショナーは、行のデータのパーティションキーをハッシュすることによってトークン値を決定するハッシュ関数です。 次に、このパーティションキートークンを使用して、リング内の行データを決定および配布します。

Cassandraは、パーティションキーのハッシュ値を計算するためにさまざまなアルゴリズムを使用するさまざまなパーティショナーを提供します。 IPartitioner インターフェースを実装することにより、独自のパーティショナーを提供および構成できます。

Murmur3Partitioner は、Cassandraバージョン1.2以降のデフォルトのパーティショナーです。 パーティションキーの64ビットハッシュを作成するMurmurHash関数を使用します。

Murmur3Partitioner より前は、CassandraにはデフォルトでRandomPartitionerがありました。 MD5アルゴリズムを使用してパーティションキーをハッシュします。

Murmur3PartitionerRandomPartitionerはどちらも、トークンを使用してデータをリング全体に均等に分散します。 ただし、2つのパーティショナーの主な違いは、 RandomPartitionerが暗号化ハッシュ関数を使用し、Murmur3Partitionerが非暗号化ハッシュ関数を使用することです。一般に、暗号化ハッシュ関数はパフォーマンスが低く、時間がかかります。

5. レプリケーション戦略

Cassandraは、クラスター内のノード間でデータをレプリケーションすることにより、高可用性とフォールトトレランスを実現します。レプリケーション戦略は、レプリカがクラスター内のどこに格納されるかを決定します。

クラスタ内の各ノードは、割り当てられたトークン範囲内のデータだけでなく、異なる範囲のデータのレプリカも所有します。 メインノードがダウンした場合、このレプリカノードはその範囲のデータのクエリに応答できます。

Cassandraはバックグラウンドでデータを非同期的に複製します。そして複製係数( RF )は、クラスター内の同じデータのコピーを取得するノードの数を決定する数です。 たとえば、リング内の3つのノードには、 RF=3の同じデータのコピーがあります。トークンリングセクションの図に示されているデータレプリケーションはすでに見ています。

Cassandraは、 AbstractReplicationStrategy クラスのさまざまな実装を可能にすることにより、プラグ可能なレプリケーション戦略を提供します。 箱から出して、CassandraはSimpleStrategyNetworkTopologyStrategyの2つの実装を提供します。

パーティショナーがトークンを計算してデータをメインノードに配置すると、SimpleStrategyはリングの周りの連続するノードにレプリカを配置します。

一方、 NetworkTopologyStrategy を使用すると、データセンターごとに異なるレプリケーション係数を指定できます。 データセンター内では、可用性を最大化するために、レプリカをさまざまなラックのノードに割り当てます。

NetworkTopologyStrategyは、単一のデータセンター展開であるか複数のデータセンター展開であるかに関係なく、本番展開のキースペースに推奨される戦略です。

レプリケーション戦略は、キースペースごとに個別に定義され、キースペースを作成するときに必要なオプションです。

6. 一貫性レベル

一貫性とは、分散システムで書き込んだのと同じデータを読み取っていることを意味します。 Cassandraは、読み取りクエリと書き込みクエリの両方で調整可能な一貫性レベルを提供します。 つまり、可用性と一貫性の間のきめ細かいトレードオフが得られます。

より高いレベルの整合性は、より多くのノードが読み取りまたは書き込みクエリに応答する必要があることを意味します。 このようにして、ほとんどの場合、Cassandraは少し前に書き込まれたのと同じデータを読み取ります。

読み取りクエリの場合、整合性レベルは、データをクライアントに返す前に応答する必要のあるレプリカの数を指定します。 書き込みクエリの場合、整合性レベルは、成功したメッセージをクライアントに送信する前に書き込みを確認する必要があるレプリカの数を指定します。

結果整合性システムであるため、 RF は、書き込み操作がバックグラウンドで非同期に残りのノードに対して行われることを確認します。

7. スニッチ

snitch は、Cassandraが読み取り/書き込み要求を効率的にルーティングできるように、ネットワークトポロジに関する情報を提供します。 スニッチは、どのノードがどのデータセンターとラックに属するかを決定します。 また、クラスター内のノードの相対的なホストの近接性も決定します。

レプリケーション戦略では、この情報を使用して、単一のデータセンターまたは複数のデータセンター内のクラスター内の適切なノードにレプリカを配置します。

8. 結論

この記事では、Cassandraのノード、リング、トークンなどの一般的な概念について学びました。 これらに加えて、Cassandraがクラスター内のノード間でデータを分割および複製する方法を学びました。 これらの概念は、Cassandraがデータの効率的な書き込みと読み取りのためにさまざまな戦略をどのように使用するかを説明しています。

これらは、Cassandraを非常にスケーラブルで、利用可能で、耐久性があり、管理しやすいものにするいくつかのアーキテクチャコンポーネントです。