Avaliar as configurações do ajuste de escala automático de uma tabela do DynamoDB
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.
Tópicos
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:
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.
-
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
-
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"
-
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.
Ao ampliar, podemos ver que houve um pico na aplicação que acionou o limite do ajuste de escala automático de 70%, forçando o ajuste de escala automático 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.
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.