web-dev-qa-db-ja.com

Amazon DynamoDBスループットを自動スケーリングする方法は?

Amazon DynamoDBは、動的負荷に基づいてスループットを自動調整する組み込み機能を提供しません。スループットを増加または減少させるAPIを提供します。お客様は、プロビジョニングされた読み取りおよび書き込みのスループットに対して1時間ごとに課金されます。

Dynamodbのスループットを変更し、コスト削減のメリットを実現するさまざまな方法は何ですか?

29
kartik

クリスからの答えは正確な答えです。 DynamoDBを使用した過去の経験からいくつかのポイントを追加するだけです…

DynamoDBの状況はEC2とは異なります。エラスティックコンピューティングサービスには、AmazonによってWebサービスとして直接サポートされているAPIがあり、需要量などのロジックに従ってスケールアップまたはスケールダウンする方法をプログラムできます。これを監視するには、監視しきい値を定義し、グループ内のインスタンスの作成または削除を自動的にトリガーします。

データサーバーは、容量を調整するトリガーと同じようには機能しません。ただし、DynamoDBの容量は非常に柔軟であり、Chrisが指摘したように制御できます。これを提供するAPIは、1回限りの変更を加えるのに十分です。またはコンソールからの同等の手動変更。

DynamoDBでプログラムの作成および更新アクションをプログラムするためのさまざまな言語バインディングはこちらです…

http://docs.aws.Amazon.com/cli/latest/reference/dynamodb/index.html

容量を変更するための重要な操作はこちらです…

http://docs.aws.Amazon.com/cli/latest/reference/dynamodb/update-table.html

そのため、ProvisionedThroughputのReadCapacityUnitsまたはWriteCapacityUnitsを増減することができます。

予測された変更または1回限りの変更には問題ありません。ただし、これは、変更を自動的にトリガーできる柔軟性ツールとは異なります。

プログラム的に、あなたが最もやりたいと思うのは、前の時間間隔での使用率の変化に応じて容量を調整することです。特に、適切な時間枠とトリガーする下限および上限しきい値を定義することにより、需要の急増に対応して迅速にスケールアップする必要がある場合があります。

これを達成するためのより完全なソリューションは、ここで説明されています…

https://aws.Amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/

ソリューションはセバスチャン・ダールグレンによって維持されており、すべての指示が記載されている…

https://github.com/sebdah/dynamic-dynamodb

現在のリリースは1.18.5であり、前回使用したときよりも新しいことがわかります。

以前のリリースから判断すると、dynamodb.confプロパティスタイルファイルを使用して簡単に構成できます…

資格情報と地域を提供した後、最も重要な設定は

  • check-interval —スループットを数秒でテストします
  • min-provisioned-reads, max-provisioned-reads; reads-upper-threshold, reads-lower-threshold; increase-reads-with, decrease-reads-with —これらはすべてパーセンテージです
  • min-provisioned-writes, max-provisioned-writes; writes-upper-threshold, writes-lower-threshold; increase-writes-with, decrease-writes-with —これらはすべてパーセンテージです

この情報は最新ですか?

http://aws.Amazon.com/new/ を見ると、保存されているドキュメントに影響するDynamoDBに影響する最近の変更が1つだけ表示されます。 Dynamic DynamoDBのエントリは、スケーリングアクションを扱う最後に公開されたエントリです。そのため、これは現時点で最も維持されているDynamoDB自動スケーリング機能です。

24
johnz

Amazonはdynamodbの自動スケーリングを追加しました。詳細を参照してください こちら

14
NSA

Dynamodbを自動スケールアップし、EC2インスタンスではなくLambda関数を使用するため、Dynamic Dynamoよりも見栄えの良いこのプロジェクトを発見しました。

https://github.com/channl/dynamodb-lambda-autoscale

  • 5分間のセットアッププロセス
  • サーバーレス設計
  • 構成スタイルよりも柔軟なコード
  • 自動スケールテーブルとグローバルセカンダリインデックス
  • 複数のテーブルの自動スケール
  • 固定設定による自動スケーリング
  • プロビジョニングされた容量使用率による自動スケーリング
  • 調整されたイベントメトリックによる自動スケーリング
  • 調整されたイベントメトリックを組み込むことにより、使用量とホットキーの問題の大きなスパイクに最適化
  • 同時クエリを使用して最適化されたパフォーマンス
  • AWSによって課されるRateLimitedDecrement
  • 「測定」による統計
  • 「dotenv」を介したAWS認証情報設定
  • 「webpack」を介して最適化されたラムダパッケージ
  • ES7コード
  • 100% フロー 静的型チェックカバレッジ
13
Jesús Carrera

pdateTable API を使用してプログラムでスループットを管理するか、コンソールを使用して手動でスループットを管理できます。

Dynamic DynamoDB などのツールもありますが、独自のバージョンをロールすることもできます。updateTableAPIを使用し、バックグラウンドプロセスを実行してこれらの状況を検出し、必要に応じてupdateTableを呼び出します。

DynamoDBの規模を変更する際に注意すべき点:

  1. 実際に使用しているかどうかに関係なく、割り当てられたスループットに対して課金されます。
  2. スケールアップすると、Dynamoは新しいパーティションを割り当てる場合がありますが、スケールダウンしてもそれらは削除されません。これにより、予期しない ホットハッシュキー 問題が発生する可能性があります。多くのパーティションがあるが、各パーティションのスループットが非常に低い場合です。
8
Krease

他の答えは素晴らしい仕事をしたと思いますが、CloudWatchアラームとDynamoDBの pdateTable 操作を利用してプロビジョニングされた容量を変更することにより、イベント駆動型でDynamoDBを自動スケールする別のアプローチがあります。次のアプローチは、コストを削減するだけでなく、予期しない負荷に対して容量を拡大するのに役立ちます。

概要:

DynamoDBメトリックスでCloudWatchアラームを設定して、しきい値に基づいてアラートを出し、SNSトピックを介してアラートをSQSキューにプッシュします。 SQSキューをポーリングするデーモンプロセスは、それらのアラートを処理し、DynamoDBのUpdateTable操作を使用してテーブルのプロビジョニング済み容量を変更し、CloudWatchアラームのしきい値を更新できます。

詳細バージョン:

このアプローチには、1。CloudWatch、SNS、SQSなどのAWSサービスの理解2.好みのプログラミング言語で実装するための十分な時間3. SQSメッセージを処理し、プロビジョニングされた容量を変更するためのデーモンのメンテナンスが必要です。

ワンタイムセットアップ:

  1. DynamoDBテーブルのConsumedWriteCapacityUnitsおよびConsumedReadCapacityUnitsメトリックにCloudWatchアラームを作成します。これを使用できます documentation
  2. CloudWatchアラームを設定します SNSに警告するため トピック。 AWS SQSキューを作成し、キューをサブスクライブして、SNSトピックからアラートを受信します。
  3. プログラミング言語でデーモンを作成して、SQSキューをポーリングし、すべてのアラートを処理します。 AWSには SDKs が複数の言語で用意されているため、これらの言語のいずれかを選択すると、AWSサービスと通信するための大量のコードを書く必要がなくなります。

デーモンアルゴリズム:

  1. 受信するすべてのSQSメッセージについて、使用する新しいプロビジョニング済み容量を計算し、新しい値でUpdateTable操作を発行します。
  2. 必要に応じて、新しいしきい値でCloudWatchアラームを更新します。

上記のアプローチを使用して、スケールアップまたはスケールダウンできます。たとえば、CloudWatchアラームのしきい値をProvisionedWriteCapacityUnitsの80%に維持し、使用率が80%を超えるたびに容量を増やし、アラームしきい値を新しい値の80%に設定します。同様に、消費量がx%を下回ったときに縮小できます。

これが重要ですが、生産品質のソリューションでは多くのポイントを考慮する必要があります。

  1. DynamoDBパーティションとホットキーの問題について理解します。
  2. すべての DynamoDBの制限 に注意してください。
  3. UTC日ごとのスケールダウンの制約。
  4. 複数のUpdateTable操作をバッチ処理します。

最後に、 Neptune.io は、パッケージ化されたSaaSこのアーキテクチャを使用してDynamoDBを自動スケーリングするソリューションを提供します。 http://blog.Neptune.io/one -click-autoscaling-of-dynamodb / および http://blog.Neptune.io/dos-and-donts-of-dynamodb-autoscaling/ を読んでください。

追伸:私は海王星で働いています。また、実装の詳細が必要な場合はお手伝いできます。

4
Buchi

Jeff Barは最近AWS公式ブログでブログ「ダイナミックDynamoDBによる自動スケールDynamoDB」を書きました。

https://aws.Amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/

彼は、Dynamic DynamoDBを導入しました。これは、CloudFormationテンプレートでこれを自動的に処理するために、独立した開発者によって構築されたオープンソースツールです。

4
Robert Mao

Rockeee Dynamic DynamoDB Lambdaに新しい機能を追加しました。このプロジェクトを見ることができます:

https://github.com/touchvie/dynamic-dynamodb-lambda

  • グローバルセカンダリインデックスのサポート
  • 設定JSONファイルで読み取り/書き込み自動スケーリングを有効/無効にします
  • CloudWatchのスロットルイベントのサポート
  • 設定JSONファイルでスロットル読み取り/スロットル書き込みチェックを有効/無効にします
  • ラムダにテストを追加

それがあなたのお役に立てば幸いです。

3
angulito

AWSがラムダサービスのスケジュールされた実行を発表したので、これらは時間ベースの自動スケーリングを行うのに最適なようです。 メディアでこれを使用する方法の例 を書きました。 コード例 はgithubにあります。

2
quodlibet

AWSは、2017年6月にDynamoDBのネイティブ自動スケーリングのサポートを追加しました。アナウンスメント here を参照してください。

コード( Java SDKの例 )を使用してこれを構成できますが、テーブルが数個しかない場合は Management Console を使用できます。テーブル構成をクリックして、Capacityタブを選択します。次の画像は、オプションを示しています。

auto scaling configuration

2
Zanon

DynamoDB Auto Scalingスクリプトのガイドライン:

顧客は、プロビジョニングされた読み取りおよび書き込みスループットに対して1時間ごとに課金されます。以下は、EU(アイルランド地域)向けAmazon Dynamo DB料金です。

•書き込みスループット:書き込み容量10ユニットごとに1時間あたり0.00735ドル•読み取りスループット:読み取り容量50ユニットごとに1時間あたり0.00735ドル

Amazon Dynamo DBは、動的負荷に基づいてスループットを自動調整するための組み込み機能を提供しません。スループットを1日に2回減少させ、いつでも増加させることができるなど、いくつかの制限を設けて、スループットを増減するAPIを提供します。

固定読み取り容量2,000読み取り/秒および2,000書き込み/秒の24時間の実稼働テーブルの月額料金はいくらですか?

計算:$ 0.00735 X 24時間X 200 X 30日{月の書き込みコスト} + $ 0.00735X 24時間X 40 X 30日{月の読み取りコスト} = 1058.4+ 211.68 = 1270ドル/月に固定。

テーブルのスループットを調整し、毎月の請求額を削減するユーティリティ{Amazonがサポートするプログラミング言語}を作成するためのガイドライン。

(A)初期値:基本的に、ここでは、15日または1か月の負荷を考慮して平均使用量を分析した後、初期化値としてテーブルの読み取りおよび書き込みスループットを監視および決定し、読み取りにX%、書き込みにY%を追加する必要があります予期しない負荷に耐えるための上部。初期読み取り/書き込みスループット=平均使用量に基づいて読み取りスループットを計算します+ X {read}%またはY {write}%X&Yは、観測に基づいて10%から30%のいずれかです。

(B)ピーク負荷シェーピング:テーブルのアラートは、負荷がプロビジョニングされたスループットの50%から60%に達したときに設定できます。必要なアクションは、スループットインクリメントAPIを呼び出して、プロビジョニングスループットの30%から50% 。*

(C)手動シェーピング:バッチロード/フェスティバルシーズンなどの既知の重い負荷の場合、スループットは手動で設定し、負荷が完了するまで通常の日常業務の200%-300%余分に設定する必要があります* *営業時間または負荷が終わったらスループットは初期値まで低下するはずです。

注:リーダーは、16時間で1,000回の読み取り/書き込みを考慮して、毎月の節約量を計算できます。 + 8時間で2,000回の読み取り/書き込み、提供されたユーティリティ。

2
kartik

AWSは2017年6月にDynamoDBのネイティブ自動スケーリングのサポートを追加しました。次のコード( source )は、Java SDKを使用して自動スケーリングを設定する方法の例を示します。

package com.amazonaws.codesamples.autoscaling;

import com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScalingClient;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsResult;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalingPoliciesResult;
import com.amazonaws.services.applicationautoscaling.model.MetricType;
import com.amazonaws.services.applicationautoscaling.model.PolicyType;
import com.amazonaws.services.applicationautoscaling.model.PredefinedMetricSpecification;
import com.amazonaws.services.applicationautoscaling.model.PutScalingPolicyRequest;
import com.amazonaws.services.applicationautoscaling.model.RegisterScalableTargetRequest;
import com.amazonaws.services.applicationautoscaling.model.ScalableDimension;
import com.amazonaws.services.applicationautoscaling.model.ServiceNamespace;
import com.amazonaws.services.applicationautoscaling.model.TargetTrackingScalingPolicyConfiguration;

public class EnableDynamoDBAutoscaling {

    static AWSApplicationAutoScalingClient aaClient = new AWSApplicationAutoScalingClient();

    public static void main(String args[]) {

        ServiceNamespace ns = ServiceNamespace.Dynamodb;
        ScalableDimension tableWCUs = ScalableDimension.DynamodbTableWriteCapacityUnits;
        String resourceID = "table/TestTable";

        // Define the scalable target
        RegisterScalableTargetRequest rstRequest = new RegisterScalableTargetRequest()
            .withServiceNamespace(ns)
            .withResourceId(resourceID)
            .withScalableDimension(tableWCUs)
            .withMinCapacity(5)
            .withMaxCapacity(10)
            .withRoleARN("SERVICE_ROLE_ARN_GOES_HERE");

        try {
            aaClient.registerScalableTarget(rstRequest);
        } catch (Exception e) {
            System.err.println("Unable to register scalable target: ");
            System.err.println(e.getMessage());
        }

        // Verify that the target was created
        DescribeScalableTargetsRequest dscRequest = new DescribeScalableTargetsRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceIds(resourceID);

        try {
            DescribeScalableTargetsResult dsaResult = aaClient.describeScalableTargets(dscRequest);
            System.out.println("DescribeScalableTargets result: ");
            System.out.println(dsaResult);
            System.out.println();
        } catch (Exception e) {
            System.err.println("Unable to describe scalable target: ");
            System.err.println(e.getMessage());
        }

        System.out.println();

        // Configure a scaling policy
        TargetTrackingScalingPolicyConfiguration targetTrackingScalingPolicyConfiguration = 
            new TargetTrackingScalingPolicyConfiguration()
            .withPredefinedMetricSpecification(
                new PredefinedMetricSpecification()
                .withPredefinedMetricType(MetricType. DynamoDBWriteCapacityUtilization))
            .withTargetValue(50.0)
            .withScaleInCooldown(60)
            .withScaleOutCooldown(60);

        // Create the scaling policy, based on your configuration
        PutScalingPolicyRequest pspRequest = new PutScalingPolicyRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceId(resourceID)
            .withPolicyName("MyScalingPolicy")
            .withPolicyType(PolicyType.TargetTrackingScaling)
            .withTargetTrackingScalingPolicyConfiguration(targetTrackingScalingPolicyConfiguration);

        try {
            aaClient.putScalingPolicy(pspRequest);
        } catch (Exception e) {
            System.err.println("Unable to put scaling policy: ");
            System.err.println(e.getMessage());
        }

        // Verify that the scaling policy was created
        DescribeScalingPoliciesRequest dspRequest = new DescribeScalingPoliciesRequest()
            .withServiceNamespace(ns)
            .withScalableDimension(tableWCUs)
            .withResourceId(resourceID);

        try {
            DescribeScalingPoliciesResult dspResult = aaClient.describeScalingPolicies(dspRequest);
            System.out.println("DescribeScalingPolicies result: ");
            System.out.println(dspResult);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Unable to describe scaling policy: ");
            System.err.println(e.getMessage());
        }            
    }
}

このコードでは、有効なApplication Auto ScalingサービスロールのARNを指定する必要があります。 SERVICE_ROLE_ARN_GOES_HEREを実際のARNに置き換えます。

0
Zanon