整合性のある読み取り操作と書き込み操作はどのように処理されるのか

DataStax Enterpriseが、調整可能な整合性を伴うように結果整合性を拡張して、読み取られるデータおよび書き込まれるデータの整合性を変える方法の概要。

「整合性」とは、データ行のすべてのレプリカがどの程度まで最新の状態にあり、いつでも同期化されているかを指します。DataStax Enterpriseでは、継続的なリペア操作により、行のすべてのレプリカの整合性が最終的に確保されます。リペア操作によってレプリカ・データのばらつきは減りますが、広範囲に分散するシステム全体で一定のデータ・トラフィックで不整合がいつでも起こる(古いデータ)可能性があります。DataStax EnterpriseはCAP定理に従うAPシステムであり、高可用性と高分断耐性を提供します。構成に柔軟性があるため、アプリケーション要件に基づき、CAP定理に従うCP(整合性と分断耐性を備えた)システムとして動作できます。2つの整合性の特徴は、調整可能な整合性と直列可能な整合性です。

調整可能な整合性

DataStax Enterpriseは、データベースの読み取りおよび書き込みの整合性を適切なレベルで確保するために、調整可能な整合性を提供することによって、結果整合性の概念を拡大しています。整合性レベルは、操作ごとに調整するか、クラスターまたはデータ・センターに対してグローバルに設定することができます。個々の読み取りまたは書き込み操作の整合性を変えることができるため、返されるデータの整合性はほぼクライアント・アプリケーションの要求どおりに確保されます。これにより、DataStax Enterpriseは、アプリケーション要件に基づき、CAP定理に従うCP(整合性と分断耐性を備える)システムまたはAP(高可用性と分断耐性を備える)システムとして動作できます。

注: DataStax EnterpriseをCAシステムに完全に適応させることはできません。詳細については、「パーティション・トレランスを犠牲にできない」を参照してください。

操作のレイテンシーと整合性の間にはトレードオフがあります。整合性が高いほどレイテンシーが高くなり、整合性が低いほどレイテンシーが低くなります。レイテンシーを制御するには、整合性を調整します。

整合性レベルは、クライアント・アプリケーションに対して読み取りまたは書き込み成功を報告する必要があるレプリカの数を定めます。読み取り操作の場合、読み取り整合性レベルは、データがクライアント・アプリケーションに返される前に、読み取り要求に応答する必要があるレプリカの数を指定します。読み取り操作によりレプリカ間の不整合が判明した場合、データベースは読み取りリペアを開始して不整合データを更新します。

書き込み操作の場合、書き込み整合性レベルは、書き込みが成功したと見なされる前に、書き込み要求に応答する必要があるレプリカの数を指定します。整合性レベルが低い場合も、データベースは他のデータ・センターのレプリカも含めてパーティション・キーのすべてのレプリカに書き込みを行います。書き込み整合性レベルは、書き込み操作が完了したと見なすことをいつコーディネーターがクライアント・アプリケーションに報告するかのみを指定します。書き込み操作は、ヒンテッド・ハンドオフを使用して、複数のレプリカがダウンしているか、その他の理由で書き込みに応答しない場合に、書き込みが確実に完了するようにします。

クライアントは、キースペースによって指定されているレプリケーション係数よりも低い整合性レベルを指定するのが普通です。別の一般的なプラクティスとして、書き込みをQUORUM整合性レベルで行い、読み取りをQUORUM整合性レベルで行いますこの選択は、クライアント・アプリケーションのニーズによって異なります。DataStax Enterpriseは、アプリケーション設計の柔軟性を最大限に高めます。

直列化可能な整合性

ACID用語で言えば、「直列化可能な整合性(シリアル整合性)」とは、軽量トランザクションに対するシリアル(即時)分離レベルです。DataStax Enterpriseは、複数の行またはテーブルを同時に更新するときに、ロックまたはトランザクション依存関係のような従来のメカニズムを使用しません。

ただし、操作によっては、順次実行し、他の操作によって中断されてはならない場合があります。たとえば、ユーザー・アカウントの作成時に複製または上書きを行うと、深刻な結果をもたらす可能性があります。競合状態(2つのクライアントが同じレコードを更新する)のような状況では、レプリカ全体で不整合が発生することがあります。整合性が高い書き込みであっても、このような状況は解消されません。直列化可能な整合性は、ユーザーIDや電子メール・アドレスのような一意識別子に適用できますが、ユーザーのアカウントのすべての要素に必要なわけではありません。このような要素のシリアル操作は、クォーラム・ベースのアルゴリズムを採用しているPaxos合意プロトコルを使用してデータベースに実装できます。軽量トランザクションは、マスター・データベースや2相コミット・プロセスを必要とせずに実装できます。

軽量トランザクションの書き込み操作は、Paxos合意にシリアル整合性レベルを使用し、テーブルへの書き込みに通常の整合性レベルを使用します。詳細については、「軽量トランザクション」を参照してください。

整合性の計算

読み取り操作と書き込み操作の信頼性は、操作を確認するために使用される整合性により異なります。強い整合性は、次の条件がtrueのときに保証されます。
R + W > N
ここで、
  • Rは読み取り操作の整合性レベルです
  • Wは書き込み操作の整合性レベルです
  • Nはレプリカの数です
レプリケーション係数が3の場合、読み取り操作と書き込み操作を組み合わせた整合性レベルは4以上になる必要があります。たとえば、読み取り操作で値を検証するために3つのレプリカのうち2つを使用し、書き込み操作で値を検証するために3つのレプリカのうち2つを使用すると、強力な整合性が実現します。高速な書き込み操作が必要だが、強力な整合性も求められる場合、書き込みの整合性レベルは1まで低下しますが、読み取り操作は3つのレプリカすべてで値が一致しているか検証する必要があります。書き込み速度は上昇しますが、読み取り速度は低下します。
結果整合性は、次の条件がtrueのときに実現します。
R + W =< N
ここで、
  • Rは読み取り操作の整合性レベルです
  • Wは書き込み操作の整合性レベルです
  • Nはレプリカの数です
レプリケーション係数が3の場合、読み取り操作と書き込み操作を組み合わさせた整合性レベルは3以下です。たとえば、読み取り操作で値を検証するためにQUORUMを使用(3つのレプリカのうち2つを使用)し、書き込み操作で高速書き込みを行うためにONEを使用(3つのレプリカのうち1つを使用)すると、結果整合性が実現します。すべてのレプリカがデータを受け取りますが、読み取り操作は、すべてのレプリカがデータを書き込む前はデータの選択に対して脆弱になります。

その他の整合性の例:

  • ONEで書き込みを行い、そのレプリカは1秒後にクラッシュします。他のメッセージは配信されません。そのデータは失われます。
  • ONEで書き込みを行い、その操作がタイムアウトになります。その後の読み取りでは、古い値か新しい値が返されます。データが正しいかどうかわかりません。
  • ONEで書き込みを行い、他のいずれかのレプリカがダウンします。そのノードがオンラインに戻ります。アプリケーションは、そのノードが正しいデータを取得するか、読み取りリペアが発生するまで、そのノードから古いデータを取得します。
  • QUORUMで書き込みを行った後、QUORUMで読み取りを行います。いずれかのレプリカがダウンします。常に正しいデータを取得できます。