上級読了 3 分

DynamoDB Global Tables:マルチリージョンレプリケーション解説

グローバルテーブル とは、複数の AWS リージョンにまたがって複製された単一の DynamoDB テーブルで、すべてのレプリカが書き込み可能です。DynamoDB はそれらを自動的に同期に保ちます — 各リージョンで低レイテンシのローカルな読み書きに加えて、自前のレプリケーションを運用する ことなくクロスリージョンの災害復旧を得られます。

監査ログのシナリオでは、EU の顧客が自分のデータを eu-west-1 に置くことを要求し、残りは us-east-1 で動いています。そしてコンプライアンス上重要なログとして、リージョン全体の 障害を生き延びる必要があります。グローバルテーブルは、その両方に 1 つの機能で答えます。

DynamoDB グローバルテーブルはどう機能するのか?

DynamoDB グローバルテーブルは、複数の AWS リージョンにまたがって複製された単一のテーブルで、すべてのレプリカが読み書き可能です。DynamoDB は のある非同期レプリケーションでそれらを自動的に同期し、競合を last-writer-wins で解決します。リージョンごとの低レイテンシのローカルな読み書きに加えて、クロスリージョンの災害復旧を得られ、これが DynamoDB の 99.999% の可用性 SLA を支えます。

  • マルチリージョン、アクティブ-アクティブ。 各レプリカは完全に読み書き可能で、どの リージョンへの書き込みも他のリージョンへ伝播します。
  • デフォルトモードでは、レプリケーションは非同期で がある — リージョン間で通常 1 秒以内ですが、瞬時ではありません。(強い整合性モードも存在します — 下記参照。)
  • 競合は last-writer-wins で解決される。 2 つのリージョンで同じアイテムへの並行書き込みが あると、最も新しいものに調停されます。
  • 99.999% の可用性 SLA を支える — マルチリージョンのグローバルテーブルは DynamoDB の 最高可用性構成です。

問題:1 つのリージョンでは足りない

シングルリージョンのテーブルには、監査ログが受け入れられない 2 つの限界があります。第一に、 データレジデンシー:EU の顧客のイベントは EU に保存されなければなりませんが、アプリは US で動いています。第二に、災害復旧us-east-1 に障害があると、シングルリージョンの 監査ログはその間ずっと読めず書けなくなります — まさに、何が起こったかの記録が最も必要な ときにです。

どちらかを自前で構築すること — クロスリージョンのレプリケーション、フェイルオーバー、競合 処理 — は、大規模でエラーを起こしやすいプロジェクトです。グローバルテーブルはそれを構成上の 選択にします。

レプリケーションの仕組み

テーブルに レプリカリージョン を追加すると、DynamoDB はそこにコピーを作成し、すべての レプリカを同期に保ちます。

デフォルト(MREC)の振る舞いを定義する整合性ルールが 2 つあります。

  • クロスリージョンのレプリケーションは非同期。 us-east-1 への書き込みはローカルで 承認され、その後 eu-west-1 へ伝播されます — 通常 1 秒以内ですが、書き込み直後に別の リージョンで読み取ると、まだそれが見えないことがあります。(デフォルトの MREC モードでは、 強い は依然として機能しますが、単一リージョン でのみです。)
  • 競合は last-writer-wins。 ほぼ同時に 2 つのリージョンで同じアイテムが書き込まれると、 DynamoDB は最新のタイムスタンプを持つ書き込みを保持し、もう一方を破棄します。
非同期レプリケーション ~1秒us-east-1監査ログのレプリカ(読み +書き)eu-west-1監査ログのレプリカ(読み +書き)

実践例:DR も兼ねる EU レプリカ

監査ログのテーブルのレプリカとして eu-west-1 を追加します。すると:

write regionitemvisible in
us-east-1TENANT#acmeEVENT#…#a1both regions (~1s lag to EU)
eu-west-1TENANT#bmwEVENT#…#e7both regions (~1s lag to US)

EU の顧客のアプリはローカルの eu-west-1 レプリカに書き、そこから読みます — 低レイテンシで、 データはリージョン内に常駐します。レジデンシーを満たすのと同じレプリケーションが 災害 復旧 も兼ねます。us-east-1 がダウンしても、eu-west-1 のレプリカはなお完全なログを 保持しトラフィックを処理します。そこへフェイルオーバーします。

監査ログは 追記専用でテナントごとにパーティション分けされている ため、last-writer-wins は ここでは本質的に問題になりません — 特定のテナントのイベントは 1 つのリージョンから書かれ、 イベントキーは一意なので、2 つのリージョンが同じアイテムで競合することはめったにありません。 それは幸運ではありません。追記専用のログがグローバルテーブルに最もきれいに適合するものの 1 つである理由です。対照的に、可変のカウンターは、並行するクロスリージョン書き込みの下で 注意を要します。

DynoTable でやってみる

レプリカを追加した後、データが実際に新しいリージョンに着地しソースと一致していること — EU レプリカが本当に acme のイベントを、正しい属性で保持し、遅れていないこと — を確認したく なります。

DynoTable は独自の認証情報でどのリージョンにも接続するので、1 つのウィンドウを us-east-1 に、別のウィンドウを eu-west-1 に向けて、同じテナントのアイテムを並べて比較し、 レプリケーションを検証できます。

DynoTable で us-east-1 レプリカを検証している様子 — テナントでクエリした acme の監査イベント。
DynoTable で us-east-1 レプリカを検証している様子 — テナントでクエリした acme の監査イベント。

各レプリカに対して実行するリージョンごとのクエリは、DynamoDB 式ビルダー でプロトタイプできます。

落とし穴と次のステップ

  • リージョンをまたいで read-your-own-write をしない。 レプリケーション遅延は、あるリー ジョンへの書き込みが別のリージョンに ~1 秒現れないことを意味します。US に書いてすぐに EU から読み、それが見えると期待してはいけません。デフォルトの MREC モードでは、強い整合性の ある読み取りは単一リージョン内でのみ機能します。MRSC は強い読み取りをリージョンをまたいで 拡張します。
  • last-writer-wins は静かにデータを落とす。 2 つのリージョンで並行して書き込まれる可変 アイテムでは、敗者はエラーなしで破棄されます。追記専用またはアイテムごとに単一の書き手の 設計(このような監査ログ)は問題を回避します。共有された可変状態には、競合を意識した設計が 必要です。
  • すべてのレプリカにコストがかかる。 各リージョンが完全なコピーを保存し、自身のキャパ シティとストレージを課金します — レプリカはおおよそコストを 2 倍にします。実際のレジデン シーや DR の必要のためにリージョンを追加し、デフォルトで追加しないでください。
  • バックアップはレプリカごと。 復元されたグローバルテーブルは独立したテーブルになります — リージョンごとに復旧を計画してください。 バックアップとポイントインタイムリカバリ を参照。

グローバルテーブルはリージョンを失うことから守ります。最後の運用上の懸念は データ を 失うこと — 不正なデプロイや誤削除 — から守ることで、これは バックアップとポイントインタイムリカバリ で行います。

DynoTable をダウンロード して複数のリージョンに接続し、グローバルテーブルの レプリカが同じデータを保持していることを検証しましょう。

更新日