Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DynamoDB でスロットリングが発生したとき_大盛りver/when_throttling...

emi
November 20, 2024

DynamoDB でスロットリングが発生したとき_大盛りver/when_throttling_occurs_in_dynamodb_long

2024/11/21(木)
クラメソさっぽろIT勉強会 (仮) #6:パフォーマンスチューニング
https://classmethod.connpass.com/event/333630/

大盛り ver です。

emi

November 20, 2024
Tweet

More Decks by emi

Other Decks in Technology

Transcript

  1. 2 目次 • Purpose Built Database • DynamoDB とは •

    DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  2. 3 Purpose Built Database • Purpose Built Database • DynamoDB

    とは • DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  3. 6 Purpose Built Database • 最新のアプリケーション要件 • より多くのパフォーマンス、 拡張性、可用性が必要 •

    アプリのアーキテクチャと パターンも進化 同時アクセス メディアストリーミング オンラインゲーム 電子商取引 医療 : クライアント・サーバー Web 3 層 マイクロサービスアーキテクチャ :
  4. 7 Purpose Built Database • Purpose-built databases(目的特化型データベース) • 特定のユースケースやワークロードに最適化されたデータベース •

    汎用的なデータベースで全ての要件を満たそうとするのではなく、用途に 応じて最適なデータベースを選択する • より良いパフォーマンス、スケーラビリティ、コスト効率を実現
  5. 8 Purpose Built Database • 例えば… • DynamoDB は高スループットが必要なワークロード向け •

    DocumentDB は半構造化データの管理向け • Timestream は IoT センサーデータなどの時系列データ向け など
  6. 9 DynamoDB とは • Purpose Built Database • DynamoDB とは

    • DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  7. 11 DynamoDB とは • AWS で提供されているフルマネージドの NoSQL データベース • 1

    つ、もしくは 2 つのキーで構成される Key-Value Store • 高速なレスポンス(1 桁ミリ秒単位) • データ量が増えても自動的にスケール • Key に使っているもの以外はスキーマレスなため 柔軟なデータ構造を持つことができる • RDB のような複雑な結合操作はできない、検索が苦手
  8. 14 DynamoDB とは • DynamoDB で設定できるキーの種類 • プライマリキー • パーティションキー(旧ハッシュキー)※必須

    • ソートキー(旧レンジキー)※オプション • セカンダリインデックス ※オプション • ローカルセカンダリインデックス(LSI) • グローバルセカンダリインデックス(GSI) 本 LT では 詳細は省きます
  9. 18 DynamoDB とは - キャパシティユニット • 読み込みキャパシティユニット (Read Capacity Unit、RCU)

    • 最大サイズが 4KB のアイテムについて • 1 秒あたり 1 回の強力な整合性のある読み込み = 1RCU 消費 • 1 秒あたり 2 回の結果整合性のある読み込み = 1RCU 消費
  10. 19 DynamoDB とは - キャパシティユニット • 書き込みキャパシティユニット (Write Capacity Unit、WCU)

    • 最大サイズが 1 KB の項目について、 • 1 秒あたり 1 回の書き込み = 1WCU 消費
  11. 21 DynamoDB とは - キャパシティモード • 用途に合わせて以下 2 種類のキャパシティモードから設定 •

    プロビジョンド (キャパシティ) モード • DynamoDB のテーブルにあらかじめキャパシティユニットを割り当てておく • 常にプロビジョニングした分の料金を支払う • オンデマンド (キャパシティ) モード • システムの書き込み・読み込みリクエストに応じて自動で キャパシティユニットを増減する • 発生した読み込み、書き込みに応じて支払う • ユーザーは「最大キャパシティユニット」を指定するだけ
  12. 22 DynamoDB とは - キャパシティモード • DynamoDB の Auto Scaling

    • プロビジョンドキャパシティユニットを Auto Scaling する
  13. 24 DynamoDB とは - キャパシティモード • DynamoDB の Auto Scaling

    • プロビジョンドキャパシティユニットを Auto Scaling する • プロビジョンドモードの Auto Scaling では、ユーザーが 「ターゲット使用率 (%)」を指定 • 消費されたキャパシティが設定したターゲット使用率を 2 分間連続して 超過すると、自動スケーリングがトリガーされ、プロビジョンド キャパシティユニットが自動増加する • オンデマンドキャパシティモードよりユーザーがスケーリングを制御しやすい • 消費されたプロビジョンドスループットを 1 分間隔で CloudWatch に 出力しているが、15 個の連続するデータポイントがターゲット使用率を 下回ると、スケールダウンイベントが発生
  14. 27 DynamoDB とは - パーティショニング • DynamoDB では大量データを高速処理するため、 パーティショニングによる分散処理を行っている •

    「パーティション」と呼ばれる分割された小さな領域(ストレージ)に、 アイテムを分散して格納
  15. 28 DynamoDB とは - パーティショニング • DynamoDB に格納されたアイテムはパーティションキーによって決められた パーティションに分散して格納される •

    パーティションキーにハッシュ関数をかけたハッシュ値に基づいて アイテムが格納されるパーティションが決まる
  16. 29 DynamoDB とは(P13 再掲) • AWS で提供されているフルマネージドの NoSQL データベース •

    1 つ、もしくは 2 つのキーで構成される Key-Value Store • 高速なレスポンス(1 桁ミリ秒単位) • データ量が増えても自動的にスケール • Key に使っているもの以外はスキーマレスなため 柔軟なデータ構造を持つことができる • RDB のような複雑な結合操作はできない、検索が苦手
  17. 30 DynamoDB とは - パーティショニング ハッシュ関数によって別々の パーティションに アイテムが分散される パーティションをまたいだ 検索をするには

    全体をフルスキャンするなどの 非効率な方法をとるか、 グローバルセカンダリインデックス を設定するなどの対応をしないと いけない GSI はテーブルの読み込みとは別に 課金が発生する
  18. 31 DynamoDB とは - パーティショニング • パーティション分割は AWS の内部的に行われるため、 ユーザーが指定したり管理したりできない

    • つまり、パーティションをユーザーが増やしたり減らしたり、 パーティション数を直接指定したりできない • 現在のパーティション数をユーザーが把握することはできないが、 2017 年の古い BlackBelt 資料 PDF 35 ページ以降に パーティション数の計算方法が記載されているため 机上である程度割り出すことは可能 • 2017/08/09 AWS Black Belt Online Seminar 2017 Amazon DynamoDB
  19. 33 DynamoDB でパフォーマンスが出ない! • Purpose Built Database • DynamoDB とは

    • DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  20. 35 DynamoDB でパフォーマンスが出ない! • 構成によって原因は様々考えられるが、DynamoDB としてはまず スロットリングが発生していないか確認する • スロットリング (throttling)

    とは • システムの過負荷や特定のアクセスによるリソース独占を回避するため、 一定の制限値を超えた場合に意図的に性能を低下させたり、 要求を一時的に拒否したりする制御のこと
  21. 36 DynamoDB でパフォーマンスが出ない! • スロットリングの確認方法(CloudWatchメトリクス) • ThrottledRequests • スロットリングされたリクエストの総数。読み取り/書き込み両方を含む •

    ReadThrottleEvents • 読み取りキャパシティ不足でスロットリングされた回数。プロビジョニングした読み取り容量を超過 • WriteThrottleEvents • 書き込みキャパシティ不足でスロットリングされた回数。プロビジョニングした書き込み容量を超過 • ConsumedReadCapacityUnits • 実際に消費された読み取りキャパシティユニット(RCU)。プロビジョニング容量に対する使用量を確認可能 • ConsumedWriteCapacityUnits • 実際に消費された書き込みキャパシティユニット(WCU)。プロビジョニング容量に対する使用量を確認可能 CloudWatch メトリクスを使用したスロットリング問題の調査 - Amazon DynamoDB
  22. 39 DynamoDB でパフォーマンスが出ない!(余談) DynamoDB バーストキャパシティとアダプティブキャパシティ - Amazon DynamoDB • DynamoDB

    にはバーストキャパシティがある • 利用可能なスループットを使い切っていない場合、キャパシティの未使用分を 最大 5 分 (300 秒) 蓄えておき、後のスループットのバースト(スパイク)時に消費することで 対応する • テーブルに定義した 1 秒あたりのプロビジョンドスループットキャパシティよりも高速 • WCU や RCU を少し上回るくらいでは貯蓄された余剰キャパシティを消費することにより スロットリングは発生しない バースト キャパシティ DynamoDB
  23. 40 DynamoDB でパフォーマンスが出ない!(余談) DynamoDB バーストキャパシティとアダプティブキャパシティ - Amazon DynamoDB • DynamoDB

    にはバーストキャパシティがある • 利用可能なスループットを使い切っていない場合、キャパシティの未使用分を 最大 5 分 (300 秒) 蓄えておき、後のスループットのバースト(スパイク)時に消費することで 対応する • テーブルに定義した 1 秒あたりのプロビジョンドスループットキャパシティよりも高速 • WCU や RCU を少し上回るくらいでは貯蓄された余剰キャパシティを消費することにより スロットリングは発生しない バースト キャパシティ バースト キャパシティ DynamoDB
  24. 41 DynamoDB でパフォーマンスが出ない!(余談) DynamoDB バーストキャパシティとアダプティブキャパシティ - Amazon DynamoDB • DynamoDB

    にはバーストキャパシティがある • 利用可能なスループットを使い切っていない場合、キャパシティの未使用分を 最大 5 分 (300 秒) 蓄えておき、後のスループットのバースト(スパイク)時に消費することで 対応する • テーブルに定義した 1 秒あたりのプロビジョンドスループットキャパシティよりも高速 • WCU や RCU を少し上回るくらいでは貯蓄された余剰キャパシティを消費することにより スロットリングは発生しない バースト キャパシティ スパイク時に 消費して対応 DynamoDB スパイク
  25. 42 スロットリングの原因と対応策 • Purpose Built Database • DynamoDB とは •

    DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  26. 49 スロットリングの原因と対応策 • データ処理後、1 件 1 件削除している場合 • DynamoDB でデータを

    1 件1 件削除するのは Bad Practic • 「DeleteItem」オペレーションは書き込みキャパシティを消費する • データの TTL が設定できるので自然に削除されるのを待つ (書き込みキャパシティを消費しない) • DynamoDB で有効期限 (TTL) を設定する | AWS re:Post • どうしても削除したい場合は DynamoDB の複数レコードを まとめて削除する BatchWriteItem API を利用して 一気に削除する • 1 件ずつ削除するより性能が良くなる可能性あり • BatchWriteItem - Amazon DynamoDB
  27. 52 スロットリングの原因と対応策 • スループット (単位時間当たりの処理量) が 1 分あたりでは平均未満でも 1 秒あたりでは使用可能な量を超えている場合に

    スロットリングする可能性がある • 対応方法 • DynamoDB への書き込み・読み込み API 呼び出し時に エクスポネンシャルバックオフとジッターを実装する プロビジョンドモードのスロットリングの問題のトラブルシューティング - Amazon DynamoDB
  28. 53 スロットリングの原因と対応策 • Exponential Backoff(エクスポネンシャルバックオフ) • 待機時間を指数関数的に増やしていく • wait_time =

    base_delay * (2 ** retry) で retry を増やしていくなど Exponential Backoff And Jitter - AWS Architecture Blog DynamoDB うまくいかない リトライ リトライ リトライ リトライ 待ってくれ~ DynamoDB うまくいかない リトライ 2秒置く リトライ 4秒置く ゆっくり処理できる リトライ 8秒置く リトライ 16秒置く :
  29. 54 スロットリングの原因と対応策 • Jitter(ジッター) • ランダム性を追加することでリトライタイミングを分散させる • max_wait_time = base_delay

    * (2 ** retry) で retry を増やしていく (エクスポネンシャルバックオフ) • wait_time = random.uniform(0, max_wait_time) のように 0 ~ max_wait_timeまでのランダムな値を生成 • リトライ回数が増えると max_wait_time が大きくなるため、ランダムに選ばれる 待機時間も自動的に増加 Exponential Backoff And Jitter - AWS Architecture Blog DynamoDB 4秒 + ランダム秒数置いてリトライ 同時ではなくバラバラにアクセスが来るので 順番にゆっくり処理できる 4秒 + ランダム秒数置いてリトライ 4秒 + ランダム秒数置いてリトライ
  30. 55 スロットリングの原因と対応策(余談) • Boto3 の再実行ロジック • AWS SDK には実行時のエラーを受け取った際の再試行ロジックが最初から自動で実装されている •

    ユーザーが明示的にリトライロジックを組まなくても各リソースのデフォルトで設定された回数分は エクスポネンシャルバックオフによるリトライ処理が実施される • SDK for Python (Boto3) ではデフォルトで 5 回エクスポネンシャルバックオフによる リトライ処理が実施される • ジッターはデフォルトで含まれていないので、カスタムリトライロジックを実装する必要がある https://github.com/boto/botocore/blob/287fb2bbe32f11d449826344d4c6a21da6b1c9c5/botocore/data/_retry.json#L93 AWS SDK for Python (Boto3)の エラーの再試行について | DevelopersIO
  31. 58 スロットリングの原因と対応策 • 各パーティションの最大値は以下 • 1 つのパーティションが持てる最大 RCU:3000 • 1

    つのパーティションが持てる最大 WCU:1000 • 1 つのパーティションの最大サイズ: 10 GB • 各パーティションのスループットは同じように分散され均等になっている パーティションキーを設計してワークロードを DynamoDB で分散する - Amazon DynamoDB Amazon DynamoDB のサービス、アカウント、およびテーブルのクォータ - パーティションキーおよびソートキー
  32. 60 スロットリングの原因と対応策 • ホットパーティションを防ぐため、データアクセスが均等に分散するようなキー設計が必要 • カーディナリティ(Cardinality) • 特定の集合や列に含まれる異なる値の数(種類の数) のこと •

    例:「都道府県」という列があったとすると、カーディナリティは 47 種類 • キー設計をする際はカーディナリティを検討し、アクセスが均等に分散されるようにする パーティションキーを設計してワークロードを DynamoDB で分散する - Amazon DynamoDB
  33. 62 スロットリングの原因と対応策 • パーティションは増えるが、減らない • ※ドキュメントに記載が見当たらないので見つけたら教えてください • 例えば… • 一時的に大きなサイズの大量データを書き込むと、パーティションが増える

    • その後データを削除しても、パーティションは減らず、 一つ一つのパーティションのスループットが下がる • データ移行や負荷試験などで一時的に大量のデータを書き込んで削除したり、 プロビジョンドキャパシティを大きく増やしてから減らしたりした際、 スループットが落ちたように感じたらこれが原因かも • 基本的には「キャパシティの追加」か「テーブルの作り直し」で対処 AWS Black Belt Online Seminar 2017 Amazon DynamoDB
  34. 65 おわりに • Purpose Built Database • DynamoDB とは •

    DynamoDB でパフォーマンスが出ない! • スロットリングの原因と対応策 • おわりに
  35. 67 おわりに • AWS で提供されているフルマネージドの NoSQL データベース • 1 つ、もしくは

    2 つのキーで構成される Key-Value Store • DynamoDB でパフォーマンスが出ない場合はまずスロットリングが発生して いないか確認する • キャパシティが足りているか足りていないかで対応方法を検討 • パーティションの仕組みを把握しておくと良い • 一気に処理するとスロットリングが発生しがちなのでなるべく処理を穏やかにする • エクスポネンシャルバックオフやジッターで工夫する • 書き切れなかった機能や仕様がまだまだあるのでまたの機会に!
  36. 68 おわりに • 参考 • DynamoDBを使ってみませんか? #cm_odyssey - YouTube •

    Purpose-built Database へのいざない • DynamoDB のキャパシティユニット、テーブル構造、パーティション分 割について図解でおさらい | DevelopersIO
  37. 70