Amazon DynamoDBは、動的負荷に基づいてスループットを自動調整する組み込み機能を提供しません。スループットを増加または減少させるAPIを提供します。お客様は、プロビジョニングされた読み取りおよび書き込みのスループットに対して1時間ごとに課金されます。
Dynamodbのスループットを変更し、コスト削減のメリットを実現するさまざまな方法は何ですか?
クリスからの答えは正確な答えです。 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自動スケーリング機能です。
Amazonはdynamodbの自動スケーリングを追加しました。詳細を参照してください こちら
Dynamodbを自動スケールアップし、EC2インスタンスではなくLambda関数を使用するため、Dynamic Dynamoよりも見栄えの良いこのプロジェクトを発見しました。
https://github.com/channl/dynamodb-lambda-autoscale
pdateTable API を使用してプログラムでスループットを管理するか、コンソールを使用して手動でスループットを管理できます。
Dynamic DynamoDB などのツールもありますが、独自のバージョンをロールすることもできます。updateTableAPIを使用し、バックグラウンドプロセスを実行してこれらの状況を検出し、必要に応じてupdateTableを呼び出します。
DynamoDBの規模を変更する際に注意すべき点:
他の答えは素晴らしい仕事をしたと思いますが、CloudWatchアラームとDynamoDBの pdateTable 操作を利用してプロビジョニングされた容量を変更することにより、イベント駆動型でDynamoDBを自動スケールする別のアプローチがあります。次のアプローチは、コストを削減するだけでなく、予期しない負荷に対して容量を拡大するのに役立ちます。
概要:
DynamoDBメトリックスでCloudWatchアラームを設定して、しきい値に基づいてアラートを出し、SNSトピックを介してアラートをSQSキューにプッシュします。 SQSキューをポーリングするデーモンプロセスは、それらのアラートを処理し、DynamoDBのUpdateTable
操作を使用してテーブルのプロビジョニング済み容量を変更し、CloudWatchアラームのしきい値を更新できます。
詳細バージョン:
このアプローチには、1。CloudWatch、SNS、SQSなどのAWSサービスの理解2.好みのプログラミング言語で実装するための十分な時間3. SQSメッセージを処理し、プロビジョニングされた容量を変更するためのデーモンのメンテナンスが必要です。
ワンタイムセットアップ:
ConsumedWriteCapacityUnits
およびConsumedReadCapacityUnits
メトリックにCloudWatchアラームを作成します。これを使用できます documentation 。デーモンアルゴリズム:
UpdateTable
操作を発行します。上記のアプローチを使用して、スケールアップまたはスケールダウンできます。たとえば、CloudWatchアラームのしきい値をProvisionedWriteCapacityUnits
の80%に維持し、使用率が80%を超えるたびに容量を増やし、アラームしきい値を新しい値の80%に設定します。同様に、消費量がx%を下回ったときに縮小できます。
これが重要ですが、生産品質のソリューションでは多くのポイントを考慮する必要があります。
UpdateTable
操作をバッチ処理します。最後に、 Neptune.io は、パッケージ化されたSaaSこのアーキテクチャを使用してDynamoDBを自動スケーリングするソリューションを提供します。 http://blog.Neptune.io/one -click-autoscaling-of-dynamodb / および http://blog.Neptune.io/dos-and-donts-of-dynamodb-autoscaling/ を読んでください。
追伸:私は海王星で働いています。また、実装の詳細が必要な場合はお手伝いできます。
Jeff Barは最近AWS公式ブログでブログ「ダイナミックDynamoDBによる自動スケールDynamoDB」を書きました。
https://aws.Amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/
彼は、Dynamic DynamoDBを導入しました。これは、CloudFormationテンプレートでこれを自動的に処理するために、独立した開発者によって構築されたオープンソースツールです。
Rockeee Dynamic DynamoDB Lambdaに新しい機能を追加しました。このプロジェクトを見ることができます:
https://github.com/touchvie/dynamic-dynamodb-lambda
それがあなたのお役に立てば幸いです。
AWSがラムダサービスのスケジュールされた実行を発表したので、これらは時間ベースの自動スケーリングを行うのに最適なようです。 メディアでこれを使用する方法の例 を書きました。 コード例 はgithubにあります。
AWSは、2017年6月にDynamoDBのネイティブ自動スケーリングのサポートを追加しました。アナウンスメント here を参照してください。
コード( Java SDKの例 )を使用してこれを構成できますが、テーブルが数個しかない場合は Management Console を使用できます。テーブル構成をクリックして、Capacityタブを選択します。次の画像は、オプションを示しています。
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回の読み取り/書き込み、提供されたユーティリティ。
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に置き換えます。