DynamoDB Global Tableを試す #reinvent
コンニチハ、千葉です。
DynamoDB Global Tableが発表されました。
リージョン間でのマルチマスターデータベースとなります。マルチマスターはすごい。
さっそく使うときのポイントをまとめつつ、触ってみました。
一貫性と競合
マルチマスターということで、各リージョンのエンドポイントから書き込み読み込みが実行できます。そうなるとデータベースとして一貫性がどうなっているというところが気になりますね。 データは数秒以内にリージョン間で同期されますが、一貫性はどうなっているのでしょうか。
まず、リージョン内でについては、今までの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