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

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

「整合性」とは、すべてのレプリカにおいてCassandraのデータ行がどの程度まで最新の状態にあり、同期化されているかを指します。Cassandraでは、リペア操作を使用することで、Cassandraデータがすべてのレプリカで最終的に整合性が保たれます。リペア操作によりレプリカ・データのばらつきは減りますが、一時的に古いデータが存在する可能性があります。CassandraはCAP定理に従うAPシステムであり、高可用性と高分断耐性を提供します。Cassandraは、構成に柔軟性があるため、アプリケーション要件に基づき、CAP定理に従うCP(整合性と分断耐性を備えた)システムとして動作できます。2つの整合性の特徴は、調整可能な整合性と直列可能な整合性です。

調整可能な整合性 

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

整合性レベルは、クライアント・アプリケーションに対して読み取りまたは書き込み成功を報告する必要があるレプリカの数のみを定めます。読み取り操作の場合、読み取り整合性レベルは、データがクライアント・アプリケーションに返される前に、読み取り要求に応答する必要があるレプリカの数を指定します。読み取り操作は、読み取りリペアを使用して、読み取り操作中に検出した古いデータをバックグラウンドで更新します。

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

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

直列化可能な整合性 

ACID用語で言えば、「直列化可能な整合性(シリアル整合性)」とは、軽量トランザクションに対するシリアル(即時)分離レベルです。Cassandraは、複数の行またはテーブルを同時に更新するときに、ロックまたはトランザクション依存関係を使用しません。ただし、操作は、順次実行し、他の操作によって中断されてはならない場合があります。たとえば、一般的な例としてユーザー・アカウントの作成があります。この場合は、複製または上書きが深刻な結果をもたらします。直列化可能な整合性は、ユーザーのアカウントのすべての要素に必要なわけではありませんが、アカウントを断言するユーザーIDや電子メール・アドレスのような固有の識別子は別途処理されます。このようなシリアル操作は、クォーラム(多数決)ベースのアルゴリズムを採用しているPaxos合意プロトコルを使用してCassandraに実装されています。軽量トランザクションは、マスター・データベースや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で読み取りを行います。いずれかのレプリカがダウンします。常に正しいデータを取得できます。