Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 AWS CLI 管理 DynamoDB Auto Scaling

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

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

  • TestTable 创建 Application Auto Scaling 策略。该策略旨在将消耗的写入容量和预置的写入容量之间的比例维持在 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,可使用以下链接下载它:https://www.python.org/downloads

步骤 1:创建 DynamoDB 表

在此步骤中,您将使用 AWS CLI 创建 TestTable。主键包含 pk(分区键)和 sk(排序键)。这两个属性的类型均为数字。初始吞吐量设置为 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 需要存在一个代表您执行自动缩放操作的服务相关角色 (AWSServiceRoleForApplicationAutoScaling_DynamoDBTable)。系统会自动为您创建此角色。有关更多信息,请参阅用于 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"

    注意

    您也可以针对 GSI 注册一个可扩展目标。例如,对于 GSI (“测试索引”),请注意将更新相应的资源 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 持续但不是激进地增加吞吐量以应对实际工作负载。ScaleOutCooldown 的默认设置是 0。

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

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

注意

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

现在假设您开始将写入流量驱动到该表,以便实际写入吞吐量是 150 个容量单位。消耗/预置比现在是 (150/200),即 75%。这个比例超出了您的目标,因此 Application Auto Scaling 将预置写入容量提高到 215,这样比例就变成 (150/215),即 69.77% — 非常接近您的 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 创建了两个 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

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

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

步骤 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 向 DynamoDB 发出了 UpdateTable 请求。

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

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

    WriteCapacityUnits 应该已经从 5 扩展到 10

(可选) 步骤 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