グローバルテーブル: 仕組み - Amazon DynamoDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

グローバルテーブル: 仕組み

以下のセクションでは、Amazon DynamoDB におけるグローバルテーブルの概念および動作について説明します。

グローバルテーブルの概念

グローバルテーブルは 1 つ以上のレプリカテーブルの集合体であり、すべて単一の AWS アカウントが所有します。

レプリカテーブル (または、略してレプリカ) は、グローバルテーブルの一環として機能する単一の DynamoDB テーブルです。各レプリカには、同じデータ項目のセットが保存されます。指定のグローバルテーブルは、AWS リージョンごとに 1 つのレプリカテーブルのみを持つことができます。グローバルテーブルの詳しい使用方法については、チュートリアル: グローバルテーブルの作成 を参照してください。

DynamoDB グローバルテーブルを作成すると、DynamoDB は 1 つの単位として扱う複数のレプリカテーブル (リージョンごとに 1 つ) で構成されます。すべてのレプリカは、同じテーブル名と同じプライマリキーのスキーマを持っています。アプリケーションが 1 つのリージョンのレプリカテーブルにデータを書き込むと、DynamoDB はその書き込みを他の AWS リージョンの他のレプリカテーブルに自動的に伝播します。

レプリカテーブルをグローバルテーブルに追加して、追加のリージョンで使用できるようにすることができます。

バージョン 2019.11.21 (現行) では、あるリージョンでグローバルセカンダリインデックスを作成すると、自動的に他のリージョンにレプリケートされ、自動的にバックフィルされます。

一般的なタスク

グローバルテーブルの一般的なタスクは以下のように機能します。

グローバルテーブルのレプリカテーブルは、通常のテーブルと同じように削除できます。これにより、そのリージョンへのレプリケーションが停止し、そのリージョンに保存されているテーブルコピーが削除されます。レプリケーションを切断して、テーブルのコピーを独立したエンティティとすることはできません。代わりに、グローバルテーブルをそのリージョンのローカルテーブルにコピーしてから、そのリージョンのグローバルレプリカを削除できます。

注記

ソーステーブルは、新しいリージョンの作成に使用されてから 24 時間以上経たないと削除できません。削除を試みるのが早すぎると、エラーが発生します。

アプリケーションが異なるリージョンにある同一項目をほぼ同時に更新すると、競合が発生する可能性があります。結果整合性を確保するために、DynamoDB グローバルテーブルでは同時更新間の調整のために、「最新書き込み優先」方法が使用されます。すべてのレプリカが最新の更新に合意し、すべてのレプリカが同一のデータを持つ状態に収束します。

注記

競合を回避する方法は、以下を含めていくつかあります。

  • 1 つのリージョンのテーブルへの書き込みのみを許可します。

  • 競合が発生しないように、書き込みポリシーに従ってユーザートラフィックを別のリージョンにルーティングします。

  • Bookmark = Bookmark + 1 のような非冪等の更新は避け、Bookmark=25 のような静的な更新を優先する。

  • 書き込みまたは読み取りを 1 つのリージョンにルーティングする必要がある場合、フローが適用されるかどうかはアプリケーション次第であることに注意してください。

グローバルテーブルのモニタリング

CloudWatch を使用して、 メトリクスを監視できますReplicationLatency。これは、項目がレプリカテーブルに書き込まれてから、その項目がグローバルテーブルの別のレプリカに表示されるまでの経過時間を追跡します。ミリ秒単位で表され、ソースリージョンとレプリケーション先リージョンのすべてのペアに対して出力されます。このメトリクスはソースリージョンで保持されます。これは、グローバルテーブル v2 によって提供される唯一の CloudWatch メトリクスです。

レプリケーションのレイテンシーはAWS リージョン、選択した 間の距離やその他の変数によって異なります。元のテーブルが米国西部 (北カリフォルニア) (米国西部-1) リージョンにある場合、米国西部 (オレゴン) (米国西部-2) リージョンなどのより近いリージョンにあるレプリカは、アフリカ (ケープタウン) (af-south-1) リージョンなど、遠く離れたリージョンにあるレプリカと比較してレプリケーションのレイテンシーが低くなります。相互に重力AWS リージョンがある状態で のレプリケーションレイテンシーが 0.5~2.5 秒になることが一般的です。

注記

レプリケーションレイテンシーは API レイテンシーには影響しません。リージョン A にクライアントとテーブルがあり、リージョン B にグローバルテーブルレプリカを追加する場合、リージョン A のクライアントとテーブルのレイテンシーはリージョン B を追加する前と同じになります。リージョン B で PutItem API オペレーションを呼び出すと、最終的には Amazon で利用できるReplicationLatency統計の遅延後にリージョン A で読み取ることができます CloudWatch。レプリケートされる前には空のレスポンスを受信し、レプリケートされた後に項目を受信します。両方の呼び出しの API レイテンシーはほぼ同じになります。

有効期限 (TTL)

Time To Live (TTL) を使用して、項目の有効期限を示す値を含む属性名を指定できます。この値は、Unix エポックの開始からの秒単位の数値として指定します。それ以降は、書き込みコストを発生させることなく項目を削除できます。

グローバルテーブルでは、1 つのリージョンで TTL を設定すると、その設定が他のリージョンに自動的にレプリケートされます。TTL ルールによって項目が削除された場合、その作業はソーステーブルの書き込みユニットを消費することなく実行されますが、ターゲットテーブルにはレプリケーション書き込みユニットのコストが発生します。

ソーステーブルとターゲットテーブルのプロビジョニングされた書き込みキャパシティーが非常に少ない場合、TTL 削除には書き込みキャパシティーが必要となるため、スロットリングが発生する可能性があります。

グローバルテーブルでのストリームとトランザクション

各グローバルテーブルは、書き込みの開始点に関係なく、すべての書き込みに基づいて独立したストリームを生成します。この DynamoDB ストリームを 1 つのリージョンで使用するか、すべてのリージョンで個別に使用するかを選択できます。

レプリケートされた書き込みではなくローカル書き込みを処理する場合は、各項目に独自のリージョン属性を追加できます。次に、Lambda イベントフィルターを使用して、ローカルリージョンへの書き込みに対して Lambda のみを呼び出すことができます。

トランザクションオペレーションは、書き込みが最初に行われたリージョン内でのみ、不可分性、一貫性、分離性、耐久性 (ACID) を保証します。グローバルテーブルのリージョン間では、トランザクションはサポートされていません。

例えば、米国東部 (オハイオ) リージョンと米国西部 (オレゴン) リージョンにレプリカを含むグローバルテーブルがあり、米国東部 (オハイオ) リージョンで TransactWriteItems オペレーションを実行する場合、変更がレプリケートされると、米国西部 (オレゴン) リージョンで部分的に完了したトランザクションが観察されることがあります。変更は、ソースリージョンでコミットされると、他のリージョンにのみレプリケートされます。

注記
  • グローバルテーブルは DynamoDB を直接更新することで、DynamoDB Accelerator を「書き込み迂回」します。その結果、DAX は古いデータを保持していることを認識しません。DAX キャッシュは、キャッシュの TTL が期限切れになったときにのみ更新されます。

  • グローバルテーブルのタグは自動的には伝播されません。

読み取りおよび書き込みスループット

グローバルテーブルは、次の方法で読み取りと書き込みのスループットを管理します。

  • 書き込みキャパシティーは、リージョン間のすべてのテーブルインスタンスで同じでなければなりません。

  • バージョン 2019.11.21 (現行) では、テーブルが自動スケーリングをサポートするように設定されているか、オンデマンドモードになっている場合、書き込みキャパシティーは自動的に同期されます。つまり、1 つのテーブルへの書き込みキャパシティーの変更は、他のテーブルにもレプリケートされます。

  • 読み取りキャパシティーはリージョンによって異なる場合があります。これは、読み取りキャパシティーが等しくない場合があるためです。グローバルレプリカをテーブルに追加すると、ソースリージョンのキャパシティーが反映されます。作成後、1 つのレプリカの読み込みキャパシティーを調整できますが、この新しい設定はもう 1 つのレプリカには転送されません。

整合性と競合の解決

レプリカテーブル内の項目に加えられた変更は、同じグローバルテーブル内の他のすべてのレプリカにレプリケートされます。グローバルテーブルでは、新しく書き込まれた項目は通常、1 秒以内にすべてのレプリカテーブルに伝播されます。

グローバルテーブルでは、各レプリカテーブルには同じデータ項目のセットが保存されます。DynamoDB では、一部の項目のみの部分的なレプリケーションはサポートされていません。

アプリケーションは、任意のレプリカテーブルとの間でデータを読み込みおよび書き込みできます。アプリケーションが結果整合性のある読み込みのみを使用し、1 つの AWS リージョンに対して読み込みのみを発行する場合、変更を加えずに動作します。ただし、アプリケーションで強力な整合性のある読み込みが必要な場合は、同じリージョンですべての強力な整合性のある読み込みと書き込みを実行する必要があります。DynamoDB は、リージョン間での強力な整合性のある読み込みをサポートしていません。したがって、あるリージョンに書き込んで別のリージョンから読み込む場合、読み込みの応答には、他のリージョンで最近完了した書き込みの結果を反映していない古いデータが含まれる可能性があります。

アプリケーションが異なるリージョンにある同一項目をほぼ同時に更新すると、競合が発生する可能性があります。結果整合性を確保するために、DynamoDB グローバルテーブルでは最終書き込み者優先を使用して、同時更新間の調整を行い、DynamoDB は最終書き込み者を判断するために最善を尽くします。これは項目レベルで実行されます。この競合解決メカニズムでは、すべてのレプリカが最新の更新に合意し、すべてのレプリカが同一のデータを持つ状態に収束します。

可用性と耐久性

単一の AWS リージョンが分離または低下した場合、アプリケーションは別のリージョンにリダイレクトし、別のレプリカテーブルに対して読み込みと書き込みを実行できます。カスタムビジネスロジックを適用して、リクエストを他のリージョンにリダイレクトするタイミングを決定できます。

リージョンが分離または縮退した場合、DynamoDB は、実行されたが、まだすべてのレプリカテーブルに反映されていない書き込みを追跡します。リージョンがオンラインに戻ると、DynamoDB はそのリージョンから他のリージョンのレプリカテーブルへの保留中の書き込みの伝播を再開します。また、他のレプリカテーブルから現在オンラインに戻っているリージョンへの書き込みの伝播も再開します。