DynamoDB Global Tables でマルチリージョンデータベースを構築 - アクティブ-アクティブレプリケーション

マルチリージョンのアクティブ-アクティブレプリケーションで低レイテンシの読み書きを実現する。コンフリクト解決の仕組みと DR 設計を紹介します。

Global Tables の概要

Global Tables は DynamoDB テーブルを複数リージョンにレプリケーションするマルチリージョンデータベースです。Aurora Global Database がリーダー/ライターの構成であるのに対し、Global Tables は全リージョンで読み書き可能なアクティブ-アクティブ構成を提供します。現行のバージョン 2019.11.21 (V2) では、既定の MREC のレプリカテーブルが通常の DynamoDB テーブルと同じ機能を持ち、ローカルセカンダリインデックスやオンデマンドキャパシティモードも利用できます。レプリカの追加 / 削除もテーブルへの書き込みを停止せずに実行可能です。

レプリケーションと DR

レプリカテーブルはコンソールでリージョンを選んで追加でき、既存データは自動的にレプリケーションされます。既定の整合性のモード MREC (マルチリージョンの結果整合性) では、書き込みは各リージョンのローカルテーブルに実行され、他のリージョンへ非同期でレプリケーションされます。MREC で同一アイテムが複数リージョンで同時に更新された場合、DynamoDB はアイテムごとに内部のタイムスタンプが最新の変更を採用して競合を解決します (last-writer-wins)。DR 設計では Route 53 のヘルスチェックとフェイルオーバーで、プライマリリージョンの障害時にセカンダリリージョンに自動切り替えします。フェイルオーバーの RTO はレプリケーションラグ (通常 1 秒以内) と DNS TTL に依存するため、TTL を 60 秒以下に設定しておくことで切り替え時間を短縮できます。

競合解決とベストプラクティス

MREC の Global Tables は最終書き込み勝ち (Last Writer Wins) の競合解決を採用し、タイムスタンプが最新の書き込みが優先されます。同一アイテムへの同時書き込みが発生する場合、アプリケーション側で楽観的ロック (バージョン番号の条件付き書き込み) を実装して競合を検出します。レプリカ間のレプリケーションレイテンシは通常 1 秒以内ですが、リージョン間の距離に依存します。 Global Tables のストリームは各レプリカで独立して処理されるため、 Lambda トリガーを冪等に処理する設計をとります。

Aurora Global Database との比較

Global Tables と Aurora Global Database はどちらもマルチリージョン構成を提供しますが、アーキテクチャと適用場面が異なります。Global Tables はアクティブ-アクティブで全リージョンが書き込み可能であり、Aurora Global Database はプライマリリージョンのみ書き込み可能な読み取りレプリカ構成です。Global Tables は既定の MREC では非同期のレプリケーションで結果整合性となり、MRSC (マルチリージョンの強い整合性) では書き込みが成功を返す前に少なくとも 1 つの他のリージョンへ同期でレプリケーションされ、Aurora は書き込み転送機能を使えばセカンダリからもプライマリ経由で書き込みが可能です (レイテンシ増加あり)。データモデルの観点では、DynamoDB はキー・バリューとドキュメントモデル、Aurora はリレーショナル SQL を提供します。低レイテンシのキー・バリューアクセスでグローバルにアクティブ-アクティブが必要ならば Global Tables を、複雑な SQL クエリや ACID トランザクションが必要ならば Aurora Global Database を使います。フェイルオーバー時間は Global Tables がレプリケーションラグ + DNS TTL、Aurora がプロモート操作に数十秒を要する点が異なります。

料金 / 制限の注意点

Global Tables のレプリケーション書き込みは通常の書き込みと同じ WCU/WRU で課金されます。2 リージョン構成では書き込みコストが約 2 倍になります。レプリケーションのデータ転送料金は無料です。読み取りは各リージョンのローカルレプリカから実行されるため、追加の読み取りコストは発生しません。書き込みが少なく読み取りが多いワークロードでは、Global Tables のコストの増加は限定的にとどまる場合があります。リージョンごとのキャパシティを独立して設定し、トラフィックパターンに合わせます。テーブルサイズの上限はなく、アイテム数にも制限はありませんが、個々のアイテムは 400 KB 以下である必要があります。パーティションキーの設計が不均一だとレプリケーションのスループットにボトルネックが生じるため、ホットパーティションを避けてパーティションキーを設計します。グローバルセカンダリインデックス (GSI) もレプリカ間でレプリケーションされるため、GSI の書き込みコストも各リージョンで発生します。

まとめ

Global Tables はアクティブ-アクティブのマルチリージョン DynamoDB を提供するサービスです。既定の MREC では、変更は通常 1 秒以内に他のレプリカへ非同期でレプリケーションされ、競合は最終書き込み勝ちで解決されます。読み取りはローカルレプリカから実行され、DR とグローバルな低レイテンシのアクセスの両方に使えます。リレーショナルモデルと ACID トランザクションが必要な場合は Aurora Global Database を検討し、キー・バリューのアクティブ-アクティブ構成には Global Tables を選択します。

参考資料 (AWS 公式)

本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。

本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。

共有する