Apache Cassandra と Azure Cosmos DB for Apache Cassandra の整合性レベル
適用対象: Cassandra
Azure Cosmos DB とは異なり、Apache Cassandra では整合性の保証がネイティブで正確に定義されていません。 代わりに Apache Cassandra には、高可用性、整合性および待機時間とのトレードオフを可能にする、書き込みの整合性レベルと読み取りの整合性レベルがあります。 Cassandra 用 Azure Cosmos DB を使用する場合は、以下のようになります。
- Apache Cassandra の書き込み整合性レベルは、お使いの Azure Cosmos DB アカウントに構成された既定の整合性レベルにマップされます。 書き込み操作 (CL) の整合性は、要求ごとに変更することはできません。
- Azure Cosmos DB では、Cassandra クライアント ドライバーによって指定された読み取り整合性レベルが動的にマップされます。 整合性レベルは、読み取り要求で動的に構成された Azure Cosmos DB 整合性レベルのいずれかにマップされます。
複数リージョンの書き込み対単一リージョンの書き込み
Apache Cassandra データベースは、既定ではマルチマスター システムであり、読み取りに複数リージョン レプリケーションを使用した単一リージョンの書き込みに、すぐに使用できるオプションは用意されていません。 ただし、Azure Cosmos DB には、単一リージョンか複数リージョンのどちらかの書き込み構成を使用するターンキー機能が備えられています。 複数のリージョンにわたって単一リージョンの書き込み構成を選択できる利点の 1 つは、リージョン間の競合シナリオを回避することであり、複数のリージョン間で強力な整合性を維持することができます。
単一リージョンの書き込みでは、強力な整合性を維持しながら、サービスマネージド フェールオーバーを使用してリージョン間で高可用性レベルを維持することもできます。 この構成では、要求ごとに最終的な整合性にダウングレードすることによって、データの局所性を利用して読み取り待機時間を短縮できます。 これらの機能に加えて、Azure Cosmos DB プラットフォームでは、リージョンを選択するときにゾーン冗長性を指定できるオプションも用意されています。 したがって、ネイティブの Apache Cassandra とは異なり、Azure Cosmos DB を使用すると、CAP 定理のトレードオフの領域をより詳細に操作できるようになります。
整合性レベルのマッピング
Azure Cosmos DB プラットフォームには、レプリケーションに関する、明確に定義されたビジネス ユース ケース指向の整合性設定が 5 つ用意されています。 これらの整合性設定に対するトレードオフは、CAP および PACLC 定理によって定義されます。 このアプローチは Apache Cassandra とは大きく異なるため、Azure Cosmos DB の整合性を確認して理解することをお勧めします。 または、こちらの短いビデオ ガイドを視聴して、Azure Cosmos DB プラットフォームの整合性設定を理解することもできます。 次の表は、Cassandra 用 API を使用する場合の Apache Cassandra と Azure Cosmos DB の整合性レベル間での可能性のあるマッピングを示しています。 このテーブルには、単一リージョン、複数リージョンの読み取りと単一リージョンの書き込み、複数リージョンの書き込みの構成が示されています。
マッピング
Note
これらは正確なマッピングではありません。 むしろ、Apache Cassandra に最も近い類似物を提供し、右端の列に質的な違いを明確にしてきました。 前述のように、Azure Cosmos DB の整合性設定を確認することをお勧めします。
Apache Cassandra における ALL
、EACH_QUOROM
、QUOROM
、LOCAL_QUORUM
または THREE
書き込みの整合性
Apache 読み取りの整合性 | 読み取り元 | Apache Cassandra の読み取り/書き込み設定に最も近い Azure Cosmos DB 整合性レベル |
---|---|---|
ALL |
ローカル リージョン | Strong |
EACH_QUOROM |
ローカル リージョン | Strong |
QUOROM |
ローカル リージョン | Strong |
LOCAL_QUORUM |
ローカル リージョン | Strong |
LOCAL_ONE |
ローカル リージョン | Eventual |
ONE |
ローカル リージョン | Eventual |
TWO |
ローカル リージョン | Strong |
THREE |
ローカル リージョン | Strong |
Apache と DSE Cassandra とは異なり、Azure Cosmos DB では既定でクォーラム書き込みが永続的にコミットされます。 4 つのノードのうち少なくとも 3 つ (3/4) では、メモリ内コミット ログだけでなく、ディスクへの書き込みがコミットされます。
Apache Cassandra における ONE
、LOCAL_ONE
、または ANY
書き込みの整合性
Apache 読み取りの整合性 | 読み取り元 | Apache Cassandra の読み取り/書き込み設定に最も近い Azure Cosmos DB 整合性レベル |
---|---|---|
ALL |
ローカル リージョン | Strong |
EACH_QUOROM |
ローカル リージョン | Eventual |
QUOROM |
ローカル リージョン | Eventual |
LOCAL_QUORUM |
ローカル リージョン | Eventual |
LOCAL_ONE |
ローカル リージョン | Eventual |
ONE |
ローカル リージョン | Eventual |
TWO |
ローカル リージョン | Eventual |
THREE |
ローカル リージョン | Eventual |
Cassandra 用 Azure Cosmos DB API では、既定で常にクォーラム書き込みが永続的にコミットされるため、すべての読み取り整合性を使用できます。
Apache Cassandra における TWO
書き込みの整合性
Apache 読み取りの整合性 | 読み取り元 | Apache Cassandra の読み取り/書き込み設定に最も近い Azure Cosmos DB 整合性レベル |
---|---|---|
ALL |
ローカル リージョン | Strong |
EACH_QUOROM |
ローカル リージョン | Strong |
QUOROM |
ローカル リージョン | Strong |
LOCAL_QUORUM |
ローカル リージョン | Strong |
LOCAL_ONE |
ローカル リージョン | Eventual |
ONE |
ローカル リージョン | Eventual |
TWO |
ローカル リージョン | Eventual |
THREE |
ローカル リージョン | Strong |
Azure Cosmos DB には 2 つのノードのみへの書き込み整合性という概念がないため、この整合性はほとんどの場合クォーラムと同様に扱います。 読み取り整合性 TWO
の場合、この一貫性は QUOROM
を使用した書き込み、および ONE
からの読み取りと同等です。
Apache Cassandra における Serial
または Local_Serial
書き込みの整合性
Apache 読み取りの整合性 | 読み取り元 | Apache Cassandra の読み取り/書き込み設定に最も近い Azure Cosmos DB 整合性レベル |
---|---|---|
ALL |
ローカル リージョン | Strong |
EACH_QUOROM |
ローカル リージョン | Strong |
QUOROM |
ローカル リージョン | Strong |
LOCAL_QUORUM |
ローカル リージョン | Strong |
LOCAL_ONE |
ローカル リージョン | Eventual |
ONE |
ローカル リージョン | Eventual |
TWO |
ローカル リージョン | Strong |
THREE |
ローカル リージョン | Strong |
シリアルは軽量トランザクションにのみ適用されます。 既定では、Azure Cosmos DB は永続的にコミットされたアルゴリズムに従います。そのため Serial
の一貫性はクォーラムと同様です。
単一リージョン書き込みのその他のリージョン
Azure Cosmos DB では、5 つの整合性設定が容易になります。この中には、単一リージョン書き込みが構成されている複数のリージョンにわたる、強力なものも含まれます。 これらは、互いに 2,000 マイル以内にあるリージョンで容易になります。
すべてのノード/リージョンが書き込みであり、すべてのリージョンで厳密な整合性を保証できないため、Azure Cosmos DB では Apache Cassandra へのマッピングを適用できません。
複数リージョン書き込みのその他のリージョン
Azure Cosmos DB では、複数リージョンの書き込みが構成されている複数のリージョンにわたる 4 つの整合性設定 (eventual
、consistent prefix
、session
、bounded staleness
) のみが容易になります。
Apache Cassandra では、設定に関係なく、他のリージョン間の読み取りに対してのみ最終的な整合性が提供されます。
サポートされている動的オーバーライド
Azure Cosmos DB のアカウント設定 | クライアント要求の値をオーバーライド | オーバーライド効果 |
---|---|---|
Strong |
All |
効果なし (strong として残ります) |
Strong |
Quorum |
効果なし (strong として残ります) |
Strong |
LocalQuorum |
効果なし (strong として残ります) |
Strong |
Two |
効果なし (strong として残ります) |
Strong |
Three |
効果なし (strong として残ります) |
Strong |
Serial |
効果なし (strong として残ります) |
Strong |
LocalSerial |
効果なし (strong として残ります) |
Strong |
One |
整合性が Eventual に変更される |
Strong |
LocalOne |
整合性が Eventual に変更される |
Strong |
Any |
許可されない (エラー) |
Strong |
EachQuorum |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
All |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
Quorum |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
LocalQuorum |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
Two |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
Three |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
Serial |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
LocalSerial |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
One |
整合性が Eventual に変更される |
Bounded staleness 、 session 、または consistent prefix |
LocalOne |
整合性が Eventual に変更される |
Bounded staleness 、 session 、または consistent prefix |
Any |
許可されない (エラー) |
Bounded staleness 、 session 、または consistent prefix |
EachQuorum |
許可されない (エラー) |
メトリック
Azure Cosmos DB アカウントが、厳密な整合性以外の整合性レベルで構成されている場合は、"確率的有界整合性制約" (PBS) メトリックを確認します。 このメトリックでは、クライアントがワークロードに対して厳密で整合性のある読み取りを得られる可能性がある確率がキャプチャされます。 このメトリックは、Azure portal で公開されます。 PBS メトリックの詳細については、「確率的有界整合性制約 (PBS) メトリックを監視する」を参照してください。
確率論的有界整合性制約は、最終的な整合性が、どれほど最終的であるかを示します。 このメトリックでは、Azure Cosmos DB アカウントで現在構成されている整合性レベルより厳密な整合性をどのくらいの頻度で得られるかについての分析情報が提供されます。 つまり、書き込みと読み取りのリージョンの組み合わせに対して整合性ある読み取りを得られる確率 (ミリ秒で測定) を表示できます。
Apache Cassandra における書き込み要求に対するグローバルで厳密な整合性
Apache Cassandra では、EACH_QUORUM
または QUORUM
を設定することで、厳密な整合性を得ることができます。 EACH_QUORUM
では、書き込み要求がリージョンに送信されると、各データ センター内のクォーラム数のノードにデータが保持されます。 この永続化では、書き込み操作を成功させるために、すべてのデータ センターが使用可能である必要があります。 QUORUM
では若干制限が緩く、すべてのデータセンターにデータの保持に必要な QUORUM
個のノードがあり、書き込みの成功を把握する際にこれらが確認されます。
次の図は、Apache Cassandra における 2 つのリージョン 1 と 2 の間のグローバルで厳密な整合性設定を示しています。 データがリージョン 1 に書き込まれた後、リージョン 1 とリージョン 2 の両方において書き込みがクォーラム数のノードに保持されると、アプリケーションは通知を受け取ります。
Azure Cosmos DB for Apache Cassandra における書き込み要求に対するグローバルで厳密な整合性
Azure Cosmos DB では、整合性はアカウント レベルで設定されます。 Azure Cosmos DB for Cassandra の Strong
整合性により、データはアカウントの読み取りリージョンに同期的にレプリケートされます。 Azure Cosmos DB アカウントのリージョンが離れているほど、整合性のある書き込み操作の待機時間が長くなります。
リージョンの数が読み取りまたは書き込み要求に与える影響:
- 2 つのリージョン: 厳密な整合性、クォーラム
(N/2 + 1) = 2
。 そのため、読み取りリージョンが停止した場合、クォーラム数のリージョンは書き込みのレプリケート先として使用できないため、アカウントは厳密な整合性の書き込みを受け入れられなくなります。 - 3 つ以上のリージョンの場合:
N = 3
、quorum = 2
。 いずれかの読み取りリージョンが停止している場合でも、書き込みリージョンでは、クォーラム要件を満たす合計 2 つのリージョンに書き込みをレプリケートできます。 4 つのリージョンquorum = 4/2 + 1 = 3
の場合も同様です。 いずれかの読み取りリージョンが停止している場合でも、クォーラムを満たすことができます。
注意
すべての書き込み操作においてグローバルで厳密な整合性が必要な場合、Azure Cosmos DB for Cassandra アカウントの整合性を Strong に設定する必要があります。 書き込み操作の整合性レベルを、Azure Cosmos DB の要求ごとに低い整合性レベルにオーバーライドすることはできません。
Apache Cassandra での書き込み要求に対する弱い整合性
ANY
、ONE
、TWO
、THREE
、LOCAL_QUORUM
、Serial
、Local_Serial
の整合性レベルとは何でしょうか? 6 ノードのデータセンターにおける、4
の RF
がある LOCAL_QUORUM
の書き込み要求について考えてみます。 Quorum = 4/2 + 1 = 3
。
Azure Cosmos DB for Apache Cassandra での書き込み要求に対する弱い整合性
Strong
よりも低い整合性レベルのいずれかで書き込み要求が送信された場合、ローカル リージョンの 4 つのレプリカのうち少なくとも 3 つで書き込みが保持されると、すぐに成功応答が返されます。
Apache Cassandra での読み取り要求に対するグローバルで厳密な整合性
Apache Cassandra では、EACH_QUORUM
の整合性を使用することで、整合性のある読み取りを実現できます。 各リージョンでノードのクォーラム数が満たされていない場合、マルチリージョン セットアップ EACH_QUORUM
では読み取りが失敗します。
Azure Cosmos DB for Apache Cassandra における読み取り要求に対するグローバルで厳密な整合性
読み取り要求は、指定されたリージョン内の 2 つのレプリカから提供されます。 書き込みでは既にクォーラム数のリージョン (および、すべてのリージョンが使用可能な場合はすべてのリージョン) への保持が処理されているため、指定されたリージョン内の 2 つのレプリカから読み取るだけで、厳密な整合性を得ることができます。 この厳密な整合性では、Cosmos DB アカウントのリージョンに対して読み取りを発行するときに、ドライバーで EACH_QUORUM
を指定する必要があります。また、厳密な整合性をアカウントの既定の整合性レベルとして指定する必要があります。
Apache Cassandra におけるローカルの厳密な整合性
整合性レベルが TWO
、THREE
、または LOCAL_QUORUM
の読み取り要求では、ローカル リージョンからの読み取りに厳密な整合性が提供されます。 LOCAL_QUORUM
の整合性レベルでは、読み取りを成功させるために、指定されたデータセンター内の 2 つのノードからの応答が必要です。
Azure Cosmos DB for Apache Cassandra におけるローカルの厳密な整合性
Azure Cosmos DB for Cassandra では、整合性レベル TWO
、THREE
、または LOCAL_QUORUM
を指定すると、読み取り要求に対してローカルの厳密な整合性が提供されます。 書き込みパスでは 4 つのレプリカのうち少なくとも 3 つへのレプリケートが保証されるため、指定されたリージョン内の 2 つのレプリカからの読み取りでは、そのリージョン内のデータのクォーラム読み取りが保証されます。
Apache Cassandra における最終的な整合性
LOCAL_ONE
、One
、または ANY with LOCAL_ONE
の整合性レベルを指定すると、最終的な整合性が得られます。 この整合性は、待機時間に重点を置く場合に使用されます。
Azure Cosmos DB for Apache Cassandra における最終的な整合性
LOCAL_ONE
、ONE
、または Any
の整合性レベルを指定すると、最終的な整合性を得ることができます。 最終的な整合性では、指定したリージョン内のいずれかのレプリカからのみ読み取りが行われます。
Azure Cosmos DB for Cassandra での読み取り操作の整合性レベルをオーバーライドする
これまでは、読み取り要求の整合性レベルは、アカウントで設定された既定値よりも低い整合性にのみオーバーライドできました。 たとえば、既定の整合性が Strong の場合、読み取り要求を既定の Strong で発行し、要求ごとに (必要に応じて) Strong よりも弱い整合性レベルにオーバーライドできました。 ただし、オーバーライドされた整合性レベルがアカウントの既定値よりも高い場合、読み取り要求を発行できませんでした。 整合性が Eventual であるアカウントでは、整合性レベルが Eventual よりも高い読み取り要求を受信できませんでした (この場合、Apache Cassandra ドライバーによって TWO
、THREE
、LOCAL_QUORUM
、または QUORUM
に変換されます)。
Azure Cosmos DB for Cassandra では、読み取り要求の整合性を、アカウントの既定の整合性よりも高い値に簡単にオーバーライドできるようになりました。 たとえば、Cosmos DB アカウントの既定の整合性が Eventual (Apache Cassandra の One
または ANY
と同等) に設定されている場合、読み取り要求を要求ごとに LOCAL_QUORUM
にオーバーライドできます。 このオーバーライドにより、LOCAL_QUORUM
で必要とされるとおり、指定されたリージョン内のクォーラム数のレプリカが参照されてから、結果セットが返されます。
また、このオプションを使用すると、読み取り要求にのみ必要な場合に、既定の整合性を Eventual
よりも高く設定する必要がなくなります。