StorageGRID S3 REST APIが可用性と一貫性のバランスをとる方法
一貫性とは、オブジェクトの可用性と、異なるストレージノードやサイト間でのオブジェクトの一貫性とのバランスを取るものです。アプリケーションの要件に応じて、一貫性を変更できます。
デフォルトでは、StorageGRID は新しく作成されたオブジェクトについて、書き込み後の読み取りの一貫性を保証します。PUT が正常に完了した後に行われる GET リクエストは、新しく書き込まれたデータを読み取ることができます。既存オブジェクトの上書き、メタデータの更新、および削除は、最終的に整合性が保たれます。
オブジェクト操作を異なる整合性で実行する場合は、次の操作を実行できます。
一貫性値
一貫性は、StorageGRIDがオブジェクトの追跡に使用するメタデータがノード間でどのように分散されるかに影響します。一貫性は、クライアントリクエストに対するオブジェクトの可用性に影響します。
バケットまたはAPI操作の一貫性は、以下のいずれかの値に設定できます:
-
すべて:すべてのノードがオブジェクトメタデータを即座に受信します。受信しない場合、リクエストは失敗します。
-
Strong-global: すべてのサイトにおけるすべてのクライアントリクエストに対して、書き込み後の読み取りの一貫性を保証します。Quorumのセマンティクスが設定されている場合、以下の動作が適用されます:
-
グリッドに3つ以上のサイトがある場合、クライアント要求に対するサイト障害の耐性を確保します。2サイトグリッドにはサイト障害の耐性はありません。
-
1つのサイトがダウンしている場合、以下のS3操作は成功しません:
-
DeleteBucketEncryption
-
PutBucketBranch
-
PutBucketEncryption
-
PutBucketVersioning
-
PutObjectLegalHold
-
PutObjectLockConfiguration
-
PutObjectRetention
-
-
-
Strong-site: オブジェクトのメタデータは、サイト内の他のノードに即座に配信されます。サイト内のすべてのクライアントリクエストに対して、書き込み後の読み取りの一貫性を保証します。
-
新規書き込み後の読み取り:新規オブジェクトに対して書き込み後の読み取りの一貫性を提供し、オブジェクトの更新に対して結果整合性を提供します。高可用性とデータ保護を保証します。ほとんどの場合に推奨されます。
-
利用可能:新規オブジェクトとオブジェクト更新の両方に対して、最終的な一貫性を提供します。S3バケットの場合は、必要な場合にのみ使用してください(たとえば、めったに読み取られないログ値を含むバケット、または存在しないキーに対するHEADまたはGET操作の場合など)。S3 FabricPoolバケットではサポートされていません。
「新規書き込み後の読み取り」と「利用可能」の整合性を使用する
HEAD または GET 操作で「Read-after-new-write」整合性を使用する場合、StorageGRID は以下の複数のステップで検索を実行します。
-
まず、低い一貫性を使用してオブジェクトを検索します。
-
その検索が失敗した場合、次の整合性値で検索を繰り返し、strong-global の動作と同等の整合性に達するまで続けます。
HEAD または GET 操作で「新規書き込み後の読み取り」整合性が使用されている場合でも、オブジェクトが存在しない場合は、オブジェクトの検索は常に strong-global の動作と同等の整合性に達します。この整合性を維持するには、各サイトにオブジェクトメタデータの複数のコピーが必要となるため、同じサイトにある 2 つ以上のストレージノードが利用できない場合、500 Internal Server Error が多数発生する可能性があります。
Amazon S3 と同様の整合性保証が不要な場合は、整合性を「Available」に設定することで、HEAD および GET 操作でこれらのエラーが発生するのを防ぐことができます。HEAD または GET 操作で「Available」整合性を使用する場合、StorageGRID は最終的な整合性のみを提供します。失敗した操作をより高い整合性で再試行しないため、オブジェクトメタデータの複数のコピーを用意する必要はありません。
API操作の整合性の指定
個々のAPI操作の一貫性を設定するには、その操作で一貫性の値がサポートされている必要があり、リクエストヘッダーで一貫性を指定する必要があります。この例では、GetObject操作の一貫性を「Strong-site」に設定します。
GET /bucket/object HTTP/1.1 Date: date Authorization: authorization name Host: host Consistency-Control: strong-site
|
|
PutObject と GetObject の両方の操作に同じ整合性を使用する必要があります。 |
バケットの整合性を指定する
バケットの整合性を設定するには、StorageGRID "PUT Bucketの一貫性" リクエストを使用します。または、Tenant Manager から "バケットの整合性を変更する" することもできます。
バケットの整合性を設定する際には、以下の点に注意してください。
-
バケットの整合性を設定することで、バケット内のオブジェクトまたはバケット構成に対して実行されるS3操作に使用される整合性が決まります。これはバケット自体の操作には影響しません。
-
個々のAPI操作の一貫性は、バケットの一貫性よりも優先されます。
-
一般的に、バケットはデフォルトの整合性設定である「新規書き込み後の読み取り」を使用する必要があります。リクエストが正しく機能しない場合は、可能であればアプリケーションクライアントの動作を変更してください。または、クライアント側で各 API リクエストの整合性を指定するように設定することもできます。バケットレベルでの整合性の設定は、最終手段としてのみ行ってください。
一貫性とILMルールがデータ保護に与える影響
一貫性の選択とILMルールは、どちらもオブジェクトの保護方法に影響を与えます。これらの設定は相互に影響し合う可能性があります。
例えば、オブジェクトを保存する際に使用される一貫性は、オブジェクトメタデータの初期配置に影響を与え、ILMルールで選択された取り込み動作は、オブジェクトコピーの初期配置に影響を与えます。StorageGRID がクライアントの要求を満たすためにオブジェクトのメタデータとデータの両方へのアクセスを必要とするため、一貫性と取り込み動作に対して適切なレベルの保護を選択することで、より優れた初期データ保護とより予測可能なシステム応答を実現できます。
次の"取り込みオプション"は、ILMルールで使用できます:
- Dual commit
-
StorageGRID はオブジェクトの暫定コピーを即座に作成し、クライアントに成功を返します。ILM ルールで指定されたコピーは、可能な場合に作成されます。
- 厳格
-
ILMルールで指定されたすべてのコピーは、クライアントに成功が返される前に作成される必要があります。
- バランス
-
StorageGRID は、取り込み時に ILM ルールで指定されたすべてのコピーを作成しようとします。それが不可能な場合は、中間コピーが作成され、クライアントに成功が返されます。ILM ルールで指定されたコピーは、可能な場合に作成されます。
一貫性とILMルールがどのように相互作用するかの例
次のILMルールと次の整合性を持つ3サイトグリッドがあるとします。
-
ILMルール:オブジェクトのコピーを3つ作成します。1つはローカルサイトに、残りの2つは各リモートサイトにそれぞれ1つずつ作成します。厳密な取り込み動作を使用します。
-
一貫性:Strong-global(オブジェクトのメタデータは複数のサイトに即座に配信されます)。
クライアントがオブジェクトをグリッドに保存すると、StorageGRID はオブジェクトのコピーを3つすべて作成し、メタデータを複数のサイトに配布してから、クライアントに成功を返します。
取り込み成功メッセージの時点で、オブジェクトは損失から完全に保護されます。例えば、取り込み直後にローカルサイトが失われた場合でも、オブジェクトデータとオブジェクトメタデータの両方のコピーがリモートサイトに残ります。オブジェクトは他のサイトから完全に取得可能です。
代わりに同じILMルールとstrong-siteの整合性を使用した場合、オブジェクトデータがリモートサイトにレプリケートされた後、オブジェクトのメタデータがそこに配布される前に、クライアントは成功メッセージを受信する可能性があります。この場合、オブジェクトメタデータの保護レベルは、オブジェクトデータの保護レベルと一致しません。取り込み直後にローカルサイトが失われた場合、オブジェクトのメタデータは失われます。オブジェクトを取得できません。
整合性とILMルールの相互関係は複雑になる場合があります。サポートが必要な場合は、NetAppにお問い合わせください。