Amazon DynamoDB ne fournit pas de fonctionnalités intégrées pour régler automatiquement le débit en fonction de la charge dynamique. Il fournit une API pour augmenter ou diminuer le débit. Les clients sont facturés sur une base horaire pour le débit de lecture et d'écriture provisionné.
Quelles sont les différentes façons de modifier le débit de dynamodb et de réaliser des économies de coûts?
La réponse de Chris est une réponse exacte. Juste pour ajouter quelques points d'expérience antérieure avec DynamoDB…
La situation avec DynamoDB est différente de EC2. Le service de calcul élastique dispose d'une API prise en charge directement en tant que service Web par Amazon pour vous permettre de programmer comment augmenter ou diminuer en fonction d'une logique telle que la quantité de demande. Vous programmez cela en définissant un seuil de surveillance et en déclenchant automatiquement la création ou la suppression d'instances dans un groupe.
Les serveurs de données ne fonctionnent pas de la même manière avec des déclencheurs pour ajuster leur capacité. Mais la capacité de DynamoDB est très flexible et peut être contrôlée comme l'a souligné Chris. L'API pour fournir cela est suffisamment bonne pour apporter des modifications ponctuelles. Ou des modifications manuelles équivalentes depuis la console.
Les différentes liaisons de langage pour programmer des actions de création et de mise à jour avec DynamoDB sont ici…
http://docs.aws.Amazon.com/cli/latest/reference/dynamodb/index.html
L'opération importante pour modifier la capacité est ici…
http://docs.aws.Amazon.com/cli/latest/reference/dynamodb/update-table.html
Ainsi, cela vous donne la possibilité d'augmenter ou de diminuer les ReadCapacityUnits ou WriteCapacityUnits de ProvisionedThroughput.
Ce qui est bien pour un changement prévu ou ponctuel. Mais ce n'est pas la même chose qu'un outil de flexibilité pour vous permettre de déclencher le changement automatiquement.
Par programme, ce que vous êtes le plus susceptible de vouloir faire est d'ajuster la capacité en réponse au changement d'utilisation dans l'intervalle de temps précédent. En particulier, vous devrez peut-être évoluer rapidement en réponse à une augmentation de la demande en définissant une tranche de temps appropriée et un seuil inférieur et supérieur à déclencher.
Une solution plus complète pour y parvenir est décrite ici…
https://aws.Amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/
La solution est maintenue par Sebastian Dahlgren et peut être trouvée avec toutes les instructions sur…
https://github.com/sebdah/dynamic-dynamodb
Je vois que la version actuelle est la 1.18.5 qui est plus récente que la dernière fois que je l'ai utilisée.
A en juger par les versions précédentes, il est simple à configurer au moyen d'un fichier de style de propriétés dynamodb.conf…
Après avoir fourni les informations d'identification et la région, les paramètres les plus cruciaux sont
check-interval
- pour tester le débit en quelques secondesmin-provisioned-reads, max-provisioned-reads; reads-upper-threshold, reads-lower-threshold; increase-reads-with, decrease-reads-with
- Ce sont tous des pourcentagesmin-provisioned-writes, max-provisioned-writes; writes-upper-threshold, writes-lower-threshold; increase-writes-with, decrease-writes-with
- Ce sont tous des pourcentagesCes informations sont-elles à jour?
Eh bien, si vous regardez http://aws.Amazon.com/new/ vous ne verrez qu'une seule modification récente supplémentaire affectant DynamoDB qui affecte les documents stockés. L'entrée pour Dynamic DynamoDB est la dernière entrée publiée traitant des actions de mise à l'échelle. Il s'agit donc de la capacité de mise à l'échelle automatique DynamoDB la mieux conservée à l'heure actuelle.
Amazon vient d'ajouter la mise à l'échelle automatique pour dynamodb, voir les détails ici
Je viens de découvrir ce projet qui mettra à l'échelle automatique votre Dynamodb et est meilleur que Dynamic Dynamo, car il utilise des fonctions Lambda plutôt que des instances EC2:
https://github.com/channl/dynamodb-lambda-autoscale
Vous pouvez gérer le débit par programme via pdateTable API ou manuellement via la console.
Il existe également des outils tels que Dynamic DynamoDB , bien que vous puissiez également lancer votre propre version: vous utiliseriez l'API updateTable et un processus d'arrière-plan serait en cours d'exécution pour détecter ces circonstances et appeler updateTable si nécessaire.
Certaines choses à surveiller lors du changement d'échelle de DynamoDB:
Je pense que d'autres réponses ont fait du bon travail, mais j'ai une approche différente de la mise à l'échelle automatique de DynamoDB en fonction des événements en tirant parti des alarmes CloudWatch et de l'opération pdateTable de DynamoDB pour modifier la capacité provisionnée. L'approche suivante aide non seulement à réduire les coûts, mais à augmenter la capacité pour les charges inattendues.
Résumé:
Configurez les alarmes CloudWatch sur les métriques DynamoDB pour vous alerter en fonction des seuils et pousser les alertes vers une file d'attente SQS via la rubrique SNS. Un processus démon qui interroge la file d'attente SQS peut traiter ces alertes et modifier la capacité provisionnée de la table à l'aide de l'opération UpdateTable
de DynamoDB et mettre à jour les seuils d'alarme CloudWatch.
Version détaillée:
Veuillez noter que cette approche nécessiterait 1. Compréhension des services AWS tels que CloudWatch, SNS, SQS 2. Bonne quantité de temps pour l'implémentation dans votre langage de programmation préféré 3. Maintenance d'un démon pour traiter les messages SQS et modifier la capacité provisionnée.
Configuration unique:
ConsumedWriteCapacityUnits
et ConsumedReadCapacityUnits
de votre table DynamoDB. Vous pouvez utiliser ceci documentation .Algorithme démon:
UpdateTable
avec la nouvelle valeur.Vous pouvez utiliser l'approche ci-dessus pour augmenter ou réduire l'échelle. Par exemple, maintenez le seuil d'alarme CloudWatch à 80% de ProvisionedWriteCapacityUnits
et chaque fois que l'utilisation dépasse 80%, augmentez la capacité et définissez le seuil d'alarme à 80% de la nouvelle valeur. De même, vous pouvez réduire votre consommation lorsque la consommation tombe en dessous de x%.
Bien que ce soit le nœud, il y aurait beaucoup de points à considérer dans une solution de qualité de production.
UpdateTable
.Enfin, Neptune.io fournit une solution SaaS mise à l'échelle automatique de DynamoDB en utilisant cette architecture. Voir http://blog.Neptune.io/one -click-autoscaling-of-dynamodb / et http://blog.Neptune.io/dos-and-donts-of-dynamodb-autoscaling/ pour quelques lectures à ce sujet.
P.S: Je travaille pour Neptune. Et, je peux vous aider si vous avez besoin de plus de détails sur la mise en œuvre.
Jeff Bar a récemment écrit un blog dans le blog officiel AWS: "Auto Scale DynamoDB With Dynamic DynamoDB":
https://aws.Amazon.com/blogs/aws/auto-scale-dynamodb-with-dynamic-dynamodb/
Il a présenté Dynamic DynamoDB, un outil open source construit par un développeur indépendant pour gérer cela automatiquement avec le modèle CloudFormation.
J'ai ajouté de nouvelles fonctionnalités à Rockeee Dynamic DynamoDB Lambda. Vous pouvez voir ce projet:
https://github.com/touchvie/dynamic-dynamodb-lambda
J'espère que cela peut vous aider.
Maintenant qu'AWS a annoncé l'exécution planifiée des services lambda, ceux-ci semblent parfaitement adaptés à la mise à l'échelle automatique basée sur le temps. J'ai rédigé un exemple d'utilisation de ce support sur un support . Exemple de code est sur github.
AWS a ajouté la prise en charge de la mise à l'échelle automatique native pour DynamoDB en juin 2017. Voir l'annonce ici .
Vous pouvez configurer cela en utilisant du code ( exemple du SDK Java ), mais si vous n'avez que quelques tables, vous pouvez utiliser Console de gestion . Cliquez dans la configuration de votre table et sélectionnez l'onglet Capacité . L'image suivante montre quelles sont vos options:
Instructions pour le script de mise à l'échelle automatique DynamoDB:
Les clients sont facturés sur une base horaire pour le débit de lecture et d'écriture provisionné. Vous trouverez ci-dessous les tarifs d'Amazon Dynamo DB pour l'UE (région d'Irlande).
• Débit d'écriture: 0,00735 $ par heure pour 10 unités de capacité d'écriture • Débit de lecture: 0,00735 $ par heure pour 50 unités de capacité de lecture
Amazon Dynamo DB ne fournit pas de fonctionnalités intégrées pour régler automatiquement le débit en fonction de la charge dynamique. Il fournit une API pour augmenter ou diminuer le débit avec certaines restrictions comme le débit peut être diminué deux fois par jour et augmenté à tout moment de la journée.
Quelle sera la facture mensuelle d'une table de production pour une capacité de lecture fixe de 2 000 lecture/seconde et 2 000 écriture/seconde pendant 24 heures?
Calcul: 0,00735 $ X 24 heures X 200 X 30 jours {coût d'écriture pour le mois} + 0,00735X 24 heures X 40 X 30 jours {coût de lecture pour le mois} = 1058,4+ 211,68 = fixe 1270 $/mois.
Lignes directrices pour l'écriture d'utilitaires {langages de programmation pris en charge par Amazon} qui ajustent le débit de la table et réduisent les factures mensuelles.
(A) Valeur initiale: Fondamentalement, ici, vous devez regarder et décider du débit de lecture et d'écriture pour la table en tant que valeur d'initialisation après avoir analysé l'utilisation moyenne en considérant 15 jours ou 1 mois de charge et ajouter X% supplémentaire pour la lecture et Y% supplémentaire pour l'écriture. le dessus pour résister à une charge inattendue. Débit de lecture/écriture initial = calculer le débit de lecture en fonction de l'utilisation moyenne + X {lecture}% ou Y {écriture}% X & Y peut être compris entre 10% et 30% selon l'observation.
(B) Peak Load Shaping: l'alerte sur les tables peut être définie comme lorsque la charge atteint 50% à 60% du débit provisionné, les actions nécessaires peuvent être prises comme l'appel de l'API d'incrément de débit pour augmenter le débit entre 30% et 50% du débit de provisionnement. . *
(C) Mise en forme manuelle: pour les charges lourdes connues telles que la charge par lots/la saison des festivals, le débit doit être réglé manuellement sur 200 à 300% supplémentaires des opérations quotidiennes normales jusqu'à la fin de la charge * * Une fois les heures de travail ou la charge terminées. Le débit doit être ramené à sa valeur initiale.
Remarque: Reader peut calculer les économies mensuelles en considérant 1 000 lecture/écriture pendant 16 heures. + 2 000 lecture/écriture pendant 8 heures, utilitaire fourni en place.
AWS a ajouté la prise en charge de la mise à l'échelle automatique native pour DynamoDB en juin 2017. Le code suivant ( source ) fournit un exemple de configuration de la mise à l'échelle automatique à l'aide du SDK Java Java:
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());
}
}
}
Ce code nécessite que vous fournissiez un ARN pour un rôle de service Application Auto Scaling valide. Remplacez SERVICE_ROLE_ARN_GOES_HERE par l'ARN réel.