DynamoDB Global Tables でマルチリージョンデータベースを構築 - アクティブ-アクティブレプリケーション
マルチリージョンのアクティブ-アクティブレプリケーションで低レイテンシの読み書きを実現する。コンフリクト解決の仕組みと DR 設計を紹介します。
Global Tables の概要
Global Tables は DynamoDB テーブルを複数リージョンにレプリケーションするマルチリージョンデータベースです。Aurora Global Database がリーダー/ライターの構成であるのに対し、Global Tables は全リージョンで読み書き可能なアクティブ-アクティブ構成を提供します。2022 年にリリースされたバージョン 2019.11.21 (V2) では、レプリカテーブルが通常の DynamoDB テーブルと同じ機能を持ち、ローカルセカンダリインデックスやオンデマンドキャパシティモードも利用できます。レプリカの追加・削除もテーブルへの書き込みを停止せずに実行可能です。
レプリケーションと DR
レプリカテーブルの追加はコンソールからリージョンを選択するだけで、既存データが自動的にレプリケーションされます。書き込みは各リージョンのローカルテーブルに実行され、非同期で他リージョンにレプリケーションされます。同一アイテムが複数リージョンで同時に更新された場合、last-writer-wins (タイムスタンプが最新の書き込みが優先) で自動解決されます。DR 設計では Route 53 のヘルスチェックとフェイルオーバーで、プライマリリージョンの障害時にセカンダリリージョンに自動切り替えします。フェイルオーバーの RTO はレプリケーションラグ (通常 1 秒以内) と DNS TTL に依存するため、TTL を 60 秒以下に設定しておくことで切り替え時間を短縮できます。
競合解決とベストプラクティス
Global Tables は最終書き込み勝ち (Last Writer Wins) の競合解決を採用し、タイムスタンプが最新の書き込みが優先されます。同一アイテムへの同時書き込みが発生する場合、アプリケーション側で楽観的ロック (バージョン番号の条件付き書き込み) を実装して競合を検出します。レプリカ間のレプリケーションレイテンシは通常 1 秒以内ですが、リージョン間の距離に依存します。 Global Tables のストリームは各レプリカで独立して処理されるため、 Lambda トリガーの冪等性を確保する設計が重要です。 マルチリージョンの設計と運用を深く理解するには、専門書籍 (Amazon)が役立ちます。
Aurora Global Database との比較
Global Tables と Aurora Global Database はどちらもマルチリージョン構成を提供しますが、アーキテクチャと適用場面が異なります。Global Tables はアクティブ-アクティブで全リージョンが書き込み可能であり、Aurora Global Database はプライマリリージョンのみ書き込み可能な読み取りレプリカ構成です。Global Tables はレプリケーションが非同期で結果整合性であるのに対し、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 を提供するサービスです。1 秒以内のレプリケーションレイテンシでリージョン間のデータ同期を実現し、最終書き込み勝ちの競合解決で整合性を維持します。読み取りはローカルレプリカから実行されるため追加コストが限定的で、DR とグローバルな低レイテンシアクセスを同時に実現します。リレーショナルモデルと ACID トランザクションが必要な場合は Aurora Global Database を検討し、キー・バリューのアクティブ-アクティブ構成には Global Tables を選択します。