整合性レベルはどのように構成されるか

Cassandraの整合性レベルは、可用性とデータ精度との兼ね合いを管理するために構成することができます。

Cassandraの整合性レベルは、可用性とデータ精度との兼ね合いを管理するために構成することができます。クラスター、データ・センター、または個別の読み取りまたは書き込み操作の単位で整合性を構成することができます。関与するノード間の整合性は、グローバルに設定できるだけでなく、操作単位で制御することができます。cqlsh内で、CONSISTENCYを使用して、現在のcqlshセッションのすべてのクエリーについて整合性レベルを設定します。クライアント・アプリケーションをプログラミングするには、適切なドライバーを使用して整合性レベルを設定します。たとえば、Javaドライバーを使用して、setConsistencyLevelを持つQueryBuilder.insertIntoを呼び出し、挿入ごとの整合性レベルを設定します。

すべての書き込み操作と読み取り操作のデフォルトの整合性レベルはONEです。

書き込みの整合性レベル 

以下の表で、最も強い順から最も弱い順に書き込みの整合性レベルについて説明します。

書き込みの整合性レベル
レベル 説明 使用法
ALL 書き込みが、対象パーティションに対応する、クラスター内のすべてのレプリカ・ノードのコミット・ログとmemtableに書き込まれる必要があります。 他のレベルと比べて最高の整合性と最低の可用性を提供します。
EACH_QUORUM 強い整合性。書き込みが、各データ・センターのレプリカ・ノードのクォーラム(過半数)のコミット・ログとmemtableに書き込まれる必要があります。 複数データ・センター・クラスターで、各データ・センターの整合性を同じレベルに厳しく保つために使用されます。たとえば、データ・センターがダウンしており、そのデータ・センターでQUORUM(過半数)に達しないときに読み取りが失敗するようにしたい場合に、このレベルを選択します。
QUORUM 書き込みが、すべてのデータ・センターのレプリカ・ノードのクォーラム(過半数)のコミット・ログとmemtableに書き込まれる必要があります。 クラスターの強い整合性を保つために単一または複数データ・センターのクラスターで使用します。一定レベルの失敗を許容できる場合に使用します。
LOCAL_QUORUM 強い整合性。書き込みが、コーディネーター・ノードと同じデータ・センターにあるレプリカ・ノードのクォーラム(過半数)のコミット・ログとmemtableに書き込まれる必要があります。データ・センター間の通信のレイテンシーを避けます。 NetworkTopologyStrategyなどのラック認識レプリカ配置ストラテジと適切に構成したスニッチを使用する複数データ・センター・クラスターで使用します。整合性をローカルで(1つのデータ・センター内で)維持する際に使用します。 SimpleStrategyとともに使用できます。
ONE 書き込みが、少なくとも1つのレプリカ・ノードのコミット・ログとmemtableに書き込まれる必要があります。 整合性の要件が厳しくないため、大半のユーザーのニーズを満たします。
TWO 書き込みが、少なくとも2つのレプリカ・ノードのコミット・ログとmemtableに書き込まれる必要があります。 ONEに似ています。
THREE 書き込みが、少なくとも3つのレプリカ・ノードのコミット・ログとmemtableに書き込まれる必要があります。 TWOに似ています。
LOCAL_ONE ローカル・データ・センターの少なくとも1つのレプリカ・ノードに書き込みを送信し、確認応答がある必要があります。 複数データ・センター・クラスターでは、ONEの整合性レベルが望ましいですが、データ・センター間のトラフィックは望ましくありません。LOCAL_ONEでこれを実現しています。セキュリティと品質上の目的で、この整合性レベルをオフライン・データ・センターで使用して、オフライン・ノードがダウンしたときに他のデータ・センターのオンライン・ノードに自動的に接続されるのを防ぐことができます。
ANY 書き込みが、少なくとも1つのノードに書き込まれる必要があります。パーティション・キーのすべてのレプリカ・ノードがダウンしていても、ヒンテッド・ハンドオフが書き込まれれば、書き込みを成功と見なすことができます。書き込み時にすべてのレプリカ・ノードがダウンしていた場合は、そのパーティションのレプリカ・ノードが回復するまでANY書き込みは読み取り可能になりません。 低いレイテンシーをもたらし、書き込みが失敗しないことを保証します。整合性が最も低く、可用性が最も高くなります。

読み取りの整合性レベル 

以下の表で、最も強い順から最も弱い順に読み取りの整合性レベルについて説明します。

読み取りの整合性レベル
レベル 説明 使用法
ALL すべてのレプリカが応答した後に、レコードを返します。1つでもレプリカが応答しないと、読み取り操作は失敗します。 すべてのレベルで最高の整合性、およびすべてのレベルで最低の可用性を提供します。
EACH_QUORUM 強い整合性。読み取りが、各データ・センターのレプリカ・ノードのクォーラム(過半数)で読み取られる必要があります。 複数データ・センター・クラスターで、各データ・センターの整合性を同じレベルに厳しく保つために使用されます。たとえば、データ・センターがダウンしており、そのデータ・センターでQUORUM(過半数)に達しないときに読み取りが失敗するようにしたい場合に、このレベルを選択します。
QUORUM すべてのデータ・センターのクォーラム(過半数)のレプリカが応答したら、レコードを返します。 クラスターの強い整合性を保つために単一または複数データ・センターのクラスターで使用します。一定レベルの失敗を許容できれば、強力な整合性を確保します。
LOCAL_QUORUM コーディネーター・ノードが報告された際に現在のデータ・センター内のクォーラム(過半数)のレプリカが応答したら、レコードを返します。データ・センター間の通信のレイテンシーを避けます。 ラック認識レプリカ配置ストラテジ(NetworkTopologyStrategy)と適切に構成したスニッチを使用する複数データ・センター・クラスターで使用します。SimpleStrategyを使用すると失敗します。
ONE スニッチによって定まる最も近いレプリカから応答を返します。デフォルトでは、他のレプリカとの整合性を維持するために、読み取りリペアがバックグラウンドで実行されます。 古いデータを読み取る確率が比較的高いことを許容できれば、すべてのレベルで最高の可用性を提供します。読み取り先として接続したレプリカが、必ず最新の書き込みを持っているとは限りません。
TWO 最も近い2つのレプリカから最新のデータを返します。 ONEに似ています。
THREE 最も近い3つのレプリカから最新のデータを返します。 TWOに似ています。
LOCAL_ONE ローカル・データ・センターの最も近いレプリカからの応答を返します。 書き込み整合性レベルに関する表の記載と同じ用途です。
SERIAL 新しい追加や更新を提示することなく、現在の(そしてコミットされていない可能性がある)データの状態を読み取ることができます。SERIALの読み取りにおいて進行中のコミットされていないトランザクションが見つかった場合は、読み取りの一環としてそのトランザクションがコミットされます。QUORUMに似ています。 カラムへの書き込みのためにユーザーが軽量トランザクションを呼び出した後にカラムの最新の値を読み取るには、SERIALを使用します。そうすると、Cassandraは更新がないか、進行中の軽量トランザクションを確認し、あれば最新のデータを返します。
LOCAL_SERIAL SERIALと同じですが、データ・センターに限定されます。LOCAL_QUORUMに似ています。 軽量トランザクションの直列化可能な整合性を実現するために使用されます。

QUORUMの計算方法 

QUORUMレベルは、クォーラム(過半数)を構成する数のノードに書き込まれます。クォーラムは計算され、以下のように整数になるように切り捨てが行われます。

quorum = (レプリケーション係数の合計値 / 2) + 1

レプリケーション係数の合計値」とは、各データ・センターのreplication_factor設定を足し合わせた合計値です。

sum_of_replication_factors = datacenter1_RF + datacenter2_RF + .. . + datacentern_RF
例:
  • レプリケーション係数3を使用した場合、クォーラムは2ノードになります。このクラスターは、1つのレプリカ・ノードのダウンを許容できます。
  • レプリケーション係数6を使用した場合、クォーラムは4になります。このクラスターは、2つまでのレプリカのダウンを許容できます。
  • 各データ・センターのレプリケーション係数が3である2つのデータ・センターで構成されるクラスターの場合、クォーラムは4ノードになります。このクラスターは、2つのレプリカのダウンを許容できます。
  • 2つのデータ・センターのレプリケーション係数が3で、3つのデータ・センターのレプリケーション係数が2である5つのデータ・センターで構成されるクラスターの場合、クォーラムは6ノードになります。

データ・センターの数が増えるほど、成功した操作に応答するために必要なレプリカ・ノードの数も増えます。

LOCAL_QUORUMレベルも、QUORUMと同様に、コーディネーター・ノードと同じデータ・センターのレプリケーション係数に基づいて計算されます。すなわち、クラスターが複数のデータ・センターを持つ場合、クォーラムはローカル・レプリカ・ノードのみを使用して計算されます。

EACH_QUORUMでは、読み取りまたは書き込み要求が成功するために、クラスター内のすべてのデータ・センターは、そのデータ・センターのレプリケーション係数に基づいてクォーラム(過半数)に達する必要があります。すなわち、クラスター内の各データ・センターについて、読み取りまたは書き込み要求が成功するために、レプリカ・ノードのクォーラムはコーディネーター・ノードに応答する必要があります。

クライアント整合性レベルの構成 

cqlshコマンドであるCONSISTENCYを使用して、現在のcqlshセッションのクエリーについて整合性レベルを設定できます。クライアント・アプリケーションをプログラミングするには、適切なドライバーを使用して整合性レベルを設定します。たとえば、Javaドライバーを使用して、setConsistencyLevel引数を持つQueryBuilder.insertIntoを呼び出します。