使用 AWS CLI 管理 DynamoDB Auto Scaling - Amazon DynamoDB
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS CLI 管理 DynamoDB Auto Scaling

您可以使用 AWS 管理控制台 (AWS Command Line Interface) 管理 AWS CLI Auto Scaling,而不是使用 Amazon DynamoDB。本节中的教程演示如何安装和配置用于管理 AWS CLI Auto Scaling 的 DynamoDB。在本教程中,您将执行以下操作:

  • 创建名为 DynamoDB 的 TestTable 表。 初始吞吐量设置为 5 个读取容量单位和 5 个写入容量单位。

  • 为 Application Auto Scaling 创建 TestTable 策略。 该策略寻求在占用的写入容量和预置的写入容量之间保持 50% 的目标比率。此指标的范围在 5 到 10 个写入容量单位之间。(不允许 Application Auto Scaling 调整超过此范围的吞吐量。)

  • 运行 Python 程序以驱动对 TestTable 的写入流量。 当目标比率在持续的时间段内超过 50% 时,Application Auto Scaling 通知 DynamoDB 向上调整 TestTable 的吞吐量以保持 50% 的目标利用率。

  • 验证 DynamoDB 是否已成功调整 TestTable 的预置写入容量。

开始前的准备工作

在开始本教程之前,请完成以下任务。

安装AWS CLI

如果您尚未安装和配置 AWS CLI,则必须先执行此操作。为此,请按照 AWS Command Line Interface 用户指南 中的以下说明操作:

安装 Python

本教程要求您运行 Python 程序(请参阅步骤 4:驱动到 TestTable 的写入流量)。如果尚未安装,您可以下载 Python

步骤 1:创建 DynamoDB 表

在此步骤中,您将使用 AWS CLI 创建 TestTable。 主键包含 pk(分区键)和 sk(排序键)。这两个属性的类型为 Number。 初始吞吐量设置为 5 个读取容量单位和 5 个写入容量单位。

  1. 使用以下 AWS CLI 命令创建表。

    aws dynamodb create-table \ --table-name TestTable \ --attribute-definitions \ AttributeName=pk,AttributeType=N \ AttributeName=sk,AttributeType=N \ --key-schema \ AttributeName=pk,KeyType=HASH \ AttributeName=sk,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
  2. 要检查表的状态,请使用以下命令。

    aws dynamodb describe-table \ --table-name TestTable \ --query "Table.[TableName,TableStatus,ProvisionedThroughput]"

    当表的状态为 ACTIVE 时,表即可供使用。

步骤 2:注册可扩展目标

接下来,您将表的写入容量注册为 Application Auto Scaling 的可扩展目标。这将允许 Application Auto Scaling 调整 TestTable 的预置写入容量,但仅在 5–10 个容量单位的范围内。

注意

DynamoDB Auto Scaling 需要是否存在代表您执行 Auto Scaling 操作的服务相关角色 (AWSServiceRoleForApplicationAutoScaling_DynamoDBTable)。此角色是自动为您创建的。有关更多信息,请参阅 https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html 中的 Application Auto Scaling 的服务相关角色Application Auto Scaling 用户指南。

  1. 输入以下命令以注册可扩展目标。

    aws application-autoscaling register-scalable-target \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits" \ --min-capacity 5 \ --max-capacity 10
  2. 要验证注册,请使用以下命令。

    aws application-autoscaling describe-scalable-targets \ --service-namespace dynamodb \ --resource-id "table/TestTable"
    注意

    您还可以针对 全局二级索引 注册可扩展目标。例如,对于 全局二级索引 (“test-index”),资源 ID 和可扩展的维度参数会适当更新。

    aws application-autoscaling register-scalable-target \ --service-namespace dynamodb \ --resource-id "table/TestTable/index/test-index" \ --scalable-dimension "dynamodb:index:WriteCapacityUnits" \ --min-capacity 5 \ --max-capacity 10

步骤 3:创建扩展策略

在此步骤中,您将为 TestTable 创建扩展策略。 该策略定义 Application Auto Scaling 可以在其下调整表的预置吞吐量的详细信息,以及在执行此操作时要执行的操作。将此策略与您在上一步中定义的可扩展目标(TestTable 表的写入容量单位)关联。

该策略包含以下元素:

  • PredefinedMetricSpecification — 允许调整的指标。Application Auto Scaling对于 DynamoDB,以下值是 PredefinedMetricType 的有效值:

    • DynamoDBReadCapacityUtilization

    • DynamoDBWriteCapacityUtilization

  • ScaleOutCooldown —提高预置吞吐量的每个 Application Auto Scaling 事件之间的最短时间(以秒为单位)。此参数使 Application Auto Scaling 可以持续但不主动地增加吞吐量,以响应实际工作负载。的默认设置为 0。ScaleOutCooldown

  • ScaleInCooldown —减少预置吞吐量的每个 Application Auto Scaling 事件之间的最短时间(以秒为单位)。此参数允许 Application Auto Scaling 逐步且可预测地降低吞吐量。的默认设置为 0。ScaleInCooldown

  • TargetValue— 可确保消耗的容量与预置容量的比例保持在该值或接近此值。Application Auto Scaling您将 TargetValue 定义为百分比。

注意

要进一步了解 TargetValue 的工作方式,假设您有一个预置吞吐量设置为 200 个写入容量单位的表。您决定为此表创建扩展策略,TargetValue 为 70%。

现在假设您开始增加对表的写入流量,以使实际写入吞吐量为 150 个容量单位。消耗/预置比率现在为 (150/200) 或 75%。此比率超过您的目标,因此 Application Auto Scaling 会将预置的写入容量增加到 215,以便尽可能增加比率 (150/215) 或 79.77% 或 677% —(尽可能接近您的 TargetValue,但不超过它)。

对于 TestTable,您将 TargetValue 设置为 50%。Application Auto Scaling 在 5–10 个容量单位范围内调整表的预置吞吐量(请参阅步骤 2:注册可扩展目标),以便消耗/预置比率保持或接近 50%。您将 ScaleOutCooldownScaleInCooldown 的值设置为 60 秒。

  1. 使用以下内容创建名为 scaling-policy.json 的文件。

    { "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" }, "ScaleOutCooldown": 60, "ScaleInCooldown": 60, "TargetValue": 50.0 }
  2. 使用以下 AWS CLI 命令创建策略。

    aws application-autoscaling put-scaling-policy \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits" \ --policy-name "MyScalingPolicy" \ --policy-type "TargetTrackingScaling" \ --target-tracking-scaling-policy-configuration file://scaling-policy.json
  3. 请注意,在输出中,Application Auto Scaling 已创建两个 Amazon CloudWatch 警报 — 每个警报对应于扩展目标范围的上边界和下边界。

  4. 可以使用以下 AWS CLI 命令查看有关扩展策略的更多详细信息。

    aws application-autoscaling describe-scaling-policies \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --policy-name "MyScalingPolicy"
  5. 在输出中,验证策略设置是否与来自 步骤 2:注册可扩展目标 和 步骤 3:创建扩展策略 的规范匹配。

步骤 4:驱动到 TestTable 的写入流量

现在,您可以通过将数据写入 TestTable 来测试您的扩展策略。 为此,您可以运行 Python 程序。

  1. 使用以下内容创建名为 bulk-load-test-table.py 的文件。

    import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table("TestTable") filler = "x" * 100000 i = 0 while (i < 10): j = 0 while (j < 10): print (i, j) table.put_item( Item={ 'pk':i, 'sk':j, 'filler':{"S":filler} } ) j += 1 i += 1
  2. 输入以下命令以运行该程序。

    python bulk-load-test-table.py

    的预置写入容量非常低(5 个写入容量单位),因此程序偶尔由于写入限制而停滞。TestTable这是预期行为。

    让程序在您继续执行下一步时继续运行。

步骤 5:查看 Application Auto Scaling 操作

在此步骤中,您将查看代表您启动的 Application Auto Scaling 操作。您还将验证 Application Auto Scaling 是否已更新 TestTable 的预置写入容量。

  1. 输入以下命令以查看 Application Auto Scaling 操作。

    aws application-autoscaling describe-scaling-activities \ --service-namespace dynamodb

    在 Python 程序运行时,偶尔重新运行此命令。(调用扩展策略需要几分钟时间。) 您最终应看到以下输出。

    ... { "ScalableDimension": "dynamodb:table:WriteCapacityUnits", "Description": "Setting write capacity units to 10.", "ResourceId": "table/TestTable", "ActivityId": "0cc6fb03-2a7c-4b51-b67f-217224c6b656", "StartTime": 1489088210.175, "ServiceNamespace": "dynamodb", "EndTime": 1489088246.85, "Cause": "monitor alarm AutoScaling-table/TestTable-AlarmHigh-1bb3c8db-1b97-4353-baf1-4def76f4e1b9 in state ALARM triggered policy MyScalingPolicy", "StatusMessage": "Successfully set write capacity units to 10. Change successfully fulfilled by dynamodb.", "StatusCode": "Successful" }, ...

    这表示 Application Auto Scaling 已向 UpdateTable 发出 DynamoDB 请求。

  2. 输入以下命令以验证 DynamoDB 是否增加了表的写入容量。

    aws dynamodb describe-table \ --table-name TestTable \ --query "Table.[TableName,TableStatus,ProvisionedThroughput]"

    应已从 WriteCapacityUnits 扩展到 510

(可选)步骤 6:清除

在本教程中,您创建了几个 资源。如果您不再需要这些资源,可将其删除。

  1. 删除 TestTable 的扩展策略。

    aws application-autoscaling delete-scaling-policy \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits" \ --policy-name "MyScalingPolicy"
  2. 取消注册可扩展目标。

    aws application-autoscaling deregister-scalable-target \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits"
  3. 删除 TestTable 表。

    aws dynamodb delete-table --table-name TestTable