🚀

DynamoDB パーティション

2022/07/23に公開

DynamoDB は、パーティションというアーキテクチャーで、ノードや格納データを分割することでスケールする構成を取る。そのため、書き込みや読み込みいずれもスケールアウトできる構成を持つNoSQLデータベース。根幹とも言えるアーキテクチャーであるパーティションに関して諸々まとまる。

パーティション数変更時のダウンタイム有無

パーティション数は特定の条件で決まる(後述)だが、変更はサービスにより自動的、アプリケーションからは透過的に行われるのでアプリケーションから見た時のダウンタイムは無い。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html

パーティション管理は自動的にバックグラウンドで自動的に発生し、アプリケーションに対して透過的です。テーブルは利用可能な状態のままで、プロビジョニングされたスループット要件を完全にサポートします。

パーティションの冗長化

ストレージは自動的にパーティション化され、3AZにレプリケートされることで冗長化される。

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/6

なお、書き込みについては、少なくとも2AZでの書き込みが完了した時点でAckが返却される。
最終的には、結果整合性で全てのAZに反映され、また、更新されたデータを参照できるようになる。

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/9

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html

アプリケーションが DynamoDB テーブルにデータを書き込み、HTTP 200 応答 (OK) を受け取ると、書き込みが開始され、継続します。データは、すべてのストレージの場所で結果的に整合性が保たれます (通常は 1 秒以内)。

パーティションごとの RCU/WCU

テーブルに対して指定するRCU/WCUはテーブル全体の性能値。
そのため、パーティションが複数あれば、スループットは各パーティションに均等分散される。

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/37

パーティション数の計算方法

DynamoDB でパーティションは必要に応じて増えるのでユーザーで意識する必要性はない。ただ、計算方法はある。ストレージサイズやスループットによって決定される。1つのパーティションに対しては、3000RCU/1000WCU/10GBのデータ量の制限があるため、それを基準に分割される。

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/38
https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/39
https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/40

Adaptive Capacity

  • 各パーティションに対してRCU/WCUは均等分散されるのが基本動作だが、もし特定のパーティションに対してアクセスが集中してホットパーティションになってしまうような不均等なワークロードがあったとする。
  • その際に、他のパーティションに割り振られた性能値がMaxまで使用されていなければ余力の性能値をそのホットパーティションで追加で利用できるという機能。
  • ゆえに、仮に不均等なワークロードが発生してホットパーティションが生まれても、スロットリングを回避できる可能性が高まる。
  • DynamoDB にデフォルトで備わっている機能で明示的な有効化不要。逆にいうと無効化する術もない。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-design.html#bp-partition-key-partitions-adaptive

オンデマンドモード時のキャパシティの暖気

この記載や事例を確認する限り、事前に想定のWCU/RCUのプロビジョニングモードにしてからオンデマンドに切り替えることで暖気ができる想定。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.InitialThroughput

オンデマンドキャパシティーモードに切り替えられた既存のテーブル: 前のピークは、テーブルにプロビジョニングされた、最大書き込みキャパシティーユニットおよび最大読み取りキャパシティーユニットの半分、またはオンデマンドキャパシティーモードで新しく作成されたテーブルの設定の、どちらか高い方です。つまり、このテーブルで提供されるスループットは、オンデマンドキャパシティーモードに切り替える前と同じかそれ以上になります。

https://aws.amazon.com/jp/blogs/news/running-spiky-workloads-and-optimizing-costs-by-more-than-90-using-amazon-dynamodb-on-demand-capacity-mode/

このような場合、要件を満たすのに十分な WCU と RCU でプロビジョニングされたテーブルを「事前に温めて」おいてから、テーブルをオンデマンドモードに切り替えます。これは、以前にプロビジョンドモードを使用していたオンデマンドテーブルのキャパシティーを決定する DynamoDB のロジックのおかげで機能するものです。

Discussion