DynamoDBのメトリック上は問題ないにも関わらずスループット超過エラーが発生

投稿者: | 2016年12月9日

DynamoDBを使用したシステムを運用している際に次のようなエラーが発生しました。
The level of configured provisioned throughput for the table was exceeded.
Consider increasing your provisioning level with the UpdateTable API.
(Service: AmazonDynamoDBv2: Status Code: 400: Error Code: ProvisionedThroughputExceededException: Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX):
com.amazonaws.services.dynamodbv2.model.ProvisionedThroughputExceededException:
The level of configured provisioned throughput for the table was exceeded.
Consider increasing your provisioning level with the UpdateTable API.
(Service: AmazonDynamoDBv2: Status Code: 400: Error Code: ProvisionedThroughputExceededException: Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX):
内容はスループット超過のエラーになります。
そこでAWSのマネジメントコンソールにログインし、DynamoDBのメトリックを確認しました。
しかしメトリックを見る限りはスループットの超過は発生していませんでした。
そこでAWSのサポートに問い合わせをしたところ次のような回答を得られました。
「特定のパーティションに負荷が集中した際にスロットリングが発生しているものと考えております」
要するに、あるパーティションにアクセスが集中しすぎ、スループットの制限を越えてしまったということです。
DynamoDBのテーブルは複数のパーティションで構成されています。
そして設定したスループットはパーティション毎に分散されてしまうようです。
今回の事象で当てはめると、テーブル全体でのスループットは超過していません。
しかし、パーティション毎に設定されたスループットを超過してしまったということです。
このためメトリック上には現れなかったわけです。
ちなみに、正しい使い方をしていればこんな事は発生しません。
今回、DynamoDBを使用する際に2つの間違えを起こしておりました。
1つ目はハッシュキーをばらつきが足りなかったことです。
パーティションはハッシュキーが近いもの同士で分けられます。
同じようなハッシュキーで連続した問い合わせが発生してしまうと特定にパーティションにアクセスが集中します。
2つ目はスループットの大きな上げ下げを実施したことです。
パーティションはスループットの設定値を上げたときに分割されます。
具体的な数値で言うとWriteCapacityUnitsを一時的に3400まで上げ、その後に40まで下げました。
一時的に上げた理由はデータ移行に伴い大量データを投入する必要があったためです。
この2つの間違いにより今回のようなエラーが発生してしまいました。
DynamoDBを使用する際は次の2点に注意してください。
①ハッシュキーをばらけさせること
②スループットの大きな上げ下げはしないこと

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA