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

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

Global Tables の概要

Global Tables は DynamoDB テーブルを複数リージョンにレプリケーションするマルチリージョンデータベースです。Aurora Global Database がリーダー/ライターの構成であるのに対し、Global Tables は全リージョンで読み書き可能なアクティブ-アクティブ構成を提供します。

レプリケーションと DR

レプリカテーブルの追加はコンソールからリージョンを選択するだけで、既存データが自動的にレプリケーションされます。書き込みは各リージョンのローカルテーブルに実行され、非同期で他リージョンにレプリケーションされます。同一アイテムが複数リージョンで同時に更新された場合、last-writer-wins (タイムスタンプが最新の書き込みが優先) で自動解決されます。DR 設計では Route 53 のヘルスチェックとフェイルオーバーで、プライマリリージョンの障害時にセカンダリリージョンに自動切り替えします。

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

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

Global Tables の料金

Global Tables のレプリケーション書き込みは通常の書き込みと同じ WCU/WRU で課金されます。2 リージョン構成では書き込みコストが約 2 倍になります。レプリケーションのデータ転送料金は無料です。読み取りは各リージョンのローカルレプリカから実行されるため、追加の読み取りコストは発生しません。書き込みが少なく読み取りが多いワークロードでは、Global Tables のコスト増加は限定的です。リージョンごとのキャパシティを独立して設定し、トラフィックパターンに合わせて最適化します。

まとめ

Global Tables はアクティブ-アクティブのマルチリージョン DynamoDB を提供するサービスです。1 秒以内のレプリケーションレイテンシでリージョン間のデータ同期を実現し、最終書き込み勝ちの競合解決で整合性を維持します。読み取りはローカルレプリカから実行されるため追加コストが限定的で、DR とグローバルな低レイテンシアクセスを同時に実現します。