整合性レベルはどのように構成されるか
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
を呼び出します。