Avaliar as configurações de Auto Scaling da sua tabela - Amazon DynamoDB

Avaliar as configurações de Auto Scaling da sua tabela

Esta seção apresenta uma visão geral de como avaliar as configurações de Auto Scaling nas tabelas do DynamoDB. O Auto Scaling do Amazon DynamoDB é um recurso que gerencia o throughput da tabela e do índice secundário global (GSI) com base no tráfego do sua aplicação e na métrica de utilização desejada. Isso garante que suas tabelas ou GSIs tenham a capacidade necessária para os padrões de sua aplicação.

O serviço de Auto Scaling da AWS monitorará a utilização atual da tabela e a comparará com o valor de utilização alvo: TargetValue. Ele notificará você se for hora de aumentar ou diminuir a capacidade alocada.

Noções básicas de suas configurações de Auto Scaling

Definir o valor correto para a utilização prevista, a etapa inicial e os valores finais é uma atividade que exige o envolvimento de sua equipe de operações. Isso permite que você defina adequadamente os valores com base no histórico de uso da aplicação, que será usado para acionar as políticas de Auto Scaling da AWS. A utilização prevista é a porcentagem de sua capacidade total que deve ser atingida durante um período antes que as regras de Auto Scaling sejam aplicadas.

Quando você define uma utilização prevista alta (uma utilização de cerca de 90%), isso significa que seu tráfego deve ser superior a 90% por um período de tempo antes que o Auto Scaling comece. Você não deve usar uma alta utilização prevista, a menos que sua aplicação seja muito constante e não receba picos de tráfego.

Quando você define uma utilização prevista muito baixa (uma utilização inferior a 50%), isso significa que seu aplicativo deveria atingir 50% da capacidade provisionada antes de acionar uma política de Auto Scaling. A menos que o tráfego da sua aplicação cresça a uma taxa muito agressiva, isso geralmente se traduz em capacidade não utilizada e desperdício de recursos.

Como identificar tabelas com baixa utilização prevista (<= 50%)

Você pode usar a AWS CLI ou o AWS Management Console para monitorar e identificar os TargetValues das políticas de Auto Scaling em seus recursos do DynamoDB:

AWS CLI
  1. Retorne a lista completa de recursos executando o seguinte comando:

    aws application-autoscaling describe-scaling-policies --service-namespace dynamodb

    Esse comando retornará a lista completa de políticas de Auto Scaling emitidas para qualquer recurso do DynamoDB. Se quiser apenas recuperar os recursos de uma tabela específica, você poderá adicionar o –resource-id parameter. Por exemplo:

    aws application-autoscaling describe-scaling-policies --service-namespace dynamodb --resource-id "table/<table-name>”
  2. Retorne somente as políticas de Auto Scaling para um GSI específico executando o seguinte comando:

    aws application-autoscaling describe-scaling-policies --service-namespace dynamodb --resource-id "table/<table-name>/index/<gsi-name>”

    Os valores nos quais estamos interessados para as políticas de Auto Scaling estão destacados abaixo. Queremos garantir que o valor alvo seja maior que 50% para evitar o provisionamento excessivo. Você deverá obter um resultado semelhante ao seguinte:

    { "ScalingPolicies": [ { "PolicyARN": "arn:aws:autoscaling:<region>:<account-id>:scalingPolicy:<uuid>:resource/dynamodb/table/<table-name>/index/<index-name>:policyName/$<full-gsi-name>-scaling-policy", "PolicyName": $<full-gsi-name>”, "ServiceNamespace": "dynamodb", "ResourceId": "table/<table-name>/index/<index-name>", "ScalableDimension": "dynamodb:index:WriteCapacityUnits", "PolicyType": "TargetTrackingScaling", "TargetTrackingScalingPolicyConfiguration": { "TargetValue": 70.0, "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" } }, "Alarms": [ ... ], "CreationTime": "2022-03-04T16:23:48.641000+10:00" }, { "PolicyARN": "arn:aws:autoscaling:<region>:<account-id>:scalingPolicy:<uuid>:resource/dynamodb/table/<table-name>/index/<index-name>:policyName/$<full-gsi-name>-scaling-policy", "PolicyName":$<full-gsi-name>”, "ServiceNamespace": "dynamodb", "ResourceId": "table/<table-name>/index/<index-name>", "ScalableDimension": "dynamodb:index:ReadCapacityUnits", "PolicyType": "TargetTrackingScaling", "TargetTrackingScalingPolicyConfiguration": { "TargetValue": 70.0, "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBReadCapacityUtilization" } }, "Alarms": [ ... ], "CreationTime": "2022-03-04T16:23:47.820000+10:00" } ] }
AWS Management Console
  1. Faça login no AWS Management Console e abra o console do DynamoDB em https://console.aws.amazon.com/dynamodb/.

    Selecione uma Região da AWS adequada, se necessário.

  2. Na barra de navegação à esquerda, selecione Tabelas. Na página Tabelas, selecione o Nome da tabela.

  3. Na página Detalhes da tabela, na guia Configurações adicionais e revise as configurações de ajuste de escala automático da tabela.

    Página de detalhes da tabela do DynamoDB com as configurações do ajuste de escala automático. Analise o uso da capacidade provisionada e ajuste conforme a necessidade.

    Para índices, expanda a guia Capacidade de índice para revisar as configurações do ajuste de escala automático do índice.

    Seção Capacidade de índice do console do DynamoDB. Revise e gerencie as configurações de ajuste de escala automático para índices.

Se os valores de suas metas de utilização forem menores ou iguais a 50%, você deverá explorar as métricas de utilização da tabela para ver se elas estão subprovisionadas ou superprovisionadas.

Como lidar com cargas de trabalho com variação sazonal

Considere o seguinte cenário: sua aplicação está operando abaixo de um valor médio mínimo na maioria das vezes, mas a meta de utilização é baixa para que sua aplicação possa reagir rapidamente a eventos que acontecem em determinadas horas do dia e você tenha capacidade suficiente e evite ter controle de utilização. Esse cenário é comum quando você tem uma aplicação muito movimentada durante o horário normal de expediente (das 9h às 17h), mas funciona em um nível básico após o expediente. Como alguns usuários começarão a se conectar antes das 9h, a aplicação usa esse limite baixo para aumentar rapidamente a capacidade necessária durante os horários de pico.

Esse cenário pode ser parecido com:

  • Entre 17h e 9h, as unidades ConsumedWriteCapacity ficam entre 90 e 100

  • Os usuários começam a se conectar à aplicação antes das 9h e as unidades de capacidade aumentam consideravelmente (o valor máximo que você viu é 1,5 mil WCU)

  • Em média, o uso da sua aplicação varia entre 800 e 1.200 durante o horário comercial

Se o cenário anterior se aplicar a você, considere usar o Auto Scaling programado, em que sua tabela ainda pode ter uma regra de Auto Scaling de aplicações configurada, mas com uma utilização prevista menos agressiva que forneça somente a capacidade extra nos intervalos específicos necessários.

Você pode usar a AWS CLI para executar as etapas a seguir para criar uma regra de Auto Scaling programado que será executada com base na hora do dia e no dia da semana.

  1. Registre sua tabela do DynamoDB ou GSI como destino escalável no Application Auto Scaling. Um destino escalável é um recurso cuja escala pode ser aumentada ou reduzida horizontalmente pelo Application Auto Scaling.

    aws application-autoscaling register-scalable-target \ --service-namespace dynamodb \ --scalable-dimension dynamodb:table:WriteCapacityUnits \ --resource-id table/<table-name> \ --min-capacity 90 \ --max-capacity 1500
  2. Configure ações programadas de acordo com seus requisitos.

    Precisaremos de duas regras para cobrir o cenário: uma para aumentar e outra para reduzir a escala verticalmente. A primeira regra para aumentar a escala verticalmente da ação programada:

    aws application-autoscaling put-scheduled-action \ --service-namespace dynamodb \ --scalable-dimension dynamodb:table:WriteCapacityUnits \ --resource-id table/<table-name> \ --scheduled-action-name my-8-5-scheduled-action \ --scalable-target-action MinCapacity=800,MaxCapacity=1500 \ --schedule "cron(45 8 ? * MON-FRI *)" \ --timezone "Australia/Brisbane"

    A segunda regra para reduzir a escala verticalmente da ação programada:

    aws application-autoscaling put-scheduled-action \ --service-namespace dynamodb \ --scalable-dimension dynamodb:table:WriteCapacityUnits \ --resource-id table/<table-name> \ --scheduled-action-name my-5-8-scheduled-down-action \ --scalable-target-action MinCapacity=90,MaxCapacity=1500 \ --schedule "cron(15 17 ? * MON-FRI *)" \ --timezone "Australia/Brisbane"
  3. Execute o seguinte comando para validar que ambas as regras foram ativadas:

    aws application-autoscaling describe-scheduled-actions --service-namespace dynamodb

    Você deve obter um resultado parecido com este:

    { "ScheduledActions": [ { "ScheduledActionName": "my-5-8-scheduled-down-action", "ScheduledActionARN": "arn:aws:autoscaling:<region>:<account>:scheduledAction:<uuid>:resource/dynamodb/table/<table-name>:scheduledActionName/my-5-8-scheduled-down-action", "ServiceNamespace": "dynamodb", "Schedule": "cron(15 17 ? * MON-FRI *)", "Timezone": "Australia/Brisbane", "ResourceId": "table/<table-name>", "ScalableDimension": "dynamodb:table:WriteCapacityUnits", "ScalableTargetAction": { "MinCapacity": 90, "MaxCapacity": 1500 }, "CreationTime": "2022-03-15T17:30:25.100000+10:00" }, { "ScheduledActionName": "my-8-5-scheduled-action", "ScheduledActionARN": "arn:aws:autoscaling:<region>:<account>:scheduledAction:<uuid>:resource/dynamodb/table/<table-name>:scheduledActionName/my-8-5-scheduled-action", "ServiceNamespace": "dynamodb", "Schedule": "cron(45 8 ? * MON-FRI *)", "Timezone": "Australia/Brisbane", "ResourceId": "table/<table-name>", "ScalableDimension": "dynamodb:table:WriteCapacityUnits", "ScalableTargetAction": { "MinCapacity": 800, "MaxCapacity": 1500 }, "CreationTime": "2022-03-15T17:28:57.816000+10:00" } ] }

A figura a seguir mostra um exemplo de workload que sempre mantém a utilização prevista de 70%. Observe como as regras de Auto Scaling ainda se aplicam e o throughput não será reduzido.

O throughput de uma tabela com 70% de utilização pretendida, mesmo à medida que as regras do ajuste de escala automático mudam a capacidade.

Ao ampliar, podemos ver que houve um pico na aplicação que acionou o limite de Auto Scaling de 70%, forçando o Auto Scaling a entrar em ação e fornecer a capacidade extra necessária para a tabela. A ação programada de Auto Scaling afetará os valores máximo e mínimo, e é sua responsabilidade configurá-los.

Aumento no throughput de uma tabela do DynamoDB que inicia o ajuste de escala automático para fornecer a capacidade adicional necessária.
Configuração do ajuste de escala automático da tabela do DynamoDB: utilização pretendida e valores de capacidade mínima e máxima.

Como lidar com cargas de trabalho com pico com padrões desconhecidos

Nesse cenário, a aplicação usa uma utilização prevista muito baixa porque você ainda não conhece os padrões da aplicação e quer garantir que sua workload não tenha controle de utilização.

Em vez disso, considere usar o modo de capacidade sob demanda. As tabelas sob demanda são perfeitas para cargas de trabalho com pico nas quais você não conhece os padrões de tráfego. Com o modo de capacidade sob demanda, você paga por solicitação pelas leituras e gravações de dados que sua aplicação executa em suas tabelas. Não é necessário especificar o throughput de leitura e gravação que você espera que sua aplicação execute, pois o DynamoDB acomoda instantaneamente o crescimento e redução das workloads.

Como lidar com workloads com aplicações vinculadas

Nesse cenário, a aplicação depende de outros sistemas, como cenários de processamento em lote, nos quais você pode ter grandes picos de tráfego de acordo com os eventos na lógica da aplicação.

Considere desenvolver uma lógica personalizada de Auto Scaling que reaja aos eventos em que você pode aumentar a capacidade da tabela e dos TargetValues dependendo de suas necessidades específicas. Você pode se beneficiar do Amazon EventBridge e usar uma combinação de serviços da AWS, como o Lambda e o Step Functions, para reagir às necessidades específicas da sua aplicação.