DynamoDB Global Tableを試す #reinvent

2017.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

DynamoDB Global Tableが発表されました。

リージョン間でのマルチマスターデータベースとなります。マルチマスターはすごい。

【速報】DynamoDB Global Tablesが発表されました! #reinvent

さっそく使うときのポイントをまとめつつ、触ってみました。

一貫性と競合

マルチマスターということで、各リージョンのエンドポイントから書き込み読み込みが実行できます。そうなるとデータベースとして一貫性がどうなっているというところが気になりますね。 データは数秒以内にリージョン間で同期されますが、一貫性はどうなっているのでしょうか。

まず、リージョン内でについては、今までのDynamoDBと同じで読み取りの結果整合性または強い整合性を選択できます。リージョン間については、強い整合性をサポートしていないので結果整合性のみとなります。

次に競合です。各リージョンで同じデータに書き込みを行なった場合です。RDBMSではデータがロックされ、同じデータを同時に処理しないように考慮されます。DynamoDB Global Tableの場合は、最終的に書き込みした人のデータが残ります。つまり、AとBがほぼ同時に書き込んだ場合、時間を比較し最終的に書き込みした方のデータが保存されます。一時的にはリージョン間でデータが異なる瞬間がありますが、最終的には最終書き込みしたデータがレプリケーションされデータが同じになった時点で事象が収束します。

可用性と耐久性

リージョンで障害があった場合は、別リージョンへ読み書きする必要があります。そのため、アプリケーションにてリダイレクトする処理を追加します。 障害が復旧した場合は、伝搬できなかったデータのレプリケーションが双方向で再開します。

レプリカテーブルの作成要件

  • プライマリキーが同じ必要がある
  • テーブル名が同じ必要がある
  • DynamoDBストリームを有効にする必要がある
  • 空のテーブルである必要があります(データが入っていると設定ができません)

モニタリング

CloudWatchにてレプリケーションの状況を確認できまます。

ReplicationLatency

レプリケーションのラグを表示。ミリ秒。複数リージョン利用している場合は、ペアごとにレイテンシが表示されます。例えば、アプリケーションでこのレイテンシを監視し、レイテンシが大きくなった場合に別リージョンのエンドポイントへ読み書きをフェイルオーバーするようなアプリケーションも作成可能です。(カスタムアプリケーション)

PendingReplicationCount

レプリケーションが未実施のアイテムの数。複数リージョン利用している場合は、ペアごとにレイテンシが表示されます。このアイテム数が大きくなる場合は、キャパシティを見直す必要があるかもしれません。アプリケーションでレプリケーション未実施数を確認し、大きくなった場合に別リージョンのエンドポイントへ読み書きをフェイルオーバーするようなアプリケーションも作成可能です。(カスタムアプリケーション)

やってみた

操作は驚くほど簡単です。

テーブルを選択肢、タブから「グローバルテーブル」を選択します。

「リージョン追加」より、任意のリージョンを選択します。

以上です!

各リージョンでそれぞれ書き込み、読み込みを行なってみました。

  • バージニアのテーブルでid:1を追加
  • フランクフルトのテーブルでid:2を追加

バージニア、フランクフルトそれぞれのテーブルでid1、id2が追加されていることが確認できました。

データをアップデートしたリージョン、アップデートした時間も同時に記録されていました。書き込みが競合した場合にこの時間をベースに最後の書き込みが優先されるのかなと思います。

最後に

AZ間かと思うほどの操作間でした。これが、国を跨いでレプリケーションされて、かつマルチマスターということに本当に驚きです。 グローバルアプリケーションは、データの同期に悩むことが多いですが、ひとつの解決策としてとても有効だと思います。

参考

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html